Google Apps Scriptで複数カレンダーを同期する方法【ブラウザ完結版】
Google Apps Script で複数カレンダーを同期するソリューション
はじめに
「仕事用アカウント、個人用アカウント、副業用アカウント… カレンダーがバラバラで予定が把握できない」
複数の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…)で以下を実行します。
- Google Calendar にログイン
- 左サイドバーのカレンダー名にカーソルを合わせ、⋮ → 設定と共有 をクリック
- 「特定のユーザーまたはグループと共有する」セクションで + ユーザーやグループを追加 をクリック
- Account A のメールアドレスを入力
- 権限を 「予定の表示(すべての予定の詳細)」 に設定
- 送信 をクリック
Step 2: GASプロジェクトの作成
Account A で以下を実行します。
- Google Apps Script にアクセス
- 新しいプロジェクト をクリック
- プロジェクト名を「Calendar Sync」に変更
Step 3: Advanced Calendar APIの有効化
- 左サイドバーの サービス の横にある + をクリック
- Google Calendar API を選択
- 追加 をクリック
Step 4: ファイルの作成
以下の各ファイルを作成し、GitHubリポジトリから対応するコードをコピーします。
| ファイル名 | 説明 |
|---|---|
appsscript.json | プロジェクトマニフェスト |
Config.gs | 設定ファイル |
Code.gs | メインエントリーポイント |
SyncEngine.gs | 同期エンジン |
EventMapper.gs | イベント変換 |
StorageManager.gs | 状態管理 |
Logger.gs | ログユーティリティ |
Triggers.gs | トリガー管理 |
Utils.gs | ヘルパー関数 |
ファイルの作成方法:
- エディタ左側の ファイル セクションで + → スクリプト をクリック
- ファイル名を入力(
.gsは自動で付与されます) - GitHubリポジトリ から対応するファイルの内容をコピー&ペースト
appsscript.json を編集するには:
- プロジェクトの設定 (歯車アイコン) をクリック
- 「appsscript.json」マニフェストファイルをエディタで表示する にチェック
- 左サイドバーに
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: 検証と権限付与
- 関数を選択 ドロップダウンで
validateSetupを選択 - 実行 ボタンをクリック
- 権限の確認画面が表示されたら:
- 権限を確認 をクリック
- Googleアカウントを選択
- 詳細 → [プロジェクト名] に移動(安全ではないページ) をクリック
- 許可 をクリック
- 実行ログで全てのカレンダーが「アクセス可能」と表示されることを確認
Step 7: トリガーの設定
- 関数を選択 ドロップダウンで
setupTriggersを選択 - 実行 ボタンをクリック
- 実行ログでトリガーが作成されたことを確認
Step 8: 初回同期
- 関数を選択 ドロップダウンで
manualSyncを選択 - 実行 ボタンをクリック
- 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() | 同期されたイベントを全削除 |
トラブルシューティング
カレンダーにアクセスできない
- ソースアカウントでカレンダーが正しく共有されているか確認
- 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つに統合できます。
- カレンダーの共有設定
- GASプロジェクトを作成
- ファイルをコピー&ペースト
- Config.gsで同期元を設定
- 初回同期を実行
一度セットアップすれば、あとは自動で同期が続きます。「予定が多すぎて管理できない」という悩みを持つ方は、ぜひ試してみてください。
ソースコード
Google Apps Script で複数カレンダーを同期するソリューション