Google Calendar API 調査

Google API 調査の第 2 回。Calendar API のリソース・スコープ・クォータ・通知と同期・繰り返し予定を公式ドキュメントで確かめた

📅 作成: 2026-10-25 / 更新: 2026-10-25

概要とリソース

Google Calendar API は RESTful API。HTTP を直接呼ぶか、Google のクライアントライブラリで使う。カレンダーの Web 画面にある機能の大部分を、API から扱える。

リソース内容
Eventsタイトル・開始と終了・参加者などを持つ予定。単発と繰り返しがある
Calendarsイベントの集まり。説明文や既定のタイムゾーンなどのメタデータを持つ
CalendarListユーザーのカレンダー一覧に出るカレンダーの集まり。色や新規イベントの通知設定など、ユーザーごとの属性を持つ (CalendarListEntry)
Settingsタイムゾーンなど、画面上のユーザー設定
Aclユーザーやグループに、カレンダーへの特定のアクセス権を与えるルール

出典: Google Calendar API の概要 (Google for Developers)

Colors

出典: Colors (Google for Developers) ・ colors.get (Google for Developers)

Freebusy

POST https://www.googleapis.com/calendar/v3/freeBusy で、複数のカレンダーやグループの、予定が入っている時間帯 (busy) を返す。

項目内容
timeMin / timeMax検索範囲の開始と終了 (RFC3339)
timeZone応答のタイムゾーン。既定は UTC
items[].id照会するカレンダーまたはグループの ID
groupExpansionMax1 グループに含めるカレンダー ID の最大数。上限 100。超えるとエラー
calendarExpansionMax空き状況を返すカレンダーの最大数。上限 50

出典: Freebusy.query (Google for Developers)

スコープ

公式ページに 20 件が載っている。接頭辞はすべて https://www.googleapis.com/auth/。公式は「できるだけ範囲の狭いスコープを選ぶ」よう求めている。

用途スコープ (接頭辞を省略)概要
全体calendar閲覧できるすべてのカレンダーの閲覧・編集・共有、完全削除
全体calendar.readonly閲覧できるカレンダーの閲覧・ダウンロード
イベントcalendar.eventsすべてのカレンダーのイベントの閲覧・編集
イベントcalendar.events.readonlyすべてのカレンダーのイベントの閲覧
イベントcalendar.events.owned所有カレンダーのイベントの作成・変更・削除
イベントcalendar.events.owned.readonly所有カレンダーのイベントの閲覧
イベントcalendar.events.public.readonly公開カレンダーのイベントの閲覧
空き状況calendar.freebusy予定の空き状況の確認
空き状況calendar.events.freebusyアクセスできるカレンダーの空き状況の閲覧
カレンダーcalendar.calendarsカレンダーのプロパティの変更、セカンダリカレンダーの作成
カレンダーcalendar.calendars.readonlyカレンダーのタイトル・説明・タイムゾーンなどの閲覧
カレンダーcalendar.app.createdセカンダリカレンダーの作成と、そのイベントの操作
一覧calendar.calendarlist購読中のカレンダーの閲覧・追加・削除
一覧calendar.calendarlist.readonly購読中のカレンダー一覧の閲覧
共有calendar.acls所有カレンダーの共有権限の閲覧・変更
共有calendar.acls.readonly所有カレンダーの共有権限の閲覧
設定calendar.settings.readonlyカレンダー設定の閲覧
アドオンcalendar.addons.executeカレンダーアドオンとしての実行
アドオンcalendar.addons.current.event.read画面で開いたイベントの閲覧
アドオンcalendar.addons.current.event.write画面で開いたイベントの編集
各スコープが sensitive か non-sensitive かを示す公式の一覧表は、見つからなかった。公式で確かめられたのは、次の 2 点だけ。
・Google の検証ガイドが、sensitive の例として「Google カレンダーに保存されたイベントの閲覧」を挙げている
・区分は、Cloud Console の Google Auth platform > Data Access で、スコープを追加する画面に non-sensitive・sensitive・restricted の 3 つの節として出る (静的な一覧表ではない)

区分を探した範囲

出典 (公式): Sensitive scope verification ・ OAuth 同意画面の設定 ・ OAuth 2.0 Scopes for Google APIs
出典 (非公式): How to use OAuth for Google Calendar (Nylas)

範囲の選び方 (この資料の解釈): 閲覧だけなら .readonly 付きにする。自分の所有カレンダーだけを扱うなら、calendar.events より calendar.events.owned が狭い。空き状況だけなら calendar.freebusy で足りる可能性がある。公式の文面ではなく、スコープ名と概要からの推測。

出典: Google Calendar API のスコープ (Google for Developers)

クォータ

種類上限
1 分あたり・プロジェクト10,000 リクエスト
1 分あたり・プロジェクト × ユーザー600 リクエスト
1 日あたり・プロジェクト (課金のしきい値)1,000,000 リクエスト

対処

出典: Calendar API のクォータの管理 (Google for Developers)

プッシュ通知と増分同期

プッシュ通知 (watch)

対象は Acl・CalendarList・Events・Settings の 4 種類。通知を受ける HTTPS のサーバーが要る。

watch の項目内容
id (必須)プロジェクト内で一意。最大 64 文字。UUID を推奨
type (必須)web_hook
address (必須)通知を受ける HTTPS の URL。有効な SSL 証明書が要る (自己署名・信頼されない発行元・失効・ホスト名の不一致は不可)
token最大 256 文字。通知の検証や振り分けに使う。機密情報は入れない
expirationミリ秒の Unix タイムスタンプ
チャネルに自動更新は無い。期限が近づいたら、新しい id で watch をもう一度呼ぶ (新旧が並行して有効な時間帯がある)。通知は一定の割合で欠落することがあり、届かなくても同期が進む作りにする。

出典: Calendar API のプッシュ通知 (Google for Developers)

増分同期 (syncToken)

  1. 初回の全同期: list で全件を取り、最後のページの nextSyncToken を保存する
  2. 増分同期: 保存した値を syncToken に入れて list する。結果には削除されたエントリも入る。pageToken が返ったら、最初と同じクエリに pageToken を足して順に取り、最後のページの新しい syncToken を保存する
  3. 410 GONE: トークンの期限切れや関連 ACL の変更で無効になると返る。ローカルのデータを全部消して、全同期からやり直す

出典: Calendar API の増分同期 (Google for Developers)

繰り返し予定

インスタンスの見分け方

フィールド内容
recurrence親だけが持つ。インスタンスは持たない
recurringEventId所属する親予定の ID
originalStartTime親の繰り返しルール上の本来の開始時刻。日時が変えられていても、系列の中の位置を特定できる

インスタンスの変更・削除は、取得したインスタンスへの PUT で行う。取り消すには status を cancelled にする。この操作で例外ができる。

系列全体や「以降すべて」を変えたいときに、インスタンスを 1 つずつ変更しない。例外が大量にでき、カレンダーが煩雑になり、アクセスが遅くなり、通知も大量に送られる。

出典: 繰り返しイベント (Google for Developers)