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 が使えません。
スクリプトで自動化できると大きな効率化になりますね。