複数のGoogleカレンダーを1つのカレンダーに自動同期するGoogle Apps Scriptソリューション。
このスクリプトは、複数のGmailアカウント(B, C, D...)のカレンダー予定を、1つのメインアカウント(A)のカレンダーに自動的に同期します。
Account B のカレンダー ──┐
Account C のカレンダー ──┼──▶ Account A のカレンダー
Account D のカレンダー ──┘
- 自動同期: 15分間隔の定期同期 + イベント変更時の即座同期
- 増分同期: sync tokenを使用した効率的な差分同期
- プライバシーモード:
busy: 「予定あり」のみ表示title-only: タイトルと時間のみfull: 全情報をコピー
- イベント追跡: 作成・更新・削除を完全同期
- カラー分け: ソースカレンダーごとに色を設定可能
Claspを使用すると、コマンドラインから簡単にデプロイできます。
- Node.js >= 22.0.0
- npm
各ソースアカウント(B, C, D...)で以下を実行:
- Google Calendar にログイン
- 左サイドバーのカレンダー名にカーソルを合わせ、⋮ → 設定と共有 をクリック
- 「特定のユーザーまたはグループと共有する」セクションで + ユーザーやグループを追加 をクリック
- Account A のメールアドレスを入力
- 権限を 「予定の表示(すべての予定の詳細)」 に設定
- 送信 をクリック
- Apps Script API を有効化
- リポジトリをクローン & 依存関係インストール:
git clone https://github.com/khides/calender-gas.git
cd calender-gas
npm install- Googleアカウントでログイン:
npm run login# GASプロジェクト作成
npm run create
# コードをプッシュ & Calendar API有効化
npm run deploy
# ブラウザでプロジェクトを開く
npm run opennpm run open でApps Scriptエディタが開きます。
- 左サイドバーで 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'
}
]Apps Scriptエディタで関数を実行するには:
- エディタ上部の 関数選択ドロップダウン (「関数を選択」と表示) をクリック
- 実行したい関数名を選択
- 実行ボタン (▶) をクリック
┌─────────────────────────────────────────────────────────┐
│ [関数を選択 ▼] [▶ 実行] [🐛 デバッグ] │
│ │
│ ↑ ここで関数を選んで実行ボタンを押す │
└─────────────────────────────────────────────────────────┘
以下の順番で関数を実行:
-
Code.gsの**validateSetup** を選択して実行- 初回は権限の承認画面が表示される
- 「権限を確認」→ アカウント選択 → 「詳細」→ 「安全ではないページに移動」→ 「許可」
- 実行ログ (下部パネル) で「アクセス可能」と表示されればOK
-
setupTriggersを選択して実行- 自動同期のトリガーが設定される
-
manualSyncを選択して実行- 初回の同期が実行される
- Account A のカレンダーに予定が同期されていることを確認
| コマンド | 説明 |
|---|---|
npm run login |
Googleアカウントでログイン |
npm run create |
GASプロジェクト作成 |
npm run push |
コードをプッシュ |
npm run deploy |
プッシュ + API有効化 |
npm run open |
ブラウザでエディタを開く |
npm run watch |
ファイル変更を監視して自動プッシュ |
Claspを使用しない場合の手順です。
(Clasp版と同じ)
Account A で以下を実行:
- Google Apps Script にアクセス
- 新しいプロジェクト をクリック
- プロジェクト名を「Calendar Sync」に変更
- 左サイドバーの サービス の横にある + をクリック
- Google Calendar API を選択
- 追加 をクリック
以下の各ファイルを作成し、対応するコードをコピー:
| ファイル名 | 説明 |
|---|---|
appsscript.json |
プロジェクトマニフェスト |
Config.gs |
設定ファイル |
Code.gs |
メインエントリーポイント |
SyncEngine.gs |
同期エンジン |
EventMapper.gs |
イベント変換 |
StorageManager.gs |
状態管理 |
Logger.gs |
ログユーティリティ |
Triggers.gs |
トリガー管理 |
Utils.gs |
ヘルパー関数 |
注意: appsscript.json を編集するには:
- プロジェクトの設定 (歯車アイコン) をクリック
- 「appsscript.json」マニフェストファイルをエディタで表示する にチェック
- 左サイドバーに
appsscript.jsonが表示される
Config.gs を開き、calendarId を実際のメールアドレスに変更:
sourceCalendars: [
{
calendarId: 'your-actual-account@gmail.com', // ← 実際のメールに変更
label: 'Account B',
privacyMode: 'busy',
enabled: true,
colorId: '1'
}
// 複数アカウントを同期する場合は、上記を参考にエントリを追加
]注意:
- デフォルトでは1つのアカウントのみ設定されています
- 複数アカウントを同期する場合は、Config.gs内のコメントを参考にエントリを追加してください
- 各エントリの間にはカンマ (
,) が必要です
- 関数を選択 ドロップダウンで
validateSetupを選択 - 実行 ボタンをクリック
- 権限の確認画面が表示されたら:
- 権限を確認 をクリック
- Googleアカウントを選択
- 詳細 → [プロジェクト名] に移動(安全ではないページ) をクリック
- 許可 をクリック
- 実行ログで全てのカレンダーが「アクセス可能」と表示されることを確認
- 関数を選択 ドロップダウンで
setupTriggersを選択 - 実行 ボタンをクリック
- 実行ログでトリガーが作成されたことを確認
- 関数を選択 ドロップダウンで
manualSyncを選択 - 実行 ボタンをクリック
- Account A のカレンダーに予定が同期されていることを確認
| 関数 | 説明 |
|---|---|
manualSync() |
手動で同期を実行 |
validateSetup() |
設定とアクセス権を検証 |
setupTriggers() |
自動トリガーを設定 |
clearTriggers() |
全トリガーを削除 |
showStatus() |
同期状態を表示 |
forceFullSync() |
全カレンダーのフルシンクを実行 |
resetAllData() |
全ての同期データをリセット |
removeAllSyncedEvents() |
同期されたイベントを全削除 |
| モード | 表示内容 |
|---|---|
busy |
「[ラベル] 予定あり」のみ表示 |
title-only |
タイトルと時間のみ(説明・場所なし) |
full |
全ての情報をコピー |
| ID | 色 |
|---|---|
| 1 | ラベンダー |
| 2 | セージ |
| 3 | ブドウ |
| 4 | フラミンゴ |
| 5 | バナナ |
| 6 | みかん |
| 7 | ピーコック |
| 8 | グラファイト |
| 9 | ブルーベリー |
| 10 | バジル |
| 11 | トマト |
| 項目 | 制限 | 対策 |
|---|---|---|
| イベント作成/日 | 5,000 | 増分同期で最小化 |
| スクリプト実行時間 | 6分 | ページネーション |
| トリガー実行時間/日 | 90分 | sync tokenで効率化 |
- ソースアカウントでカレンダーが正しく共有されているか確認
- Account A がカレンダーを購読しているか確認(Calendar > 他のカレンダー > 購読)
Config.gsのカレンダーIDが正しいか確認
showStatus()を実行して状態を確認- トリガーが設定されているか確認
- 実行ログでエラーを確認
sync token無効化、フルシンク実行
これは正常な動作です。GoogleがトークンをリセットしたためスクリプトがフルシンクにフォールバックしたことをUP示します。
GitHub Issues または フォーム からお願いします。
MIT License