Google Calendar API セットアップガイド -- GCP プロジェクト作成から OAuth Verification まで
はじめに
アプリに Google カレンダー連携を組み込もうとすると、まず GCP(Google Cloud Console)でプロジェクトを作って、Calendar API を有効にして、OAuth 同意画面を設定して…と、カレンダーの中身を触る前にやることが多い。
しかもテストモードの間は登録したアカウントしか使えないし、一般公開するには Google への審査申請(OAuth Verification)が必要で、デモ動画まで求められる。
この記事では、Google Calendar API を使えるようにするまでの GCP 設定手順と、実際の API リクエスト/レスポンスの形式、そして本番公開に必要な OAuth Verification の申請方法までをまとめた。
全体の流れ
- Google Cloud プロジェクトの作成
- Google Calendar API の有効化
- OAuth 同意画面の設定
- OAuth クライアント ID の作成
- API リクエストとレスポンス
- (本番公開時)OAuth Verification 申請
1. Google Cloud プロジェクトの作成
- Google Cloud Console にアクセス
- 画面上部のプロジェクトセレクターをクリック → 「新しいプロジェクト」
- プロジェクト名を入力し「作成」
2. Google Calendar API の有効化
- 左メニュー → 「API とサービス」→「ライブラリ」
- 検索バーに
Google Calendar APIと入力 - 「Google Calendar API」を選択し「有効にする」をクリック
3. OAuth 同意画面の設定
ユーザーが Google アカウントでログインする際に表示される許可画面の設定。
- 左メニュー → 「API とサービス」→「OAuth 同意画面」
- User Type: External を選択(社内限定なら Internal)
- 以下を入力:
| 項目 | 説明 |
|---|---|
| App name | アプリ名 |
| User support email | 問い合わせ先メールアドレス |
| App logo | ロゴ画像 |
| App home page | アプリの URL |
| Application privacy policy link | プライバシーポリシーの URL |
| Application terms of service link | 利用規約の URL |
| Authorized domains | アプリのドメイン |
| Developer contact information | 審査時の連絡先メールアドレス |
- 「スコープを追加または削除」→ 以下を追加:
| スコープ | 用途 |
|---|---|
https://www.googleapis.com/auth/calendar | カレンダーの予定の読み書き |
email | ユーザーのメールアドレス取得 |
- テストユーザーの追加(開発中のみ): テストに使う Google アカウントを登録
注意: 本番公開前は「テストモード」の状態です。ここで登録したアカウントだけが OAuth 画面を通過できます。未登録のアカウントは「このアプリは確認されていません」という警告で止まります。
4. OAuth クライアント ID の作成
アプリが Google と通信するための認証情報を作成する。
- 左メニュー → 「API とサービス」→「認証情報」
- 「認証情報を作成」→「OAuth クライアント ID」
- 以下を設定:
| 項目 | 値 |
|---|---|
| Application type | Web application |
| Name | 任意 |
- 承認済みの JavaScript オリジン にアプリの URL を追加:
| 環境 | 例 |
|---|---|
| ローカル開発 | http://localhost:5173 |
| 本番 | https://your-app.example.com |
- 承認済みのリダイレクト URI に認証後の戻り先 URL を追加:
| 環境 | 例 |
|---|---|
| ローカル開発 | http://localhost:8080/api/auth/callback/google |
| 本番 | https://your-app.example.com/api/auth/callback/google |
- 「作成」をクリック
- 表示される Client ID と Client Secret をコピーして安全な場所に保管
注意: Client Secret は作成時しか表示されません。コピーし忘れた場合は再作成が必要です。
5. API リクエストとレスポンス
ベース URL:
https://www.googleapis.com/calendar/v3
すべてのリクエストに以下のヘッダーが必要:
Authorization: Bearer {アクセストークン}
Content-Type: application/json
5-1. 予定一覧の取得
GET /calendars/primary/events?timeMin=2026-01-01T00:00:00Z&timeMax=2026-12-31T23:59:59Z&singleEvents=true&orderBy=startTime&maxResults=250 HTTP/1.1
レスポンス(HTTP 200)
{
"items": [
{
"id": "abc123def456",
"status": "confirmed",
"summary": "会議",
"description": "週次定例",
"location": "会議室A",
"start": { "dateTime": "2026-04-07T15:30:00+09:00", "timeZone": "Asia/Tokyo" },
"end": { "dateTime": "2026-04-07T16:30:00+09:00", "timeZone": "Asia/Tokyo" },
"creator": { "email": "user@gmail.com", "self": true },
"organizer": { "email": "user@gmail.com", "self": true },
"htmlLink": "https://www.google.com/calendar/event?eid=...",
"hangoutLink": "https://meet.google.com/xxx-yyyy-zzz",
"etag": "\"3547459582886174\"",
"iCalUID": "abc123def456@google.com",
"created": "2026-03-17T06:43:11.000Z",
"updated": "2026-03-17T06:43:11.443Z"
}
],
"nextPageToken": "..."
}
レスポンスフィールド一覧
| フィールド | 説明 |
|---|---|
id | イベントの一意識別子。更新・削除に使用 |
status | confirmed(確定)/ tentative(仮)/ cancelled(キャンセル) |
summary | タイトル |
description | 説明文 |
location | 場所 |
start.dateTime | 開始日時(RFC 3339 形式)。終日イベントの場合は start.date(2026-04-07 形式) |
end.dateTime | 終了日時。終日イベントの場合は end.date |
start.timeZone / end.timeZone | タイムゾーン(例: Asia/Tokyo) |
creator.email | 作成者のメールアドレス |
organizer.email | 主催者のメールアドレス |
attendees | 参加者リスト(email, displayName, responseStatus を含む配列) |
hangoutLink | Google Meet の会議リンク |
conferenceData | 会議情報の詳細(Meet 以外も含む) |
htmlLink | Google カレンダー上でこの予定を開く URL |
etag | バージョン番号。変更検知に使用 |
iCalUID | iCalendar 形式の一意識別子 |
recurrence | 繰り返しルール(RRULE:FREQ=WEEKLY;BYDAY=MO 形式の配列) |
recurringEventId | 繰り返しシリーズの親イベント ID |
transparency | opaque(予定あり)/ transparent(予定なし) |
visibility | default / public / private / confidential |
reminders | リマインダー設定(useDefault + overrides 配列) |
attachments | 添付ファイル(fileUrl, title, mimeType) |
created | 作成日時(UTC) |
updated | 最終更新日時(UTC) |
nextPageToken | 次ページがある場合のトークン。これを pageToken パラメータに渡して次ページを取得 |
5-2. 予定の作成
POST /calendars/primary/events HTTP/1.1
リクエストボディ
{
"summary": "新しい予定",
"description": "テスト予定",
"location": "会議室B",
"start": { "dateTime": "2026-04-10T10:00:00+09:00", "timeZone": "Asia/Tokyo" },
"end": { "dateTime": "2026-04-10T11:00:00+09:00", "timeZone": "Asia/Tokyo" },
"visibility": "default",
"reminders": { "useDefault": false, "overrides": [] }
}
レスポンス(HTTP 200)
作成されたイベントオブジェクトが返る(5-1 のフィールドと同じ構造)。id が新規に発行される。
5-3. 予定の更新
PATCH /calendars/primary/events/{eventId} HTTP/1.1
リクエストボディ(変更したいフィールドのみ)
{
"summary": "会議(変更後)",
"start": { "dateTime": "2026-04-07T16:00:00+09:00", "timeZone": "Asia/Tokyo" },
"end": { "dateTime": "2026-04-07T17:00:00+09:00", "timeZone": "Asia/Tokyo" }
}
レスポンス(HTTP 200)
更新後のイベントオブジェクトが返る。
5-4. 予定の削除
DELETE /calendars/primary/events/{eventId} HTTP/1.1
レスポンス
- HTTP 204 No Content — 削除成功
- HTTP 404 Not Found — 既に削除済み
6. 本番公開時: OAuth Verification 申請
テストモードのまま本番公開すると、登録していないユーザーは「このアプリは確認されていません」警告が出て使えない。一般公開するには Google への OAuth Verification(検証申請) が必要。
申請に必要なもの
- Google Search Console でドメイン所有権の確認
- プライバシーポリシーページ(ログイン不要で閲覧できること、HTTPS)
- 各スコープの使用目的を英語で説明
- デモ動画(YouTube 限定公開、英語キャプション付き)
- 想定期間: 3〜5 営業日(追加のやり取りで延びる場合あり)
API クォータ
| クォータ | 上限 |
|---|---|
| プロジェクト全体 | 10,000 リクエスト / 分 |
| ユーザーあたり | 600 リクエスト / 分 |
他プロバイダーとの比較
| 項目 | Microsoft Teams | Apple | LINE WORKS | |
|---|---|---|---|---|
| 認証方式 | OAuth 2.0 | OAuth 2.0 | CalDAV Basic 認証 | OAuth 2.0 / JWT |
| 開発者登録 | GCP プロジェクト | Entra ID アプリ登録 | 不要 | Developer Console |
| Client ID / Secret | 必要 | 必要 | 不要 | 必要 |
| 本番審査 | OAuth Verification (3-5営業日) | Publisher Verification | 不要 | 不要 |
| API 形式 | REST (JSON) | REST (JSON) | CalDAV (XML/ICS) | REST (JSON) |
注意事項
Client ID・Client Secret は平文でコードに埋め込まないこと。環境変数などで管理する。
トラブルシューティング
| 症状 | 原因と対処 |
|---|---|
| 「このアプリは確認されていません」 | テストモード中。テストユーザーに追加するか、OAuth Verification を完了する |
| リダイレクト URI が一致しない | Cloud Console の「承認済みリダイレクト URI」とアプリ側の設定が完全一致しているか確認(末尾の / に注意) |
| 403 Forbidden | Calendar API が有効になっているか確認 |
| 認証後にトークンが取れない | リフレッシュトークンが失効している。ユーザーに再度ログインしてもらう |
参考リンク
- Google Cloud Console
- Google Calendar API ドキュメント
- OAuth 2.0 for Web Server Applications
- OAuth consent screen 設定
- Choose Google Calendar API scopes
この記事に関連するサービス
TodoONada株式会社では、認証基盤・ID管理の設計から開発・移行までを支援しています。
- 認証基盤・ID管理の開発支援 — IDaaS導入・SSO・パスキー・会員基盤の移行をワンストップで
導入・開発のご相談はお問い合わせからお気軽にどうぞ。検討段階のご相談も歓迎です。