Skip to content

Repository files navigation

Google Calendar Sync - Google Apps Script

複数の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版 - 推奨)

Claspを使用すると、コマンドラインから簡単にデプロイできます。

前提条件

  • 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-gas.git
cd calender-gas
npm install
  1. Googleアカウントでログイン:
npm run login

Step 3: デプロイ

# GASプロジェクト作成
npm run create

# コードをプッシュ & Calendar API有効化
npm run deploy

# ブラウザでプロジェクトを開く
npm run open

Step 4: 設定と初回同期 (ブラウザのApps Scriptエディタで実施)

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.gsの**validateSetup** を選択して実行

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

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

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

npm スクリプト一覧

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

セットアップ手順 (手動版)

Claspを使用しない場合の手順です。

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

(Clasp版と同じ)

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: ファイルの作成

以下の各ファイルを作成し、対応するコードをコピー:

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

注意: 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'
  }
  // 複数アカウントを同期する場合は、上記を参考にエントリを追加
]

注意:

  • デフォルトでは1つのアカウントのみ設定されています
  • 複数アカウントを同期する場合は、Config.gs内のコメントを参考にエントリを追加してください
  • 各エントリの間にはカンマ (,) が必要です

Step 6: 検証と権限付与

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

Step 7: トリガーの設定

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

Step 8: 初回同期

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

利用可能な関数

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

設定オプション

プライバシーモード

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

カラーID

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

クォータと制限

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

トラブルシューティング

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

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

同期が動作しない

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

sync tokenエラー

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

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

サポート

GitHub Issues または フォーム からお願いします。

ライセンス

MIT License

参考資料

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages