16分で読める

Google Apps Scriptで複数カレンダーを同期する方法【ブラウザ完結版】

Google Apps Script カレンダー 自動化 初心者向け
khides/calender-sync-gas

Google Apps Script で複数カレンダーを同期するソリューション

View on GitHub →

はじめに

「仕事用アカウント、個人用アカウント、副業用アカウント… カレンダーがバラバラで予定が把握できない」

複数のGoogleアカウントを使い分けている人なら、誰もが経験する悩みです。Googleカレンダーには他のアカウントのカレンダーを「表示」する機能はありますが、1つのカレンダーに統合して一元管理する機能はありません。

Google Calendar Sync は、この問題を解決する Google Apps Script ソリューションです。

Account B のカレンダー ──┐
Account C のカレンダー ──┼──▶ Account A のメインカレンダー
Account D のカレンダー ──┘

この記事では、ブラウザだけで完結するセットアップ方法を解説します。コマンドラインやNode.jsは不要です。

開発環境が整っている方は Clasp版ガイド をご覧ください。デプロイが簡単になります。


この記事の対象者

  • npmやコマンドラインを使わずにセットアップしたい人
  • ブラウザだけで完結させたい人
  • Google Apps Scriptを触るのが初めての人

機能概要

自動同期

15分間隔の定期同期に加え、イベント変更時には即座に同期が実行されます。一度セットアップすれば、あとは自動で動き続けます。

増分同期(Sync Token)

Googleカレンダーが発行するSync Tokenを使い、変更があったイベントのみを取得します。毎回全イベントを取得する必要がないため、APIクォータを大幅に節約できます。

プライバシーモード

同期する情報量を3段階で制御できます。

モード同期される情報ユースケース
busy時間枠のみ(「予定あり」と表示)仕事用カレンダーを個人アカウントに
title-onlyタイトル+時間チームカレンダーをリーダーに
fullすべての情報自分の別アカウント間で完全複製

カラー分け

ソースカレンダーごとに色を設定でき、「この予定はどのアカウントのものか」が一目で分かります。


セットアップ手順

Step 1: カレンダーの共有設定

各ソースアカウント(B, C, D…)で以下を実行します。

  1. Google Calendar にログイン
  2. 左サイドバーのカレンダー名にカーソルを合わせ、設定と共有 をクリック
  3. 「特定のユーザーまたはグループと共有する」セクションで + ユーザーやグループを追加 をクリック
  4. Account A のメールアドレスを入力
  5. 権限を 「予定の表示(すべての予定の詳細)」 に設定
  6. 送信 をクリック

Step 2: GASプロジェクトの作成

Account A で以下を実行します。

  1. Google Apps Script にアクセス
  2. 新しいプロジェクト をクリック
  3. プロジェクト名を「Calendar Sync」に変更

Step 3: Advanced Calendar APIの有効化

  1. 左サイドバーの サービス の横にある + をクリック
  2. Google Calendar API を選択
  3. 追加 をクリック

Step 4: ファイルの作成

以下の各ファイルを作成し、GitHubリポジトリから対応するコードをコピーします。

ファイル名説明
appsscript.jsonプロジェクトマニフェスト
Config.gs設定ファイル
Code.gsメインエントリーポイント
SyncEngine.gs同期エンジン
EventMapper.gsイベント変換
StorageManager.gs状態管理
Logger.gsログユーティリティ
Triggers.gsトリガー管理
Utils.gsヘルパー関数

ファイルの作成方法:

  1. エディタ左側の ファイル セクションで +スクリプト をクリック
  2. ファイル名を入力(.gs は自動で付与されます)
  3. GitHubリポジトリ から対応するファイルの内容をコピー&ペースト

appsscript.json を編集するには:

  1. プロジェクトの設定 (歯車アイコン) をクリック
  2. 「appsscript.json」マニフェストファイルをエディタで表示する にチェック
  3. 左サイドバーに appsscript.json が表示されるので、クリックして編集

Step 5: 設定の編集

Config.gs を開き、calendarId を実際のメールアドレスに変更します。

sourceCalendars: [
  {
    calendarId: 'your-actual-account@gmail.com',  // ← 実際のメールに変更
    label: 'Account B',
    privacyMode: 'busy',
    enabled: true,
    colorId: '1'
  }
  // 複数アカウントを同期する場合は、上記を参考にエントリを追加
]

複数アカウントを追加する場合:

sourceCalendars: [
  {
    calendarId: 'account-b@gmail.com',
    label: 'Account B',
    privacyMode: 'busy',
    enabled: true,
    colorId: '1'
  },
  {  // ← カンマを忘れずに追加
    calendarId: 'account-c@gmail.com',
    label: 'Account C',
    privacyMode: 'title-only',
    enabled: true,
    colorId: '2'
  }
]

Step 6: 検証と権限付与

  1. 関数を選択 ドロップダウンで validateSetup を選択
  2. 実行 ボタンをクリック
  3. 権限の確認画面が表示されたら:
    • 権限を確認 をクリック
    • Googleアカウントを選択
    • 詳細[プロジェクト名] に移動(安全ではないページ) をクリック
    • 許可 をクリック
  4. 実行ログで全てのカレンダーが「アクセス可能」と表示されることを確認

Step 7: トリガーの設定

  1. 関数を選択 ドロップダウンで setupTriggers を選択
  2. 実行 ボタンをクリック
  3. 実行ログでトリガーが作成されたことを確認

Step 8: 初回同期

  1. 関数を選択 ドロップダウンで manualSync を選択
  2. 実行 ボタンをクリック
  3. Account A のカレンダーに予定が同期されていることを確認

設定オプション

プライバシーモード

モード表示内容
busy「[ラベル] 予定あり」のみ表示
title-onlyタイトルと時間のみ(説明・場所なし)
full全ての情報をコピー

カラーID

ID
1ラベンダー
2セージ
3ブドウ
4フラミンゴ
5バナナ
6みかん
7ピーコック
8グラファイト
9ブルーベリー
10バジル
11トマト

運用・メンテナンス

利用可能な関数

関数説明
manualSync()手動で同期を実行
validateSetup()設定とアクセス権を検証
setupTriggers()自動トリガーを設定
clearTriggers()全トリガーを削除
showStatus()同期状態を表示
forceFullSync()全カレンダーのフルシンクを実行
resetAllData()全ての同期データをリセット
removeAllSyncedEvents()同期されたイベントを全削除

トラブルシューティング

カレンダーにアクセスできない

  1. ソースアカウントでカレンダーが正しく共有されているか確認
  2. Account A がカレンダーを購読しているか確認(Calendar > 他のカレンダー > 購読)
  3. Config.gs のカレンダーIDが正しいか確認

同期が動作しない

  1. showStatus() を実行して状態を確認
  2. トリガーが設定されているか確認
  3. 実行ログでエラーを確認

sync tokenエラー

sync token無効化、フルシンク実行

これは正常な動作です。Googleがトークンをリセットしたためフルシンクにフォールバックしたことを示します。

クォータと制限

項目制限対策
イベント作成/日5,000増分同期で最小化
スクリプト実行時間6分ページネーション
トリガー実行時間/日90分sync tokenで効率化

補足: 技術的な仕組み

カレンダー同期の裏側で何が起きているかを簡単に解説します。

Sync Tokenによる差分同期

Googleカレンダーは、イベントリストを取得するたびに Sync Token を発行します。次回の同期時にこのトークンを渡すと、前回取得以降に変更されたイベントのみが返されます。

これにより、毎回全イベントを取得・比較する必要がなくなり、APIクォータ使用量を90%以上削減できます。トークンは一定期間(通常7日程度)で失効しますが、その場合は自動的にフルスキャンにフォールバックします。

イベントマッピング

同期したイベントには、ソースイベントとの対応関係を示すメタデータが埋め込まれます。これにより:

  • ソースで更新されたイベント → 同期先も自動更新
  • ソースで削除されたイベント → 同期先も自動削除
  • 同期先で誤って削除されたイベント → 次回同期時に再作成

という一貫した状態管理が可能になります。

デュアルトリガー戦略

2種類のトリガーを併用することで、リアルタイム性と信頼性を両立しています:

トリガーメリットデメリット
カレンダートリガー即座に発火(1分以内)権限エラーで失敗することがある
15分間隔トリガー確実に動作最大15分の遅延

通常は即座に同期され、万が一失敗しても15分以内に自動リカバリします。


まとめ

Google Calendar Syncを使えば、複数のGoogleアカウントに散らばったカレンダーを1つに統合できます。

  1. カレンダーの共有設定
  2. GASプロジェクトを作成
  3. ファイルをコピー&ペースト
  4. Config.gsで同期元を設定
  5. 初回同期を実行

一度セットアップすれば、あとは自動で同期が続きます。「予定が多すぎて管理できない」という悩みを持つ方は、ぜひ試してみてください。


ソースコード

khides/calender-sync-gas

Google Apps Script で複数カレンダーを同期するソリューション

View on GitHub →