0Pricing
AI Agents · Ders

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 address

Yaklaş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 events

Etkinlik 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 False

Boş/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 result

Sorguyla 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 events

Hı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.overrides ile method: popup/email ve minutes kullanın
  • Güncelleme: kısmi güncellemeler için events().patch(); katılımcıları bilgilendirmek için sendUpdates='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

  1. API Üzerinden Gmail'e Bağlanma
  2. E-postaları Programlı Olarak Okuma ve Gönderme
  3. Takvim Etkinliği Oluşturma ve Sorgulama
  4. Basit Bir E-posta Asistanı Aracısı Oluşturma
← AI Agents Sayfasına Dön