Takvim Etkinliği Oluşturma ve Sorgulama
Google Calendar API: etkinlikleri listeleme, toplantılar oluşturma ve hatırlatıcı ayarlama.
Takvim Etkinliği Oluşturma ve Sorgulama, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Agents öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Agents kursu toplamda 4 dersten oluşur.
Google Calendar API'ye Genel Bakış
Google Calendar API, ajanların takvim etkinliklerini okumasına, oluşturmasına, güncellemesine ve silmesine olanak tanır. Gmail ile aynı Google OAuth kimlik doğrulamasını kullanır. Birincil kaynak Olay nesnesidir ve etkinlikler bir Takvim'e aittir. 'primary' takvim kimliği, kimliği doğrulanmış kullanıcının ana takvimini belirtir.
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 addressYaklaşan Etkinlikleri Listeleme
Etkinlikleri almak için service.events().list() kullanın. timeMin ve timeMax parametreleri zaman aralığına göre filtreleme yapar. Her zaman saat dilimi farkı içeren RFC 3339 tarih-saat dizelerini kullanın. Yinelenen etkinlikleri tek tek örneklere açmak için singleEvents=True değerini ayarlayın.
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 eventsEtkinlik Başlangıç ve Bitiş Zamanlarını Ayrıştırma
Takvim etkinliklerinde iki tür zaman bulunur: normal etkinlikler için dateTime (saat dilimi içeren belirli bir zaman) ve tüm gün süren etkinlikler için date (yalnızca tarih, saat yok). Ayrıştırmadan önce hangi alanın mevcut olduğunu her zaman kontrol edin.
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)})')Basit Bir Etkinlik Oluşturma
Yeni bir etkinlik oluşturmak için service.events().insert() kullanın. En az gereken alanlar summary (başlık), start ve end alanlarıdır. Zamanlar, saat dilimi içeren RFC 3339 biçiminde olmalıdır. Başlangıç ve bitişteki timeZone alanı, saat dilimi adını belirtir.
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')
Etkinliklere Katılımcı Ekleme
Bir etkinliğe katılımcı eklemek için e-posta adreslerini içeren bir attendees listesi ekleyin. Tüm katılımcılara Google Calendar davetlerini otomatik olarak göndermek için sendUpdates='all' değerini ayarlayın. Yalnızca harici konukları bilgilendirmek için 'externalOnly' kullanın.
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"]]}')
Etkinliklere Hatırlatıcı Ekleme
Etkinliklerde, etkinlikten önce gönderilen bildirimler olan hatırlatıcılar bulunabilir. Tarayıcı veya uygulama bildirimleri için 'popup', e-posta hatırlatıcıları için 'email' kullanın. Takvim varsayılanlarını özel zamanlamalarla geçersiz kılmak için useDefault: False değerini ayarlayın.
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'])
Yinelenen Etkinlikler Oluşturma
Yinelenen etkinliklerde, iCalendar RFC 5545 ile aynı biçimi kullanan bir RRULE (yinelenme kuralı) dizisi kullanılır. Yaygın kurallar şunlardır: Pazartesi/Çarşamba/Cuma için FREQ=WEEKLY;BYDAY=MO,WE,FR, her ayın ilk Pazartesi günü için FREQ=MONTHLY;BYDAY=1MO.
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'
)Mevcut Bir Etkinliği Güncelleme
Tüm etkinliği değiştirmeden mevcut bir etkinliğin belirli alanlarını güncellemek için service.events().patch() kullanın. Etkinliğin tamamını değiştirmek için .update() kullanın. Her iki işlem için de özgün create veya list yanıtındaki etkinlik ID'si gerekir.
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')
Etkinlikleri Silme
Bir etkinliği iptal edip kaldırmak için service.events().delete() kullanın. sendUpdates='all' ayarı katılımcıları bilgilendirir. Yinelenen etkinliklerde, kullanılan etkinlik ID'sine bağlı olarak tek bir örneği veya serinin tamamını silebilirsiniz.
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 FalseBoş/Meşgul Uygunluğunu Kontrol Etme
Bir toplantı planlamadan önce freebusy API'sini kullanarak katılımcıların uygunluğunu kontrol edin. Bu API, belirli bir zaman aralığında bir takvim listesinin meşgul olduğu zaman bloklarını döndürür; bu da toplantı planlayan ajanlar için açık zaman aralıklarını bulmayı kolaylaştırır.
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 resultSorguyla Etkinlik Arama
Etkinlikleri metne göre aramak için events().list() içindeki q parametresini kullanın. Arama; başlık, açıklama, konum ve katılımcı adlarını kapsar. Sonuçları belirli bir dönemle sınırlamak için timeMin/timeMax ile birlikte kullanın.
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 eventsHızlı Kontrol: singleEvents Parametresi
Calendar API hakkındaki anlayışınızı sınayın.
Calendar API Özeti
Ajanlarınız artık Google Calendar'ı program aracılığıyla yönetebilir:
- Etkinlikleri listeleme:
events().list(timeMin=now, singleEvents=True, orderBy='startTime') - Etkinlik oluşturma:
events().insert(body={summary, start, end, attendees}) - Yinelenen etkinlikler:
recurrence: ['RRULE:FREQ=WEEKLY;BYDAY=MO']ekleyin - Hatırlatıcılar:
reminders.overridesilemethod: popup/emailveminuteskullanın - Güncelleme: kısmi güncellemeler için
events().patch(); katılımcıları bilgilendirmek içinsendUpdates='all' - Boş/meşgul durumu: planlama öncesinde uygunluğu kontrol etmek için
freebusy().query()
Sıkça Sorulan Sorular
“Takvim Etkinliği Oluşturma ve Sorgulama” dersi ücretsiz mi?
Evet — “Takvim Etkinliği Oluşturma ve Sorgulama” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Agents kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Agents kursu toplamda 4 dersten oluşur.
“Takvim Etkinliği Oluşturma ve Sorgulama” dersinde ne öğreneceğim?
Google Calendar API: etkinlikleri listeleme, toplantılar oluşturma ve hatırlatıcı ayarlama. AI Agents ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
AI Agents öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te AI Agents, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Takvim Etkinliği Oluşturma ve Sorgulama” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu AI Agents dersinde kod yazıp çalıştırabilir miyim?
Evet. Her AI Agents dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- API Üzerinden Gmail'e Bağlanma
- E-postaları Programlı Olarak Okuma ve Gönderme
- Takvim Etkinliği Oluşturma ve Sorgulama
- Basit Bir E-posta Asistanı Aracısı Oluşturma