Calendar API の互換性
Calendarpit が対応する Google Calendar API v3 のメソッド、パラメータ、イベントのフィールドと、明示的なエラーを返す機能の一覧です。
Calendar API
Calendarpit は次のエンドポイントを提供します。アクセスのルールは次のとおりです。
/calendar/v3の対応エンドポイントは、どれも Calendarpit のベアラートークンが必要です。スコープはローカル OAuthを参照してください。- アクセスできるのは、認可したテストユーザーが所有するカレンダーだけです。
primaryは、そのユーザーのプライマリカレンダーを指します。- 存在しないカレンダー ID や、所有していないカレンダー ID には
404(notFound)を返します。 - 例外として、
freebusy.queryは200を返し、レスポンスの中でカレンダーごとにnotFoundエラーを示します。
表のパスは、すべて /calendar/v3 からの相対パスです。
| メソッド | パス | 動作 |
|---|---|---|
| GET | /users/me/calendarList | 所有するカレンダーの一覧 |
| POST | /users/me/calendarList | 所有するカレンダーをリストに戻す |
| GET, PUT, PATCH, DELETE | /users/me/calendarList/{calendarId} | リストのエントリを取得・置き換え・部分更新・リストから外す |
| POST | /users/me/calendarList/watch | カレンダーリストの変更を購読 |
| GET | /calendars/{calendarId} | カレンダーのメタデータ(id、summary、timeZone) |
| GET, POST | /calendars/{calendarId}/events | イベントの一覧取得・作成 |
| GET, PUT, PATCH, DELETE | /calendars/{calendarId}/events/{eventId} | イベントの取得・置き換え・部分更新・削除 |
| GET | /calendars/{calendarId}/events/{eventId}/instances | 繰り返しイベントのインスタンスと例外 |
| POST | /freeBusy | 結合して期間内に切り詰めた busy 区間。最大 50 カレンダー |
| POST | /calendars/{calendarId}/events/watch | イベントの変更を購読 |
| POST | /channels/stop | イベントまたはカレンダーリストの watch チャネルを停止 |
calendarList.list のクエリパラメータは、後述の「一覧とページング」に記載しています。
メソッドの対応状況
未対応のメソッドには、明示的なエラーを返します。
| リクエスト | レスポンス |
|---|---|
| ルートがないエンドポイント | 501(unsupportedFeature) |
calendars.update、calendars.patch、calendars.delete | 先にトークン・スコープ・所有者を確認(401、403、404)し、通れば 501 |
events.import | 404(notFound) |
text 付きの events.quickAdd | 400(unsupportedFeature) |
text なしの events.quickAdd | 404 |
| イベントのコレクションや既存のイベントへの未対応の HTTP メソッド | 405(methodNotAllowed) |
events.import と events.quickAdd は、パスが /events/{eventId} と重なります。このため上の表のステータスを返します。
| リソース | メソッド | 対応 | 備考 |
|---|---|---|---|
| Acl | delete | ❌ | ACL と共有カレンダーのアクセスは再現しません |
| Acl | get | ❌ | |
| Acl | insert | ❌ | |
| Acl | list | ❌ | |
| Acl | patch | ❌ | |
| Acl | update | ❌ | |
| Acl | watch | ❌ | イベントとカレンダーリストの watch は ACL を対象にしません |
| CalendarList | list | ✅ | 所有するカレンダー。minAccessRole、showDeleted、showHidden |
| CalendarList | delete | ✅ | プライマリ以外のカレンダーをリストから外すだけです |
| CalendarList | get | ✅ | そのカレンダーについて list が返すものと同じエントリ |
| CalendarList | insert | ✅ | リストから外した所有カレンダーを戻します |
| CalendarList | patch | ✅ | 省略した書き込み可能フィールドは保持します |
| CalendarList | update | ✅ | PUT で書き込み可能フィールドを置き換えます |
| CalendarList | watch | ✅ | 呼び出し元のリストの変更を通知。コールバック先はデフォルトでループバック |
| Calendars | get | ✅ | テストユーザーが所有するカレンダーのメタデータ |
| Calendars | clear | ❌ | イベントを削除するか、起動時 Fixture にリセットしてください |
| Calendars | delete | ❌ | 管理画面か管理 API を使ってください |
| Calendars | insert | ❌ | |
| Calendars | patch | ❌ | |
| Calendars | transferOwnership | ❌ | 所有者はカレンダーごとに 1 人で、共有の仕組みはありません |
| Calendars | update | ❌ | |
| Channels | stop | ✅ | イベントまたはカレンダーリストの watch チャネルを停止します |
| Colors | get | ❌ | イベントの色 1–11 とカレンダーの色 1–24 はエンドポイントなしで使えます |
| Events | list | ✅ | 時間範囲、ページング、singleEvents、同期トークン、フィルタ |
| Events | get | ✅ | cancelled の削除済みレコードと繰り返しのインスタンス ID も取得できます |
| Events | insert | ✅ | 200 で保存したイベントを返します |
| Events | update | ✅ | PUT で書き込み可能フィールドを置き換えます |
| Events | patch | ✅ | 省略したフィールドは保持します |
| Events | delete | ✅ | 同期のために cancelled のレコードを残します |
| Events | instances | ✅ | 繰り返しのインスタンス、例外、originalStart |
| Events | watch | ✅ | コールバック先はデフォルトでループバック。リトライと配信ログあり |
| Events | import | ❌ | insert でイベントを作成してください |
| Events | move | ❌ | カレンダー間の移動は削除と insert で代用してください |
| Events | quickAdd | ❌ | 自然言語の解析はしません |
| Freebusy | query | ✅ | 結合して期間内に切り詰めた busy 区間。最大 50 カレンダー |
| Settings | get | ❌ | ユーザーごとの Google の設定はありません |
| Settings | list | ❌ | |
| Settings | watch | ❌ |
イベント
対応するフィールド
id:[a-zA-Z0-9@._-]{1,128}に一致する値です。primaryは使えません。ID が重複すると409(duplicate)を返します。summary、description、locationstart、endtransparency:opaque、transparentstatus:confirmed、tentative、cancelledvisibility:default、public、private、confidentialcolorId:"1"–"11"attendees、attendeesOmittedguestsCanModify、guestsCanInviteOthers、guestsCanSeeOtherGuestsreminders、recurrenceconferenceData:conferenceDataVersion=1が必要です。hangoutLinkextendedProperties.private、extendedProperties.shared: 文字列マップです。
書き込み系のエンドポイントは、次のものも受け付けます。
sendUpdates:all、externalOnly、noneconferenceDataVersion:0、1
サーバーが管理するフィールド
- レスポンスには
organizer、creator、iCalUID、sequence、created、updated、引用符付きのetagが含まれます。 kind、etag、created、updated、calendarId、sequenceもリクエストで受け付けます。このため、取得したイベントをそのまま送り返せます。- リクエストの
calendarIdは、primaryではなく解決後のカレンダー ID です。 organizer、creator、iCalUID、recurringEventId、originalStartTimeは読み取り専用です。更新時に値が変わっていなければ受け付けます。events.insertでは、これらの読み取り専用フィールドを省略してください。Calendarpit が値を設定します。sequenceは更新のたびに増えます。- 保存済みイベントへの
GET、PUT、PATCH、DELETEではIf-Matchを確認します。一致しない場合は412(conditionNotMet)を返します。
PUT と PATCH
PUTは書き込み可能フィールドを置き換えます。省略した任意フィールドはデフォルトに戻ります。PATCHは省略したフィールドを保持します。startやendのオブジェクトを送ると、保存済みのオブジェクトをまるごと置き換えます。中のフィールドはマージしません。extendedPropertiesのマップはキー単位でマージします。nullでキーまたはマップ全体を削除します。
- 終日イベントの入力では
dateTime: nullとtimeZone: nullを受け付けます。
削除と削除済みレコード
events.delete は 204 を返し、cancelled の削除済みレコードを残します。すでに cancelled の場合は 410(deleted)を返します。
| メソッド | 削除済みレコード |
|---|---|
events.get | 返す |
freebusy.query | 除外する |
| 一覧 | showDeleted=true か updatedMin を指定しない限り除外する |
singleEvents=false の場合、繰り返しの系列で cancelled になった例外は一覧に表示されたままです。
繰り返し、招待、リマインダー、ダミーの Meet リンク、時刻のルールはイベント、繰り返し、時刻の扱いを参照してください。
カレンダーリスト
エントリの形式
- カレンダーリストのエントリは
kind: "calendar#calendarListEntry"です。 listとgetは同じ形式のエントリを返します。
所有するカレンダーは、最初は所有者のリストに次の値で載ります。
accessRole: "owner"selected: truecolorId: "1"(backgroundColor: "#ac725e"、foregroundColor: "#1d1d1d")defaultReminders: []primaryconferenceProperties.allowedConferenceSolutionTypes: ["hangoutsMeet"]
一部のフィールドは、条件によってだけ含まれます。
hiddenはtrueのときだけ含まれます。summaryOverrideとnotificationSettingsは、空のとき省略されます。deleted: trueは、リストから外したエントリと削除済みレコードにだけ付きます。descriptionとlocationはレスポンスに含まれません。送ると400(unsupportedFeature)で拒否されます。
書き込みと同時更新の制御は次のとおりです。
- 読み取り専用フィールドは
kind、etag、id、summary、timeZone、accessRole、primary、deleted、conferencePropertiesです。 - 書き込み時は、読み取り専用フィールドの値が変わっていない場合だけ受け付けます。一致しない場合は
400(invalidParameter)を返します。 - パスで
primaryを使う場合、idはprimaryも受け付けます。 etagは、エントリの設定が変わると更新されます。カレンダーのsummary、timeZone、primaryフラグが変わったときも更新されます。PATCH、PUT、DELETEではIf-Matchを確認します。一致しない場合は412(conditionNotMet)を返します。
設定の書き込み(patch、update、insert)
ユーザーごとの書き込み可能な設定は、summaryOverride、colorId、backgroundColor、foregroundColor、hidden、selected、defaultReminders、notificationSettings です。
- SQLite 使用時は、再起動後も残ります。
- リセットや Fixture の読み込みで消えます。
summaryOverrideには、空白だけではない 10,000 文字以内の文字列が必要です。""は400を返します。
省略したフィールドの扱いは、書き込みの種類で異なります。
PATCHは、省略した書き込み可能フィールドを保持します。nullでsummaryOverride、defaultReminders、notificationSettingsを消去します。PUTとinsert(200)は、書き込み可能フィールドを置き換えます。- 省略した
summaryOverride、defaultReminders、notificationSettingsは消去されます。 hiddenとselectedはfalseに戻ります。一度も書き込んでいないエントリはselected: trueのままです。- 色を指定しない場合、
colorIdは"1"に戻ります。
- 省略した
- 内容が変わらない書き込みは
200を返します。etagは変わらず、カレンダーリストのページトークンも無効にならず、watch チャネルにも通知しません。
色
colorIdはパレット ID"1"–"24"を受け付けます。前景色は"#1d1d1d"です。- 未知の ID や、
"constructor"のような継承プロパティ名は400を返します。
colorRgbFormat=true を指定した場合:
insert、patch、updateのどれでも、backgroundColorとforegroundColor(#rrggbb)の両方が必要です。ない場合は400を返します。- 送った
colorIdは無視され、最も近いパレット色が設定されます。
colorRgbFormat=true を指定しない場合:
- RGB フィールドには、表示中の色と同じ値しか送れません。
PATCHで現在のcolorIdと RGB を同じ値で送ると、カスタムの色を保持します。PUTとinsertでカスタムの RGB を保持するには、colorRgbFormat=trueを送る必要があります。- 別の
colorIdを指定すると、カスタムの RGB は消えます。
リマインダーと通知
defaultRemindersは{method: "email" | "popup", minutes: 0–40320}の項目を 5 件まで受け付けます。notificationSettings.notificationsは{method: "email", type}の項目を 5 件まで受け付けます。typeはeventCreation、eventChange、eventCancellation、eventResponse、agendaのいずれかです。typeは重複できません。重複すると400を返します。
- どちらの設定でもメールは送信されません。
PATCH {"notificationSettings": {}}は既存の通知を保持します。[]、null、またはnotificationsなしのPUTは通知を消去します。
次の 2 つの動作は Google のリファレンスに合わせたもので、実際の Google では確認していません。
colorRgbFormat=trueでcolorIdを無視する動作PATCH {"notificationSettings": {}}で通知を保持する動作
削除と insert
calendarList.delete(204)は、プライマリ以外のカレンダーを呼び出し元のリストから外すだけです。
- プライマリカレンダーには
403(cannotDeletePrimaryCalendar)を返します。 - すでに外している場合は
404を返します。 - 外したカレンダーとそのイベントには、
calendars.get、events.*、freebusy.query、events.watchで引き続きアクセスできます。 - そのカレンダーに対する
calendarList.get、patch、updateは404を返します。
calendarList.insert は、リストから外した所有カレンダーを戻します(200)。
idが必要です。ない場合は400を返します。- カレンダーを新しく作ることはありません。
- すでにリストにあるカレンダー(非表示のものと
primaryを含む)は409(duplicate)を返します。非表示を解除するにはpatchを使ってください。
管理 API による影響:
- プライマリカレンダーを削除すると、リストに残っている最初のカレンダーがプライマリになります。
- すべてリストから外れている場合は、所有する最初のカレンダーを保存済みの設定のままリストに戻します。
primary: trueを設定した場合も、リストから外したカレンダーはリストに戻ります。
watch
calendarList.watch は、ループバックの許可リスト、配信ログ、channels.stop エンドポイントを events.watch と共有します。watch 通知を参照してください。
- 開始時に
syncを送ります。 - その後、リストへの書き込みで保存済みの設定が変わったときに
existsを送ります。 - 管理 API でユーザーのカレンダーを作成・更新・削除したときも
existsを送ります。 - イベントへの書き込みでは送りません。
- その他のクエリパラメータ(
syncTokenを含む)は400(unsupportedFeature)を返します。 params(params.ttlなど)も400(unsupportedFeature)を返します。
一覧とページング
calendarList.list
calendarList.list は次のパラメータを受け付けます。
maxResults、pageTokenminAccessRole:freeBusyReader、reader、writer、owner。所有するカレンダーはすべてownerロールなので、有効な値であればどれでも一致します。showHidden: デフォルトはfalseです。このときlistはhidden: trueのエントリを返しません。getでは取得できます。showDeleted: 下記を参照してください。
レスポンスにはコレクションの etag が含まれます。nextSyncToken はありません。
showDeleted=true を指定すると、次の deleted: true のエントリも返します。
calendarList.deleteでリストから外したカレンダー:hidden: trueでも、保存済みの設定を保持します。- 管理 API で削除したカレンダーの削除済みレコード: リストのデフォルト設定を使います。削除したカレンダーがプライマリだった場合は
primary: trueを保持します。
events.list
events.list は次のパラメータを受け付けます。
timeMin、timeMax、updatedMin: オフセット付きの RFC 3339 タイムスタンプが必要です。maxResults: 1–2500、デフォルト 250orderBy:startTime、updated。orderBy=startTimeにはsingleEvents=trueが必要です。pageToken、singleEvents、timeZone、showDeleted、syncToken、iCalUIDprivateExtendedProperty=name=value、sharedExtendedProperty=name=value: 繰り返し指定できるフィルタです。すべて一致する必要があります。
範囲の判定と並び順は次のとおりです。
- 範囲の判定には
start < timeMaxとend > timeMinを使います。 orderByを指定しない一覧は、イベント ID 順に並びます。
カレンダーに終了日のない繰り返しの系列がある場合は、次のとおりです。
singleEvents=trueまたはtimeMinを指定したevents.listにはtimeMaxが必要です。- その系列への
events.instancesには、常にtimeMaxが必要です。
timeMax がない場合は 400(unsupportedFeature)を返します。
ページトークン
- イベント一覧のページングでは、最初のページの時点でスナップショットを固定します。ページ取得の合間に書き込みがあっても、項目は抜けません。
- イベントのページトークンは、クエリとユーザーに結び付いています。
- イベントのページトークンは 1 時間で期限が切れます。再起動・リセット・Fixture の読み込みでも消えます。
- カレンダーリストのページトークンは、データやカレンダーリストへの書き込みがあると無効になります。保存はされません。
- 期限切れや無効なトークンは
410(invalidPageToken)を返します。
syncToken と nextSyncToken は差分同期を参照してください。
明示的に除外している機能
次の機能には対応していません。
- ACL・共有カレンダー・委任
- カレンダーグループ
- カラーパレット(
colors.get) - ユーザー設定
- カレンダーリストの同期トークン
- ACL と設定の watch
- フリーテキスト検索(
q) eventTypes- 添付ファイル
- 実際のメール送信
- 実際の Google Meet の作成
- 完全な OIDC
リクエストの検証
- 未知のボディフィールドは
400(unsupportedFeature)を返します。 - 未知のクエリパラメータ(
fieldsを含む)は、/calendar/v3のすべてのエンドポイントで400(unsupportedFeature)を返します。 - 例外として、
channels.stopはクエリ文字列を無視します。 - トランスポート用のパラメータ(
alt=json、prettyPrint、quotaUser、key)は受け付けます。 - API キーは、OAuth のベアラートークンの代わりにはなりません。
- Calendarpit が Google にリクエストを中継したり、Google と同期したりすることはありません。
カレンダーの管理とデータのリセットはテスト制御 APIを参照してください。クライアントの接続先を Calendarpit にする方法はアプリを接続するを参照してください。