Membuat dan Menanyakan Acara Kalender
Google Calendar API: mencantumkan acara, membuat rapat, dan mengatur pengingat.
Membuat dan Menanyakan Acara Kalender adalah pelajaran AI Agents gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Agents, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Agents mencakup 4 pelajaran total.
Ikhtisar Google Calendar API
Google Calendar API memungkinkan agen membaca, membuat, memperbarui, dan menghapus acara kalender. API ini menggunakan autentikasi Google OAuth yang sama seperti Gmail. Sumber daya utamanya adalah objek Acara, dan acara merupakan bagian dari sebuah Kalender. ID kalender 'primary' merujuk pada kalender utama pengguna yang telah diautentikasi.
from googleapiclient.discovery import build
# Build calendar service (same credentials as Gmail)
calendar = build(
'calendar', 'v3',
credentials=creds,
cache_discovery=False
)
# Get a list of the user's calendars
cal_list = calendar.calendarList().list().execute()
for cal in cal_list.get('items', []):
print(f'{cal["summary"]}: {cal["id"]}')
# Primary calendar ID is the user's email addressMenampilkan Acara Mendatang
Gunakan service.events().list() untuk mengambil acara. Parameter timeMin dan timeMax menyaring berdasarkan rentang waktu. Selalu gunakan string datetime RFC 3339 dengan offset zona waktu. Tetapkan singleEvents=True untuk menguraikan acara berulang menjadi setiap instansinya.
import datetime
import pytz
def get_upcoming_events(service, calendar_id='primary', max_results=10):
now = datetime.datetime.now(pytz.utc)
time_min = now.isoformat() # RFC 3339 format
time_max = (now + datetime.timedelta(days=7)).isoformat()
events_result = service.events().list(
calendarId=calendar_id,
timeMin=time_min,
timeMax=time_max,
maxResults=max_results,
singleEvents=True, # expand recurring events
orderBy='startTime'
).execute()
events = events_result.get('items', [])
for event in events:
start = event['start'].get('dateTime', event['start'].get('date'))
print(f'{start}: {event["summary"]}')
return eventsMengurai Waktu Mulai dan Selesai Acara
Acara kalender memiliki dua jenis waktu: dateTime (waktu tertentu dengan zona waktu) untuk acara biasa dan date (hanya tanggal, tanpa waktu) untuk acara sepanjang hari. Selalu periksa bidang mana yang tersedia sebelum mengurainya.
from datetime import datetime
import re
def parse_event_time(time_dict):
if 'dateTime' in time_dict:
# Parse RFC 3339 datetime: '2026-05-29T14:00:00+03:00'
dt_str = time_dict['dateTime']
# Python 3.7+ fromisoformat handles this
return datetime.fromisoformat(dt_str), False # not all-day
else:
# All-day event: '2026-05-29'
date_str = time_dict['date']
return datetime.strptime(date_str, '%Y-%m-%d'), True # all-day
for event in events:
start_dt, is_all_day = parse_event_time(event['start'])
end_dt, _ = parse_event_time(event['end'])
duration = end_dt - start_dt if not is_all_day else None
print(f'{event["summary"]}: {start_dt.strftime("%H:%M")} '
f'({"all-day" if is_all_day else str(duration)})')Membuat Acara Sederhana
Gunakan service.events().insert() untuk membuat acara baru. Bidang minimum yang wajib diisi adalah summary (judul), start, dan end. Waktu harus menggunakan format RFC 3339 dengan zona waktu. Bidang timeZone pada start/end menentukan nama zona waktunya.
def create_event(service, title, start_datetime, end_datetime,
description='', timezone='UTC', calendar_id='primary'):
event = {
'summary': title,
'description': description,
'start': {
'dateTime': start_datetime.isoformat(),
'timeZone': timezone
},
'end': {
'dateTime': end_datetime.isoformat(),
'timeZone': timezone
}
}
created = service.events().insert(
calendarId=calendar_id,
body=event
).execute()
print(f'Event created: {created["summary"]}')
print(f'Event ID: {created["id"]}')
print(f'Link: {created["htmlLink"]}')
return created
# --- demo: minimal stand-in for the Calendar API's service object ---
import datetime
class _Exec:
def __init__(self, result):
self._result = result
def execute(self):
return self._result
class _FakeEvents:
def insert(self, calendarId, body):
return _Exec({**body, 'id': 'evt_123',
'htmlLink': 'https://calendar.google.com/event?eid=evt_123'})
class _FakeService:
def events(self):
return _FakeEvents()
service = _FakeService()
start = datetime.datetime(2026, 8, 10, 9, 0)
end = start + datetime.timedelta(hours=1)
create_event(service, 'Team Sync', start, end, description='Weekly sync')
Menambahkan Peserta ke Acara
Tambahkan peserta ke acara dengan menyertakan daftar attendees yang berisi alamat email. Tetapkan sendUpdates='all' untuk mengirim undangan Google Calendar kepada semua peserta secara otomatis. Gunakan 'externalOnly' untuk memberi tahu hanya tamu eksternal.
import datetime
def schedule_meeting(service, title, start_iso, duration_minutes,
attendees, description=''):
start = datetime.datetime.fromisoformat(start_iso)
end = start + datetime.timedelta(minutes=duration_minutes)
event = {
'summary': title,
'description': description,
'start': {'dateTime': start.isoformat(), 'timeZone': 'UTC'},
'end': {'dateTime': end.isoformat(), 'timeZone': 'UTC'},
'attendees': [
{'email': email} for email in attendees
],
'conferenceData': {
'createRequest': {'requestId': f'meet-{start.timestamp()}'}
} # creates a Google Meet link
}
created = service.events().insert(
calendarId='primary',
body=event,
sendUpdates='all', # send invites
conferenceDataVersion=1 # enable Meet link creation
).execute()
return created
# --- demo: minimal stand-in for the Calendar API's service object ---
class _Exec:
def __init__(self, result):
self._result = result
def execute(self):
return self._result
class _FakeEvents:
def insert(self, calendarId, body, sendUpdates=None, conferenceDataVersion=None):
return _Exec({**body, 'id': 'evt_456'})
class _FakeService:
def events(self):
return _FakeEvents()
service = _FakeService()
created = schedule_meeting(
service, 'Sprint Planning', '2026-08-11T10:00:00', 30,
attendees=['alice@example.com', 'bob@example.com']
)
print(f'Meeting scheduled: {created["summary"]}')
print(f'Attendees: {[a["email"] for a in created["attendees"]]}')
Menambahkan Pengingat ke Acara
Acara dapat memiliki pengingat—notifikasi yang dikirim sebelum acara berlangsung. Gunakan 'popup' untuk notifikasi di browser/aplikasi dan 'email' untuk pengingat melalui email. Tetapkan useDefault: False untuk mengganti setelan bawaan kalender dengan waktu khusus.
def create_event_with_reminders(service, title, start_iso, end_iso):
event = {
'summary': title,
'start': {'dateTime': start_iso, 'timeZone': 'UTC'},
'end': {'dateTime': end_iso, 'timeZone': 'UTC'},
'reminders': {
'useDefault': False,
'overrides': [
{'method': 'email', 'minutes': 24 * 60}, # 1 day before
{'method': 'popup', 'minutes': 30}, # 30 min before
{'method': 'popup', 'minutes': 10} # 10 min before
]
}
}
return service.events().insert(
calendarId='primary',
body=event
).execute()
# --- demo: minimal stand-in for the Calendar API's service object ---
class _Exec:
def __init__(self, result):
self._result = result
def execute(self):
return self._result
class _FakeEvents:
def insert(self, calendarId, body):
return _Exec({**body, 'id': 'evt_789'})
class _FakeService:
def events(self):
return _FakeEvents()
service = _FakeService()
created = create_event_with_reminders(
service, 'Deploy Review', '2026-08-12T15:00:00', '2026-08-12T15:30:00'
)
print(f'Event id: {created["id"]}')
print('Reminders:', created['reminders']['overrides'])
Membuat Acara Berulang
Acara berulang menggunakan string RRULE (aturan pengulangan)—format yang sama seperti iCalendar RFC 5545. Aturan umum: FREQ=WEEKLY;BYDAY=MO,WE,FR untuk Senin/Rabu/Jumat, dan FREQ=MONTHLY;BYDAY=1MO untuk Senin pertama setiap bulan.
def create_recurring_event(service, title, start_iso, end_iso,
rrule, timezone='UTC'):
event = {
'summary': title,
'start': {'dateTime': start_iso, 'timeZone': timezone},
'end': {'dateTime': end_iso, 'timeZone': timezone},
'recurrence': [
f'RRULE:{rrule}' # recurrence rule string
]
}
return service.events().insert(
calendarId='primary',
body=event
).execute()
# Weekly team standup every Monday at 9am for 30 min
create_recurring_event(
service=calendar_service,
title='Team Standup',
start_iso='2026-06-01T09:00:00',
end_iso='2026-06-01T09:30:00',
rrule='FREQ=WEEKLY;BYDAY=MO;COUNT=52', # 52 weeks
timezone='America/New_York'
)Memperbarui Acara yang Ada
Gunakan service.events().patch() untuk memperbarui bidang tertentu dari acara yang sudah ada tanpa mengganti seluruh acara. Gunakan .update() untuk mengganti seluruh isi acara. Keduanya memerlukan ID acara dari respons asli create atau list.
def reschedule_event(service, event_id, new_start_iso, new_end_iso,
timezone='UTC', calendar_id='primary'):
updated_fields = {
'start': {'dateTime': new_start_iso, 'timeZone': timezone},
'end': {'dateTime': new_end_iso, 'timeZone': timezone}
}
updated_event = service.events().patch(
calendarId=calendar_id,
eventId=event_id,
body=updated_fields,
sendUpdates='all' # notify attendees of the change
).execute()
print(f'Event rescheduled: {updated_event["summary"]}')
print(f'New start: {updated_event["start"]["dateTime"]}')
return updated_event
# --- demo: minimal stand-in for the Calendar API's service object ---
class _Exec:
def __init__(self, result):
self._result = result
def execute(self):
return self._result
class _FakeEvents:
def patch(self, calendarId, eventId, body, sendUpdates=None):
return _Exec({'summary': 'Team Sync', 'id': eventId, **body})
class _FakeService:
def events(self):
return _FakeEvents()
service = _FakeService()
reschedule_event(service, 'evt_123', '2026-08-13T09:00:00', '2026-08-13T10:00:00')
Menghapus Acara
Gunakan service.events().delete() untuk membatalkan dan menghapus acara. Menetapkan sendUpdates='all' akan memberi tahu para peserta. Untuk acara berulang, Anda dapat menghapus satu instansi atau seluruh rangkaian, bergantung pada ID acara yang digunakan.
from googleapiclient.errors import HttpError
def cancel_event(service, event_id, notify_attendees=True,
calendar_id='primary'):
try:
service.events().delete(
calendarId=calendar_id,
eventId=event_id,
sendUpdates='all' if notify_attendees else 'none'
).execute()
print(f'Event {event_id} cancelled')
return True
except HttpError as e:
if e.resp.status == 404:
print(f'Event {event_id} not found (already deleted?)')
elif e.resp.status == 403:
print('No permission to delete this event')
else:
print(f'Delete failed: {e.resp.status}')
return FalseMemeriksa Ketersediaan Bebas/Sibuk
Sebelum menjadwalkan rapat, periksa ketersediaan peserta menggunakan API freebusy. API ini mengembalikan blok waktu sibuk untuk sejumlah kalender dalam rentang waktu tertentu—sangat cocok untuk menemukan waktu kosong bagi agen penjadwalan.
import datetime
import pytz
def check_availability(service, attendees, duration_hours=1):
now = datetime.datetime.now(pytz.utc)
time_min = now.isoformat()
time_max = (now + datetime.timedelta(days=5)).isoformat()
body = {
'timeMin': time_min,
'timeMax': time_max,
'timeZone': 'UTC',
'items': [{'id': email} for email in attendees]
}
result = service.freebusy().query(body=body).execute()
for email in attendees:
busy_slots = result['calendars'].get(email, {}).get('busy', [])
print(f'{email}: {len(busy_slots)} busy slots in next 5 days')
for slot in busy_slots[:3]:
print(f' Busy: {slot["start"]} -> {slot["end"]}')
return resultMencari Acara berdasarkan Kueri
Gunakan parameter q dalam events().list() untuk mencari acara berdasarkan teks—pencarian mencakup judul, deskripsi, lokasi, dan nama peserta. Gabungkan dengan timeMin/timeMax untuk mempersempit hasil ke periode tertentu.
def search_events(service, query, days_back=30, days_forward=30,
calendar_id='primary'):
import datetime, pytz
now = datetime.datetime.now(pytz.utc)
result = service.events().list(
calendarId=calendar_id,
q=query,
timeMin=(now - datetime.timedelta(days=days_back)).isoformat(),
timeMax=(now + datetime.timedelta(days=days_forward)).isoformat(),
singleEvents=True,
orderBy='startTime',
maxResults=50
).execute()
events = result.get('items', [])
print(f'Found {len(events)} events matching "{query}"')
for event in events:
start = event['start'].get('dateTime', event['start'].get('date'))
print(f' {start}: {event["summary"]}')
return eventsCek Singkat: Parameter singleEvents
Uji pemahaman Anda tentang Calendar API.
Rangkuman Calendar API
Agen Anda kini dapat mengelola Google Calendar secara terprogram:
- Menampilkan acara:
events().list(timeMin=now, singleEvents=True, orderBy='startTime') - Membuat acara:
events().insert(body={summary, start, end, attendees}) - Acara berulang: tambahkan
recurrence: ['RRULE:FREQ=WEEKLY;BYDAY=MO'] - Pengingat: gunakan
reminders.overridesdenganmethod: popup/emaildanminutes - Memperbarui:
events().patch()untuk pembaruan sebagian;sendUpdates='all'untuk memberi tahu peserta - Bebas/sibuk:
freebusy().query()untuk memeriksa ketersediaan sebelum menjadwalkan
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Membuat dan Menanyakan Acara Kalender” gratis?
Ya — teks lengkap “Membuat dan Menanyakan Acara Kalender” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Agents, upgrade ke CoddyKit PRO. Kursus AI Agents mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Membuat dan Menanyakan Acara Kalender”?
Google Calendar API: mencantumkan acara, membuat rapat, dan mengatur pengingat. Kamu berlatih AI Agents dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Agents?
Tidak diperlukan pengalaman sebelumnya. AI Agents di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Membuat dan Menanyakan Acara Kalender” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Agents ini?
Ya. Setiap pelajaran AI Agents menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Menghubungkan ke Gmail melalui API
- Membaca dan Mengirim Email Secara Terprogram
- Membuat dan Menanyakan Acara Kalender
- Membangun Agen Asisten Email Sederhana