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}}>>> |
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だけで事足りますが、次回への布石です。