Googleカレンダーの予定をGASで他のカレンダーに同期する方法

Yahoo!知恵袋の回答受付中の質問に勝手に答えるコーナーです。

今回の質問は、

Googleカレンダーで、すでに他人へ共有しているカレンダーに、まだ共有していないカレンダーの内容を追加したい。

Googleカレンダーでは複数のマイカレンダーが作成できますが、その中のAカレンダーを既に職場の方へ共有しております。

今回私はBカレンダーを追加し、タスク管理アプリとの連携をBカレンダーで双方向で行うようにしました。
つまり、私のGoogleカレンダーにはAカレンダーとBカレンダーが存在し、Aカレンダーのみ職場の方へ共有できている状態です。

Bカレンダーを新たに職場の方へ連携設定していただければ、Bカレンダーも共有できるのですが、手間をかけさせることと相手の画面にも私のカレンダーが2つ存在することになるので不便です。

私の作業だけで、既に共有しているAカレンダー経由でBカレンダーを同じく共有することは可能でしょうか。

お詳しい方、よろしくお願いいたします。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10218501455

回答

どのような制約条件で実現したいか、にも寄りますが、2つの解決策があります。

案1。
AカレンダーにBカレンダーの予定が入ってもよい場合は、AカレンダーにBカレンダーの予定を GAS でコピーします。

案2。
AカレンダーにBカレンダーの予定を入れたくない場合は、現在共有している Aカレンダーを共有用カレンダーとします。
Aカレンダーに入れていた予定は、新たに作るCカレンダーに入れるようにし、CカレンダーとBカレンダーの予定を GAS でAカレンダーにコピーします。

そうすると、職場の他の方の作業なしに、(元の)AカレンダーとBカレンダーの予定を共有できるようになります。

今回は、案2 を検討してみましょう。

設計

予定の追加や削除を検知する API は用意されていないので、BカレンダーとCカレンダーの予定をAカレンダー(共有)に定期的にコピーします。

単純にBカレンダーとCカレンダーの予定をAカレンダー(共有)に作成することは簡単です。

しかし、BカレンダーとCカレンダーで削除した予定を Aカレンダー(共有)からも削除するには、いったん Aカレンダー(共有)の予定をすべて削除し、BカレンダーとCカレンダーの予定をすべてコピーしなおす必要があります。

この処理を高頻度で行うのは負荷が高いので、

  • 今日の予定: 10分ごとにコピー
  • 明日の予定: 2時間ごとにコピー
  • 明後日から2週間後の予定: 1日ごとにコピー
  • 2週間後から2か月後の予定: 1週間ごとにコピー

といったように、コピーの頻度を分散させるとよいでしょう。

スクリプト

var calendar_shared = CalendarApp.getCalendarById('xxxxxxxxxx');

の xxxxxxxxxx 部分にAカレンダー(共有)のカレンダー IDを、

 var calendar_b = CalendarApp.getCalendarById('yyyyyyyyyy');

の yyyyyyyyyy部分にBカレンダーのカレンダー IDを、

 var calendar_c = CalendarApp.getCalendarById('zzzzzzzzzz');

の zzzzzzzzzz部分にCカレンダーのカレンダー IDを、貼り付けます。

カレンダーID は、Google カレンダーの設定から確認できます。

スクリプトでは、処理頻度ごとに関数を作成しました。

  • 今日の予定のコピー: syncEventsForToday()
  • 明日の予定: syncEventsForTommorow()
  • 明後日から2週間後の予定: syncEventsAfter2To14Days()
  • 2週間後から2か月後の予定: syncEventsAfter15To60Days()

これらを時間ベースのトリガーから呼び、定期的にコピーするようにします。

トリガー

[編集] – [現在のプロジェクトのトリガー] を開きます。

[トリガーを追加] から、

例えば、今日の予定のコピーのトリガーを作成する場合、

  • 実行する関数を選択: syncEventsForToday
  • 実行するデプロイを選択: HEAD
  • イベントのソースを選択: 時間主導型
  • 時間ベースのトリガーのタイプを選択: 分ベースのタイマー
  • 時間の間隔を選択(時間): 10分おき

を指定します。

syncEventsForTommorow(), syncEventsAfter2To14Days(), syncEventsAfter15To60Days() についても、それぞれ適切な時間の間隔でトリガーを作成します。

まとめ

Google カレンダーは、予定をコピーしたり貼り付けるのに Ctrl-C や Ctrl-V が使えません。

スクリプトで自動化できると大きな効率化になりますね。