GASでGoogle Calendarのイベントの開始を自作のWeb Hookに通知する

Google Calendarで登録したイベントの開始が近づいたらリマインドするために、自作のWebHookに通知するためのスクリプトをGASで作ってみたのでメモします。

最初、Google Calendarから自動的にイベント開始が近づいたらWeb Hookに通知するための仕組みがあるのでは、と思って探してみたのですが、なかなか見つからなかったので、最近はやりのChatGPTに聞いてみました。プロンプトに「Google calendarでイベントが10分前になったらWEBHOOKにアクセスするようにしたい。どうすればいいか。」と入力したところ、「Google Apps ScriptとGoogleカレンダーのAPIを使用してカスタムのリマインダーを作成することができます」、というアドバイスとともに、ソースコードまで作ってくれました。また、定期的に実行するためのトリガーの設定方法も教えてくれました。めちゃくちゃ賢いですね。

そのソースに少し手を入れたのが以下です。プロパティサービス(環境変数みたいなもの)を使用して、カレンダーIDとかフックするためのURLはハードコードしないようにしてます。また、開始時間、終了時間のフォーマットもRFC3339形式になるように修正しました。


function remindEvent() {
  var now = new Date();
  var end = new Date(now.getTime() + 1 * 60 * 60 * 1000)
  var events = CalendarApp.getCalendarById(PropertiesService.getScriptProperties().getProperty("MY_CALENDAR_ID")).getEvents(now, end);// 1時間以内に開始するイベントを通知

  for (var i = 0; i < events.length; i++) {
    var event = events[i];
    if(event.getStartTime() < now) { // 既に開始していた場合は通知しない
      continue;
    }
    var options = {
      method: 'post',
      contentType: "application/json",
      payload: JSON.stringify({
        'event': event.getTitle(),
        'start': Utilities.formatDate( event.getStartTime(), 'UTC', `yyyy-MM-dd'T'HH:mm:ss'Z'`),
        'end':  Utilities.formatDate( event.getEndTime(), 'UTC', `yyyy-MM-dd'T'HH:mm:ss'Z'`) 
      })
    };
    UrlFetchApp.fetch(PropertiesService.getScriptProperties().getProperty("WEB_HOOK_URL"), options);
  }
}


このスクリプトに対して実行するトリガーを設定(例えば10分ごと)すると、イベント開始が1時間以内になったら10分経過するごとに、WebHookにアクセスしてくれます。

ちなみに、今回のように定期的に何かを実行したい場合、これまではcronまたはApache Airflowを使っていました。前者はもともとシステムに組み込まれており、導入の手間はゼロですが、スケジュールの管理がコンソール上でしかできないし、後者はCPUやメモリといったリソースを食いつぶすし、Pythonでコードを書かないといけないしオーバースペックすぎる、ということで、代替となるものを探していたのですが、GASを使えばサーバーレスで簡単に実現できる(ただし、こちらによるといろいろ制限がありそう)、ということで今後は他の案件でもこちらを活用させていただこうと思います。

Comments

Copied title and URL