Google ปฏิทินถูกจัดการผ่านฟังก์ชันเครื่องคิดเลข: แชทบอทสื่อสารกับ Google API โดยใช้บัญชีบริการของคุณ ไม่จำเป็นต้องกำหนดค่าคำขอ HTTP แยกต่างหาก

ข้อกำหนด

  1. โปรเจกต์ Google Cloud ที่เปิดใช้งาน Google Calendar API
  2. บัญชีบริการสำหรับโปรเจกต์นี้และคีย์ในรูปแบบ JSON
  3. ปฏิทินที่บัญชีบริการมีสิทธิ์แก้ไขเหตุการณ์

วิธีสร้างบัญชีบริการและรับคีย์

  1. ไปที่ Google Cloud Console และสร้างโปรเจกต์ใหม่

  1. ไปที่ APIs & ServicesLibrary ค้นหา Google Calendar API แล้วคลิก Enable หากไม่มีขั้นตอนนี้ คำขอทั้งหมดจะส่งคืนข้อผิดพลาด

  1. ไปที่ IAM & AdminService Accounts สร้างบัญชีบริการและกำหนดบทบาท Owner ให้

  1. เปิดบัญชีบริการที่คุณสร้าง → แท็บ KeysAdd keyCreate new key → เลือก JSON

ไฟล์คีย์จะถูกดาวน์โหลดไปยังคอมพิวเตอร์ของคุณ

  1. บันทึกที่อยู่บัญชีบริการ — ฟิลด์ client_email ในไฟล์ที่ดาวน์โหลด เช่น [email protected] คุณจะต้องใช้เพื่อให้สิทธิ์บัญชีบริการเข้าถึงปฏิทิน

จะเก็บคีย์ไว้ที่ไหน: ตัวแปร calendar_json_keys

  1. อัปโหลดไฟล์ JSON ที่ดาวน์โหลดไปยังที่เก็บไฟล์ของโปรเจกต์ที่คุณทำงานกับ Google ปฏิทิน จากนั้นคลิกขวาที่ไฟล์และคัดลอกลิงก์

  1. ใน Project Constants เพิ่มตัวแปรชื่อ calendar_json_keys และตั้งค่าเป็นอาร์เรย์ของคีย์:

กล่าวอีกนัยหนึ่ง ให้วางลิงก์ที่คุณคัดลอกสำหรับไฟล์คีย์ที่อัปโหลดไปยังโปรเจกต์ของคุณ

["https://files.mavibot.ai/uploads/file_item/file/your_project_id/your_file_name.json"]

คุณสามารถระบุหลายคีย์ได้ เช่น หากคุณใช้โปรเจกต์ที่แตกต่างกัน สำหรับแต่ละคำขอ ตัวสร้างจะใช้หนึ่งในนั้น:

[
  "https://files.mavibot.ai/uploads/file_item/file/your_project_id/your_file_name.json",
  "https://files.mavibot.ai/uploads/file_item/file/your_project_id/your_file_name.json"
]

แทนที่จะใช้ลิงก์ คุณสามารถระบุคีย์ทั้งหมดโดยตรงจากไฟล์ที่อัปโหลด:

[
  {
    "type": "service_account",
    "project_id": "my-project",
    "private_key": "-----BEGIN PRIVATE KEY-----...",
    "client_email": "[email protected]",
    "..."
  }
]

วิธีให้สิทธิ์บัญชีบริการเข้าถึงปฏิทิน

เปิดการตั้งค่าของปฏิทินที่ต้องการ → Share with people or groupsAdd people and groups → ป้อน client_email ของบัญชีบริการและให้สิทธิ์ Make changes to events

หากไม่มีสิทธิ์นี้ Google จะส่งคืน Not Found แม้ว่าปฏิทินจะมีอยู่ก็ตาม

ปฏิทินที่สร้างด้วย gcal_create_calendar จะพร้อมใช้งานสำหรับบัญชีบริการทันที ดังนั้นคุณไม่จำเป็นต้องแชร์แยกต่างหาก

วิธีค้นหา ID ปฏิทิน

เปิดการตั้งค่าปฏิทิน → Integrate calendarCalendar ID

ID มีลักษณะประมาณนี้:

[email protected]

คุณยังสามารถรับ ID ของปฏิทินทั้งหมดที่มีได้โดยใช้:

gcal_calendars_list()

วิธีเรียกใช้ฟังก์ชัน รูปแบบวันที่ และเขตเวลา

ฟังก์ชัน รวมถึงฟังก์ชันทั้งหมดที่ระบุด้านล่าง จะถูกป้อนในเครื่องคิดเลขในตัวสร้างแชทบอท

สะดวกในการบันทึกผลลัพธ์ลงในตัวแปรโดยตรง:

event = gcal_add_event("[email protected]", "Consultation", "20.08.2026 14:00", "20.08.2026 15:00")

แต่ละฟังก์ชันส่งคืนการตอบสนองของ Google API ในรูปแบบ JSON หากเกิดข้อผิดพลาด การตอบสนองจะมีลักษณะดังนี้:

{"status": false, "err": "error description"}

คุณสามารถดึงข้อมูลเฉพาะจากฟิลด์การตอบสนองได้โดยใช้ฟังก์ชัน get

ตัวอย่างเช่น:

get(event, 'id')

รูปแบบค่า

ค่า รูปแบบ ตัวอย่าง
วันที่และเวลา dd.mm.yyyy HH:MM 20.08.2026 14:00
วันที่ (เหตุการณ์ทั้งวัน) dd.mm.yyyy 20.08.2026
เขตเวลา ตัวระบุ IANA Europe/Moscow, Europe/Istanbul

หากไม่ระบุเขตเวลา จะใช้เขตเวลาที่กำหนดค่าไว้ในการตั้งค่าโปรเจกต์


ปฏิทิน

วิธีสร้างปฏิทิน

ใช้ฟังก์ชันต่อไปนี้:

gcal_create_calendar(name, description=null, time_zone=null, location=null, owner_email=null)

พารามิเตอร์:

  • name — ชื่อปฏิทิน;
  • description — คำอธิบายปฏิทิน;
  • time_zone — เขตเวลา;
  • location — สถานที่;
  • owner_email — ที่อยู่อีเมลของบัญชี Google ที่จะได้รับสิทธิ์เจ้าของ บัญชีบริการจะยังคงเข้าถึงปฏิทินได้

ตัวอย่าง:

calendar = gcal_create_calendar("Consultation Bookings", "Bot calendar", "Europe/Moscow", "", "[email protected]")

ฟังก์ชันส่งคืนข้อมูลปฏิทินที่สร้างขึ้น:

{
  "kind": "calendar#calendar",
  "id": "[email protected]",
  "summary": "Consultation Bookings",
  "timeZone": "Europe/Moscow"
}

บันทึก ID จากฟิลด์ id ลงในตัวแปรโปรเจกต์ — จำเป็นสำหรับฟังก์ชันอื่นๆ ทั้งหมด

วิธีรับข้อมูลปฏิทิน

gcal_get_calendar(calendar_id)

ฟังก์ชันส่งคืนชื่อปฏิทิน คำอธิบาย เขตเวลา และที่อยู่

วิธีรับรายการปฏิทินของบัญชีบริการ

gcal_calendars_list()

ฟังก์ชันส่งคืนปฏิทินทั้งหมดที่บัญชีบริการเข้าถึงได้ พร้อมด้วย ID

วิธีลบปฏิทิน

gcal_remove_calendar(calendar_id)

หากลบปฏิทินสำเร็จ ฟังก์ชันจะส่งคืน:

{"status": true}

เหตุการณ์

วิธีเพิ่มเหตุการณ์อย่างรวดเร็ว

ใช้ฟังก์ชันต่อไปนี้:

gcal_quick_add_event(calendar_id, event_name)

Google จะแยกวันที่และเวลาจากข้อความโดยอัตโนมัติ

ตัวอย่าง:

event = gcal_quick_add_event("[email protected]", "Meeting with John tomorrow at 15:00")

วิธีเพิ่มเหตุการณ์

ใช้ฟังก์ชันต่อไปนี้:

gcal_add_event(calendar_id, event_name, start_datetime=null, end_datetime=null, event_description=null, location=null, time_zone=null, extra_params=null)

พารามิเตอร์:

  • calendar_id — ID ปฏิทิน;
  • event_name — ชื่อเหตุการณ์;
  • start_datetime — วันที่และเวลาเริ่มต้นของเหตุการณ์;
  • end_datetime — วันที่และเวลาสิ้นสุดของเหตุการณ์;
  • event_description — คำอธิบายเหตุการณ์;
  • location — สถานที่จัดเหตุการณ์;
  • time_zone — เขตเวลา;
  • extra_params — พารามิเตอร์เพิ่มเติมของเหตุการณ์ในรูปแบบ JSON

ตัวอย่าง:

event = gcal_add_event("[email protected]", "Consultation #{name}", "20.08.2026 14:00", "20.08.2026 15:00", "Client phone: #{phone}", "Zoom", "Europe/Moscow", '{"popup_minutes": 30, "email_minutes": 60}')

พารามิเตอร์เพิ่มเติม extra_params

extra_params เป็นออบเจกต์ JSON ที่มีพารามิเตอร์เสริม:

พารามิเตอร์ คำอธิบาย
email_minutes ส่งการแจ้งเตือนทางอีเมลตามจำนวนนาทีที่ระบุก่อนเหตุการณ์
popup_minutes แสดงการแจ้งเตือนแบบป๊อปอัปตามจำนวนนาทีที่ระบุก่อนเหตุการณ์
start_date วันที่เริ่มต้นสำหรับเหตุการณ์ทั้งวัน
end_date วันที่สิ้นสุดสำหรับเหตุการณ์ทั้งวัน
transparency opaque — เวลาถูกทำเครื่องหมายว่าไม่ว่าง; transparent — เวลายังคงว่าง
recurrence_days วันในสัปดาห์สำหรับการเกิดซ้ำรายสัปดาห์: MO, TU, WE, TH, FR, SA, SU คั่นด้วยเครื่องหมายจุลภาค
recurrence_until วันที่จนกว่าเหตุการณ์จะเกิดซ้ำ เช่น 20261231T000000Z
recurrence_count จำนวนครั้งที่เกิดซ้ำแทนวันที่สิ้นสุด

ค่าเริ่มต้นคือ:

transparency = opaque

ซึ่งหมายความว่าเวลาของเหตุการณ์ถือว่าไม่ว่าง

เพื่อให้เวลาของเหตุการณ์ยังคงว่าง:

{"transparency": "transparent"}

เหตุการณ์ทั้งวัน

สำหรับเหตุการณ์ทั้งวัน ให้ส่ง start_date และ end_date ผ่าน extra_params แทน start_datetime และ end_datetime

ตัวอย่างเหตุการณ์ทั้งวันที่เกิดซ้ำทุกวันจันทร์และพุธ 10 ครั้ง:

event = gcal_add_event("[email protected]", "Webinar", null, null, "Weekly webinar", "", null, '{"start_date": "01.09.2026", "end_date": "02.09.2026", "recurrence_days": "MO,WE", "recurrence_count": 10}')

สำหรับเหตุการณ์ทั้งวัน Google ถือว่าวันที่สิ้นสุดเป็นแบบไม่รวม ในการสร้างเหตุการณ์ที่ครอบคลุมเฉพาะ 01.09.2026 ให้ระบุ 02.09.2026 เป็น end_date

การตอบสนองเมื่อสร้างเหตุการณ์

ฟังก์ชันส่งคืนเหตุการณ์ที่สร้างขึ้น:

{
  "kind": "calendar#event",
  "id": "7b1k2m3n4o5p",
  "status": "confirmed",
  "htmlLink": "https://www.google.com/calendar/event?eid=..."
}

บันทึก id ของเหตุการณ์ลงในตัวแปรไคลเอนต์

ตัวอย่างเช่น:

event_id = get(event, 'id')

คุณจะต้องใช้ ID ในภายหลังเพื่ออัปเดต ย้าย หรือลบเหตุการณ์


วิธีอัปเดตเหตุการณ์

ใช้ฟังก์ชันต่อไปนี้:

gcal_update_event(calendar_id, event_id, event_name=null, start_datetime=null, end_datetime=null, event_description=null, location=null, time_zone=null, extra_params=null)

ส่งเฉพาะฟิลด์ที่คุณต้องการเปลี่ยนแปลง ฟิลด์อื่นๆ ทั้งหมดจะยังคงไม่เปลี่ยนแปลง

ตัวอย่างเช่น หากต้องการเลื่อนเหตุการณ์ที่มีอยู่ไปเป็น 21.08.2026 ตั้งแต่ 16:00 ถึง 17:00:

event = gcal_update_event("[email protected]", "#{event_id}", null, "21.08.2026 16:00", "21.08.2026 17:00")

โครงสร้างของ extra_params เหมือนกับ gcal_add_event

การแจ้งเตือนจะถูกอัปเดตตามประเภท

ตัวอย่างเช่น หากคุณส่งเพียง:

{"popup_minutes": 30}

การแจ้งเตือนแบบป๊อปอัปจะถูกแทนที่ ในขณะที่การแจ้งเตือนทางอีเมลที่มีอยู่จะยังคงไม่เปลี่ยนแปลง


วิธีรับรายการเหตุการณ์

ใช้ฟังก์ชันต่อไปนี้:

gcal_get_event_list(calendar_id, start_date=null, end_date=null)

พารามิเตอร์:

  • calendar_id — ID ปฏิทิน;
  • start_date — จุดเริ่มต้นของช่วงเวลาในรูปแบบ dd.mm.yyyy;
  • end_date — จุดสิ้นสุดของช่วงเวลาในรูปแบบ dd.mm.yyyy

ตัวอย่าง:

events = gcal_get_event_list("[email protected]", "20.08.2026", "27.08.2026")

หากไม่ระบุวันที่ ฟังก์ชันจะส่งคืนเหตุการณ์สำหรับวันปัจจุบัน:

events = gcal_get_event_list("[email protected]")

อีเวนต์จะถูกส่งกลับโดยเรียงตามเวลาเริ่มต้น

อีเวนต์ที่เกิดซ้ำจะถูกส่งกลับเป็นรายการแยกกัน


วิธีรับข้อมูลอีเวนต์

ใช้ฟังก์ชันต่อไปนี้:

gcal_get_event(calendar_id, event_id)

ฟังก์ชันนี้จะส่งคืนข้อมูลอีเวนต์ทั้งหมด รวมถึง:

  • ชื่อ;
  • คำอธิบาย;
  • วันที่และเวลา;
  • สถานที่;
  • ผู้เข้าร่วม;
  • การแจ้งเตือน;
  • พารามิเตอร์อื่นๆ ของอีเวนต์

ตัวอย่าง:

event = gcal_get_event("[email protected]", "#{event_id}")

วิธีย้ายอีเวนต์ไปยังปฏิทินอื่น

ใช้ฟังก์ชันต่อไปนี้:

gcal_move_event(calendar_id, event_id, destination_calendar_id)

โดยที่:

  • calendar_id — ID ของปฏิทินปัจจุบัน;
  • event_id — ID ของอีเวนต์;
  • destination_calendar_id — ID ของปฏิทินปลายทางที่ต้องการย้ายอีเวนต์ไป

ตัวอย่าง:

event = gcal_move_event("[email protected]", "#{event_id}", "[email protected]")

วิธีลบอีเวนต์

ใช้ฟังก์ชันต่อไปนี้:

gcal_remove_event(calendar_id, event_id)

ตัวอย่าง:

result = gcal_remove_event("[email protected]", "#{event_id}")

หากลบอีเวนต์สำเร็จ ฟังก์ชันจะส่งกลับ:

{"status": true}

ผู้เข้าร่วมอีเวนต์

วิธีเพิ่มผู้เข้าร่วม

ใช้ฟังก์ชันต่อไปนี้:

gcal_add_client(calendar_id, event_id, client_email, name=null, comment=null)

พารามิเตอร์:

  • calendar_id — ID ของปฏิทิน;
  • event_id — ID ของอีเวนต์;
  • client_email — ที่อยู่อีเมลของผู้เข้าร่วม;
  • name — ชื่อที่จะแสดงในปฏิทิน;
  • comment — หมายเหตุสำหรับผู้เข้าร่วม

ตัวอย่าง:

event = gcal_add_client("[email protected]", "#{event_id}", "#{email}", "#{name}", "จองผ่านบอท")

หากผู้เข้าร่วมนี้ถูกเพิ่มในอีเวนต์แล้ว ฟังก์ชันจะส่งกลับข้อผิดพลาด:

{"status": false, "err": "attendee already exists"}

วิธีลบผู้เข้าร่วม

ใช้ฟังก์ชันต่อไปนี้:

gcal_remove_client(calendar_id, event_id, client_email)

พารามิเตอร์:

  • calendar_id — ID ของปฏิทิน;
  • event_id — ID ของอีเวนต์;
  • client_email — ที่อยู่อีเมลของผู้เข้าร่วมที่ต้องการลบ

ตัวอย่าง:

event = gcal_remove_client("[email protected]", "#{event_id}", "#{email}")

หากผู้เข้าร่วมที่ระบุไม่อยู่ในอีเวนต์ ฟังก์ชันจะส่งกลับ:

{"status": false, "err": "attendee not found"}

ข้อผิดพลาดที่อาจเกิดขึ้น

หากเกิดข้อผิดพลาด ฟังก์ชันจะส่งกลับออบเจกต์ในรูปแบบต่อไปนี้:

{
  "status": false,
  "err": "คำอธิบายข้อผิดพลาด"
}

ข้อผิดพลาดทั่วไป:

การตอบสนอง สาเหตุ
Not Found ปฏิทินไม่ได้ถูกแชร์กับบัญชีบริการ หรือระบุ calendar_id ไม่ถูกต้อง
Google Calendar API has not been used in project ... or it is disabled เปิดใช้ Google Calendar API ไม่ได้ในโปรเจกต์ Google Cloud
The key to access the calendar was not found in the passed link ลิงก์ใน calendar_json_keys ไม่ส่งคืนไฟล์คีย์
wrong datetime "...", expected format is dd.mm.yyyy HH:MM ระบุวันที่และเวลาในรูปแบบที่ไม่ถูกต้อง
wrong date "...", expected format is dd.mm.yyyy ระบุวันที่ในรูปแบบที่ไม่ถูกต้อง
Работает только на тарифах Бизнес и Инфобиз โปรเจกต์ไม่มีสมาชิกที่ใช้งานอยู่ซึ่งรวมการเข้าถึงฟีเจอร์นี้

ข้อผิดพลาด Not Found

หาก Google ส่งกลับ:

Not Found

ให้ตรวจสอบสิ่งต่อไปนี้:

  1. ตรวจสอบว่า calendar_id ถูกต้อง
  2. ตรวจสอบว่า client_email ของบัญชีบริการถูกเพิ่มในการตั้งค่าปฏิทินแล้ว
  3. ตรวจสอบว่าบัญชีบริการมีสิทธิ์ Make changes to events

แม้ว่าปฏิทินจะมีอยู่ Google อาจส่งกลับ Not Found หากบัญชีบริการไม่มีการเข้าถึง

Google Calendar API ไม่ได้เปิดใช้

ข้อผิดพลาดมีลักษณะประมาณนี้:

Google Calendar API has not been used in project ... or it is disabled

เปิดโปรเจกต์ของคุณใน Google Cloud และเปิดใช้:

APIs & Services → Library → Google Calendar API → Enable

หลังจากเปิดใช้ API แล้ว ให้ลองส่งคำขออีกครั้ง

ไม่พบคีย์บัญชีบริการ

ข้อผิดพลาด:

The key to access the calendar was not found in the passed link

ตรวจสอบค่าของ:

calendar_json_keys

หากคุณใช้ลิงก์ไฟล์ ลิงก์นั้นต้องส่งคืนไฟล์ JSON ที่มีคีย์ของบัญชีบริการโดยตรง

ตัวอย่าง:

["https://files.salebot.pro/xxxxxxxx/key.json"]

คุณยังสามารถระบุคีย์โดยตรงใน calendar_json_keys เป็นออบเจกต์ JSON ได้

รูปแบบวันที่และเวลาไม่ถูกต้อง

ข้อผิดพลาด:

wrong datetime "...", expected format is dd.mm.yyyy HH:MM

รูปแบบที่ถูกต้อง:

dd.mm.yyyy HH:MM

ตัวอย่าง:

20.08.2026 14:00

ตัวอย่างที่ไม่ถูกต้อง:

2026-08-20 14:00
20/08/2026 14:00
20.08.2026

หากฟังก์ชันคาดหวังทั้งวันที่และเวลา คุณต้องระบุวันที่พร้อมกับชั่วโมงและนาที

รูปแบบวันที่ไม่ถูกต้อง

ข้อผิดพลาด:

wrong date "...", expected format is dd.mm.yyyy

รูปแบบที่ถูกต้อง:

dd.mm.yyyy

ตัวอย่าง:

20.08.2026

ไม่มีแผนการสมัครสมาชิกที่เหมาะสม

ข้อผิดพลาด:

Работает только на тарифах Бизнес и Инфобиз

หมายความว่าโปรเจกต์ไม่มีสมาชิกที่ใช้งานอยู่ซึ่งอนุญาตให้ใช้ฟังก์ชัน Google Calendar


ตัวอย่างอย่างรวดเร็ว

สร้างอีเวนต์และบันทึก ID:

event = gcal_add_event("[email protected]", "การปรึกษา #{name}", "20.08.2026 14:00", "20.08.2026 15:00", "โทรศัพท์ลูกค้า: #{phone}", "Zoom", "Europe/Moscow")

event_id = get(event, 'id')

เพิ่มลูกค้าในอีเวนต์ที่สร้าง:

event = gcal_add_client("[email protected]", "#{event_id}", "#{email}", "#{name}", "จองผ่านบอท")

หากลูกค้าต้องการเลื่อนเวลา:

event = gcal_update_event("[email protected]", "#{event_id}", null, "21.08.2026 16:00", "21.08.2026 17:00")

หากลูกค้ายกเลิกการจอง:

result = gcal_remove_event("[email protected]", "#{event_id}")

ข้อผิดพลาดของ Google API จะถูกส่งกลับตามเดิมในฟิลด์ err ข้อความข้อผิดพลาดช่วยระบุสิ่งที่ขาดหายไป: การเข้าถึงปฏิทิน, การเปิดใช้ API, คีย์ที่ถูกต้อง, รูปแบบวันที่ที่ถูกต้อง หรืออีเวนต์ที่มีอยู่