Google Calendar API セットアップガイド -- GCP プロジェクト作成から OAuth Verification まで

Google Calendar API セットアップガイド -- GCP プロジェクト作成から OAuth Verification まで

はじめに

アプリに Google カレンダー連携を組み込もうとすると、まず GCP(Google Cloud Console)でプロジェクトを作って、Calendar API を有効にして、OAuth 同意画面を設定して…と、カレンダーの中身を触る前にやることが多い。

しかもテストモードの間は登録したアカウントしか使えないし、一般公開するには Google への審査申請(OAuth Verification)が必要で、デモ動画まで求められる。

この記事では、Google Calendar API を使えるようにするまでの GCP 設定手順と、実際の API リクエスト/レスポンスの形式、そして本番公開に必要な OAuth Verification の申請方法までをまとめた。

全体の流れ

  1. Google Cloud プロジェクトの作成
  2. Google Calendar API の有効化
  3. OAuth 同意画面の設定
  4. OAuth クライアント ID の作成
  5. API リクエストとレスポンス
  6. (本番公開時)OAuth Verification 申請

1. Google Cloud プロジェクトの作成

  1. Google Cloud Console にアクセス
  2. 画面上部のプロジェクトセレクターをクリック → 「新しいプロジェクト」
  3. プロジェクト名を入力し「作成」

2. Google Calendar API の有効化

  1. 左メニュー → 「API とサービス」→「ライブラリ」
  2. 検索バーに Google Calendar API と入力
  3. 「Google Calendar API」を選択し「有効にする」をクリック

3. OAuth 同意画面の設定

ユーザーが Google アカウントでログインする際に表示される許可画面の設定。

  1. 左メニュー → 「API とサービス」→「OAuth 同意画面」
  2. User Type: External を選択(社内限定なら Internal)
  3. 以下を入力:
項目説明
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審査時の連絡先メールアドレス
  1. スコープを追加または削除」→ 以下を追加:
スコープ用途
https://www.googleapis.com/auth/calendarカレンダーの予定の読み書き
emailユーザーのメールアドレス取得
  1. テストユーザーの追加(開発中のみ): テストに使う Google アカウントを登録

注意: 本番公開前は「テストモード」の状態です。ここで登録したアカウントだけが OAuth 画面を通過できます。未登録のアカウントは「このアプリは確認されていません」という警告で止まります。


4. OAuth クライアント ID の作成

アプリが Google と通信するための認証情報を作成する。

  1. 左メニュー → 「API とサービス」→「認証情報」
  2. 認証情報を作成」→「OAuth クライアント ID
  3. 以下を設定:
項目
Application typeWeb application
Name任意
  1. 承認済みの JavaScript オリジン にアプリの URL を追加:
環境
ローカル開発http://localhost:5173
本番https://your-app.example.com
  1. 承認済みのリダイレクト URI に認証後の戻り先 URL を追加:
環境
ローカル開発http://localhost:8080/api/auth/callback/google
本番https://your-app.example.com/api/auth/callback/google
  1. 作成」をクリック
  2. 表示される Client IDClient 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イベントの一意識別子。更新・削除に使用
statusconfirmed(確定)/ tentative(仮)/ cancelled(キャンセル)
summaryタイトル
description説明文
location場所
start.dateTime開始日時(RFC 3339 形式)。終日イベントの場合は start.date2026-04-07 形式)
end.dateTime終了日時。終日イベントの場合は end.date
start.timeZone / end.timeZoneタイムゾーン(例: Asia/Tokyo
creator.email作成者のメールアドレス
organizer.email主催者のメールアドレス
attendees参加者リスト(email, displayName, responseStatus を含む配列)
hangoutLinkGoogle Meet の会議リンク
conferenceData会議情報の詳細(Meet 以外も含む)
htmlLinkGoogle カレンダー上でこの予定を開く URL
etagバージョン番号。変更検知に使用
iCalUIDiCalendar 形式の一意識別子
recurrence繰り返しルール(RRULE:FREQ=WEEKLY;BYDAY=MO 形式の配列)
recurringEventId繰り返しシリーズの親イベント ID
transparencyopaque(予定あり)/ transparent(予定なし)
visibilitydefault / 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 リクエスト / 分

他プロバイダーとの比較

項目GoogleMicrosoft TeamsAppleLINE WORKS
認証方式OAuth 2.0OAuth 2.0CalDAV 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 ForbiddenCalendar API が有効になっているか確認
認証後にトークンが取れないリフレッシュトークンが失効している。ユーザーに再度ログインしてもらう

参考リンク


この記事に関連するサービス

TodoONada株式会社では、認証基盤・ID管理の設計から開発・移行までを支援しています。

導入・開発のご相談はお問い合わせからお気軽にどうぞ。検討段階のご相談も歓迎です。

技術ブログ一覧へ戻る