IFTTTとGASとSlackを連携してGoogleカレンダーの予定が終わったら通知したい

はじめに

IFTTTとGoogle Apps Scriptを使って、Googleカレンダーの予定が終了したタイミングでSlackに通知してみます。

Googleカレンダーに登録されている予定が終了したタイミングで、Slackに

@ohshige
「〜〜〜」の予定が終わりました。

と通知してみます。

IFTTT + GAS + Slack

前提

この続きみたいなものです。 ohshige.hatenablog.com

GASのプロジェクトとSlack APIを準備しておきます。
また、IFTTTのアカウントも用意しておきます。

IFTTT

まず、IFTTTの「New Applet」からAppletを作ります。

「if this」は「Google Calendar」を選び、トリガーは「Any event ends」にします。

「then that」は「Webhooks」を選び、トリガーは(1つしか無いものの)「Make a web request」にします。
そして、各項目を以下のように設定します。
Bodyでは<<<{{Title}}>>>とすることによって、Googleカレンダーのタイトルをエスケープした状態で送信できます。

項目 内容
URL GASの公開URL
Method POST
Content Type application/x-www-form-url
Body <<<{{Title}}>>>

f:id:ohshige:20190616233419p:plain:w400

GAS

IFTTTからはPOSTでリクエストしているので、GASではdoPostファンクションを使います。

リクエストボディはe.postData.contentsで受け取れますが、エスケープされているので、+をスペースに変換した上で、decodeURIComponentにかけます。

後は、そのまま、リクエストボディから得たタイトルをSlackに投稿するだけです。

function doPost(e) {
  var title = decodeURIComponent(e.postData.contents.replace(/\+/g, ' '));
  notifyToSlack(title);
}

function notifyToSlack(title) {
  var data = {
    'text': '<@ABCXXXXXX>\n「' + title + '」の予定が終わりました。\n'
  };
  var options = {
    'method' : 'post',
    'contentType': 'application/json',
    'payload' : JSON.stringify(data)
  };
  UrlFetchApp.fetch('https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX', options);
}

これで、IFTTTの設定とGASが準備できたので、Googleカレンダーである予定が終了したら(もしくは終了時間近くで)IFTTTが発火してSlackに通知が来ます。

おわりに

このままだと、全ての予定について終了したタイミングで通知が来てしまいます。
それで問題ない場合は良いですが、例えば「予定の詳細に特定の文字が含まれる場合だけ」といった条件が付く場合はこのままだと都合が悪いので改修が必要になります。
それは次回書く予定です。

そもそも、全ての予定について終了したタイミングでSlackに通知するなら、GASなんて使わずにIFTTTだけで事足りますが、次回への布石です。