2018-03-09(金) [長年日記]
■ Google SpreadsheetとGASでSlackボットを作った
今日からモバマスでフェスなんだけど、フェスにかぎらず開催時刻が決まってるイベントはついつい忘れる(という話が複数のわさますメンバから出る。老いは万人に等しくやってくる)。ここ数回は手動でSlackにリマインダを設定していたんだけど*1、さすがに面倒なのでbotを作ることにした。指定した時刻に適当なメッセージを投稿してくれる簡素なヤツで良い。
こういう、以前ならサーバを建ててcronを回して……みたいな用途のプログラムは、いまならGoogle SpreadsheetとGoogle Apps Script (GAS)で充分になってて、いい時代に生きてるなぁって思うね。
というわけで、こんなシートを作成して*2:
2018/03/08 22:00 | 【これはテストです】アイプロ終了まで残り1時間です! |
2018/03/09 15:00 | ffdy |
2018/03/09 20:00 | ffdy |
スクリプトはこう:
function triggerEvent() { var sheet = SpreadsheetApp.getActiveSheet(); var data = sheet.getDataRange().getValues(); var now = new Date(); for (var i = 0; i <data.length; i++) { var task = data[i]; var trigger = new Date(task[0]); if (task[2] != 'done' && now >= trigger) { notifySlack(task[1], '#general', 'Chihiro', ':chihiro:'); sheet.getRange(i+1, 2+1).setValue('done'); } }; } function notifySlack(message, channel, username, icon_emoji) { var webhookUrl = 'https://hooks.slack.com/services/XXXXX/XXXXX/XXXXX'; var payload = { 'text': message, 'channel': channel, 'username': username, 'icon_emoji': icon_emoji }; var opts = { "method": "post", "contentType": "application/json", "payload" : JSON.stringify(payload) }; var res = UrlFetchApp.fetch(webhookUrl, opts); return JSON.stringify(res); }
なおカスタム絵文字で「:chihiro:」は定義済み。で、1分間隔*3で回すようにtriggerEvent関数を実行するようにトリガーを設定する。と、時間がきたらちひろ様からありがたいメッセージが投下される:
処理済みのエントリは3カラム目に「done」が記入される。めでたしめでたし。
スクリプトがバージョン管理できないのが厳しいなぁと思ったが、Chrome拡張でGitHubと同期してくれる「Google Apps Script Github アシスタント」というのがあるようだ。あとで使ってみよう。