16分で読める

Google Apps Scriptで複数カレンダーを同期する方法【Clasp版】

Google Apps Script カレンダー 自動化 Clasp npm
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 のカレンダー ──┘

この記事では、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…)で以下を実行します。

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

Step 2: 事前準備(Account Aで1回のみ)

  1. Apps Script API を有効化

  2. リポジトリをクローン & 依存関係インストール:

git clone https://github.com/khides/calender-sync-gas.git
cd calender-sync-gas
npm install
  1. 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. ソースカレンダーの設定

  1. 左サイドバーで Config.gs をクリック
  2. sourceCalendars 配列内の calendarId を実際のメールアドレスに変更:
calendarId: 'your-actual-account@gmail.com',  // ← 実際のメールに変更
  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: 'busy',
    enabled: true,
    colorId: '2'
  }
]

4-2. 関数の実行方法

Apps Scriptエディタで関数を実行するには:

  1. エディタ上部の 関数選択ドロップダウン (「関数を選択」と表示) をクリック
  2. 実行したい関数名を選択
  3. 実行ボタン (▶) をクリック
┌─────────────────────────────────────────────────────────┐
│  [関数を選択 ▼]  [▶ 実行]  [🐛 デバッグ]              │
│                                                         │
│  ↑ ここで関数を選んで実行ボタンを押す                  │
└─────────────────────────────────────────────────────────┘

4-3. 初期設定の実行

以下の順番で関数を実行:

  1. Code.gsvalidateSetup を選択して実行

    • 初回は権限の承認画面が表示される
    • 「権限を確認」→ アカウント選択 → 「詳細」→ 「安全ではないページに移動」→ 「許可」
    • 実行ログ (下部パネル) で「アクセス可能」と表示されればOK
  2. setupTriggers を選択して実行

    • 自動同期のトリガーが設定される
  3. manualSync を選択して実行

    • 初回の同期が実行される
    • Account A のカレンダーに予定が同期されていることを確認

設定オプション

プライバシーモード

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

カラーID

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

npmスクリプト一覧

コマンド説明
npm run loginGoogleアカウントでログイン
npm run createGASプロジェクト作成
npm run pushコードをプッシュ
npm run deployプッシュ + API有効化
npm run openブラウザでエディタを開く
npm run watchファイル変更を監視して自動プッシュ

運用・メンテナンス

利用可能な関数

関数説明
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. Claspでデプロイ
  3. Config.gsで同期元を設定
  4. 初回同期を実行

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


ソースコード

khides/calender-sync-gas

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

View on GitHub →