弊研究室では論文を投稿する会議のリストを Google Sheets を使ってこんな感じで管理してます.
この中の「締切まで何日 (Days left)」の項目は怠惰な僕にとって非常に重要なわけですが,Google Sheets は重いし,このページを毎日見に行こうとは思いません.そこでこれらの項目を毎日 Slack で自動的に通知してくれたら,いい感じに締切への圧がかかって研究が進むというものです.そのような機能を実現する bot を Google Apps Script (GAS) を使って実装してみました.
GAS はとても強力で,例えば以下のような機能を備えています:
- Google Sheets の読み書きができる:Extending Google Sheets | Apps Script | Google Developers
- サーバへリクエストを送信できる:External APIs | Apps Script | Google Developers
- 定期的なスクリプトの実行ができる:Installable Triggers | Apps Script | Google Developers
これらの機能を使えば,毎日 Slack で通知を受け取るような bot は GAS 単体で簡単に書けます.この投稿ではその実装を簡単に紹介します.
実装
Google Sheets の値を読み取る
function getConferenceInfo() {
var ss = SpreadsheetApp.openByUrl(CONFERENCE_LIST_SHEET_URL);
var conference = ss.getSheetByName('Conference list');
var confs = conference.getSheetValues(1, 1, conference.getMaxRows(), 9);
return confs.filter(
function (conf) {return typeof conf[1] === 'number'}
).map(
function (conf) {return {
name: conf[0],
daysLeft: parseInt(conf[1]),
abstractDue: conf[2],
paperDue: conf[3],
url: conf[8],
}}
);
}
流れとしては,
SpreadsheetApp.openByUrl
で,引数の URL で指定したスプレッドシートを開く(Spreadsheet
オブジェクトが返る)Spreadsheet.getSheetByName
で,引数に与えた名前のシートを開く(Sheet
オブジェクトが返る)Sheet.getSheetValues
で,指定した範囲の値を受け取る(array の入れ子Object[][]
が返る)- 適当に加工する
で終わりです.匿名関数を書くのに function
を使ってたり,変数宣言で var
を使ってたりしますが,これは GAS が ES6 に対応していないためです.
Slack Incoming Webhooks にリクエストを投げる
function sendDeadlineInfo(attachments) {
var data = {
attachments: attachments
};
var options = {
method : 'post',
contentType: 'application/json',
payload : JSON.stringify(data)
};
UrlFetchApp.fetch(SLACK_WEBHOOK_URL, options);
}
加工した情報を Slack の Incoming Webhooks に送信します.GAS では urlFetchApp.fetch
でリクエストを投げることができます.便利.
Slack の attachment への加工は省略します.
毎日定時刻に関数を実行する
これも非常に便利で,特定の条件(イベント)を満たしたときに指定した関数を実行するように設定することができます.イベントを発火するトリガーは「時間」と「日付」の2種類あって,「時間」の場合,分・時間・日・週・月毎にトリガーを設定できます.今回の場合は毎日日付が変わったころに圧を感じたいので,次の画像のように設定しました.
Run に指定した main
関数では会議の情報を加工して sendDeadlineInfo
を叩きにいきます.
結果
こんな感じのができました.
Incoming Webhooks のアイコンが 😇 なのもあって,締切への死を感じさせる bot になってますね.
このように,単純な bot であれば GAS だけで簡単に書くことができます1.他の Google アプリとの連携も組み込みで用意されているので,アイデア次第で高度な自動化ができそうです.
- ES6 で書けないのが玉に瑕ですが. ^