Google Apps Scriptで複数カレンダーを同期する方法【Clasp版】
Google Apps Script で複数カレンダーを同期するソリューション
はじめに
「仕事用アカウント、個人用アカウント、副業用アカウント… カレンダーがバラバラで予定が把握できない」
複数のGoogleアカウントを使い分けている人なら、誰もが経験する悩みです。Googleカレンダーには他のアカウントのカレンダーを「表示」する機能はありますが、1つのカレンダーに統合して一元管理する機能はありません。
Google Calendar Sync は、この問題を解決する Google Apps Script ソリューションです。
Account B のカレンダー ──┐
Account C のカレンダー ──┼──▶ Account A のメインカレンダー
Account D のカレンダー ──┘
この記事では、Claspを使ったモダンな開発環境でのセットアップ方法を解説します。
ブラウザだけで完結させたい方は 手動版ガイド をご覧ください。
この記事の対象者
- ある程度バックで何が行われているかを理解しながらカレンダー同期をしたい人
- Node.js/npmに馴染みのある開発者
- コマンドラインでの操作に抵抗がない人
機能概要
自動同期
15分間隔の定期同期に加え、イベント変更時には即座に同期が実行されます。一度セットアップすれば、あとは自動で動き続けます。
増分同期(Sync Token)
Googleカレンダーが発行するSync Tokenを使い、変更があったイベントのみを取得します。毎回全イベントを取得する必要がないため、APIクォータを大幅に節約できます。
プライバシーモード
同期する情報量を3段階で制御できます。
| モード | 同期される情報 | ユースケース |
|---|---|---|
busy | 時間枠のみ(「予定あり」と表示) | 仕事用カレンダーを個人アカウントに |
title-only | タイトル+時間 | チームカレンダーをリーダーに |
full | すべての情報 | 自分の別アカウント間で完全複製 |
カラー分け
ソースカレンダーごとに色を設定でき、「この予定はどのアカウントのものか」が一目で分かります。
セットアップ手順
前提条件
- Node.js >= 22.0.0
- npm
Step 1: カレンダーの共有設定
各ソースアカウント(B, C, D…)で以下を実行します。
- Google Calendar にログイン
- 左サイドバーのカレンダー名にカーソルを合わせ、⋮ → 設定と共有 をクリック
- 「特定のユーザーまたはグループと共有する」セクションで + ユーザーやグループを追加 をクリック
- Account A のメールアドレスを入力
- 権限を 「予定の表示(すべての予定の詳細)」 に設定
- 送信 をクリック
Step 2: 事前準備(Account Aで1回のみ)
-
Apps Script API を有効化
-
リポジトリをクローン & 依存関係インストール:
git clone https://github.com/khides/calender-sync-gas.git
cd calender-sync-gas
npm install
- Googleアカウントでログイン:
npm run login
Step 3: デプロイ
# GASプロジェクト作成
npm run create
# コードをプッシュ & Calendar API有効化
npm run deploy
# ブラウザでプロジェクトを開く
npm run open
Step 4: 設定と初回同期
npm run open でApps Scriptエディタが開きます。
4-1. ソースカレンダーの設定
- 左サイドバーで Config.gs をクリック
sourceCalendars配列内のcalendarIdを実際のメールアドレスに変更:
calendarId: 'your-actual-account@gmail.com', // ← 実際のメールに変更
- 複数アカウントを同期する場合: コメントアウトされたサンプルを参考に、エントリを追加してください
sourceCalendars: [
{
calendarId: 'account-b@gmail.com',
label: 'Account B',
privacyMode: 'busy',
enabled: true,
colorId: '1'
},
{ // ← カンマを忘れずに追加
calendarId: 'account-c@gmail.com',
label: 'Account C',
privacyMode: 'busy',
enabled: true,
colorId: '2'
}
]
4-2. 関数の実行方法
Apps Scriptエディタで関数を実行するには:
- エディタ上部の 関数選択ドロップダウン (「関数を選択」と表示) をクリック
- 実行したい関数名を選択
- 実行ボタン (▶) をクリック
┌─────────────────────────────────────────────────────────┐
│ [関数を選択 ▼] [▶ 実行] [🐛 デバッグ] │
│ │
│ ↑ ここで関数を選んで実行ボタンを押す │
└─────────────────────────────────────────────────────────┘
4-3. 初期設定の実行
以下の順番で関数を実行:
-
Code.gsのvalidateSetupを選択して実行- 初回は権限の承認画面が表示される
- 「権限を確認」→ アカウント選択 → 「詳細」→ 「安全ではないページに移動」→ 「許可」
- 実行ログ (下部パネル) で「アクセス可能」と表示されればOK
-
setupTriggersを選択して実行- 自動同期のトリガーが設定される
-
manualSyncを選択して実行- 初回の同期が実行される
- Account A のカレンダーに予定が同期されていることを確認
設定オプション
プライバシーモード
| モード | 表示内容 |
|---|---|
busy | 「[ラベル] 予定あり」のみ表示 |
title-only | タイトルと時間のみ(説明・場所なし) |
full | 全ての情報をコピー |
カラーID
| ID | 色 |
|---|---|
| 1 | ラベンダー |
| 2 | セージ |
| 3 | ブドウ |
| 4 | フラミンゴ |
| 5 | バナナ |
| 6 | みかん |
| 7 | ピーコック |
| 8 | グラファイト |
| 9 | ブルーベリー |
| 10 | バジル |
| 11 | トマト |
npmスクリプト一覧
| コマンド | 説明 |
|---|---|
npm run login | Googleアカウントでログイン |
npm run create | GASプロジェクト作成 |
npm run push | コードをプッシュ |
npm run deploy | プッシュ + API有効化 |
npm run open | ブラウザでエディタを開く |
npm run watch | ファイル変更を監視して自動プッシュ |
運用・メンテナンス
利用可能な関数
| 関数 | 説明 |
|---|---|
manualSync() | 手動で同期を実行 |
validateSetup() | 設定とアクセス権を検証 |
setupTriggers() | 自動トリガーを設定 |
clearTriggers() | 全トリガーを削除 |
showStatus() | 同期状態を表示 |
forceFullSync() | 全カレンダーのフルシンクを実行 |
resetAllData() | 全ての同期データをリセット |
removeAllSyncedEvents() | 同期されたイベントを全削除 |
トラブルシューティング
カレンダーにアクセスできない
- ソースアカウントでカレンダーが正しく共有されているか確認
- Account A がカレンダーを購読しているか確認(Calendar > 他のカレンダー > 購読)
Config.gsのカレンダーIDが正しいか確認
同期が動作しない
showStatus()を実行して状態を確認- トリガーが設定されているか確認
- 実行ログでエラーを確認
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つに統合できます。
- カレンダーの共有設定
- Claspでデプロイ
- Config.gsで同期元を設定
- 初回同期を実行
一度セットアップすれば、あとは自動で同期が続きます。「予定が多すぎて管理できない」という悩みを持つ方は、ぜひ試してみてください。
ソースコード
Google Apps Script で複数カレンダーを同期するソリューション