この記事について
この記事では、GoogleSpreadSheetの更新をトリガーにして、Slackの IncomingWebHook を通じて指定のチャンネルに通知する手順について書いています。
やりたいこと
私はつぶやき用にSlackに個人のチャンネルを作っています。
ですが、一人でつぶやいてるとなんだかチャンネルが寂しげに見える・・・!!
そこでKPTをメモしているGoogleSpreadsheetになにか変更があったら、それをSlackにも投げてみようと思いました。
SlackのIncomingWebhooksの設定
まずはSlackのIncomingWebhooksを設定します。
Customize Slack > Configure Apps
でAppsManageページを開きます。
左袖のManageにあるCustom Integrations
を選択し、Incoming WebHooks
の設定を開きます。
Add Configuration
をクリックし、新しく設定を追加します。
このページで通知したいチャンネルや通知を投げるユーザ名やアイコンを設定できます。
また、Webhook URLも表示されていて、後々GAS上で必要になります。
名前は無機質ですが、アイコンは:innocent:
にしてみました。
個人的にはGoogleの:innocent:
のほうが好きです
GoogleSpreadSheetの構成
今回通知したいシートの構成は
A | B | C |
---|---|---|
2018/01/05 | Keep | よかったです |
のようにA列に年月日、B列はKeep,Problem,Tryのいずれか、C列はその内容、としています。
GASを書く
通知したい GoogleSpreadSheetのツール > スクリプトエディタ
からGASのスクリプトエディタを開きます。
Moment.js ライブラリの追加
GASで日付のフォーマットをしたいので、Moment.js
を追加します。
リソース > ライブラリ
で出てきたダイアログの 「ライブラリを追加」のテキストボックスに MHMchiX6c1bwSqGM1PZiW_PxhMjh3Sh48
を入力して選択します。
バージョンを選択したら保存を押せばライブラリが追加できます。
更新されたセルの値を取得する
今回は最後の列であるC列が更新されたらSlackに通知したかったので以下のようなコードになりました。
また、更新されたセルに対してoffset
を呼び出し、A列とB列のセルの値も一緒に取得してしまいます。
function addKPT() {
var mySheet = SpreadsheetApp.getActiveSheet();
var myCell = mySheet.getActiveCell();
if (mySheet.getSheetName() == 'KPT' && myCell.getColumn() == 3) {
// KPTという名前のシートの3列目が更新された
var description = myCell.getValue(); // C列
var date = myCell.offset(0, -2).getValue(); // 同じ行の左2つ隣
var kpt = myCell.offset(0, -1).getValue(); // 同じ行の左隣
slackPost(date, kpt, description); // このあと書きます
}
}
Slackに通知する
せっかくなのでちょっとリッチな感じで通知してみます。
コードはこんな感じになりました。
// 通知の色を決める
function getColor(kpt) {
switch(kpt) {
case 'Keep' : return 'good';
case 'Problem' : return 'danger';
case 'Try' : return 'warning';
}
}
function slackPost(date, kpt, description){
var moment = Moment.moment(date);
date = moment.format('YYYY/MM/DD');
var pretext = date + ' ' + kpt;
var color = getColor(kpt);
var payload = {
'pretext' : pretext,
'color' : color,
'fields': [
{
'title': kpt,
'value': description,
'short': false
}
]
};
var options = {
'method':'POST',
'contentType': 'application/json',
'payload' : JSON.stringify(payload)
};
var url = 'IncomingWebhooksで生成されたURL';
UrlFetchApp.fetch(url, options);
}
トリガーを設定する
GoogleSpreadSheetが更新されたらaddKPTを呼び出すように設定します。
編集 > 現在のプロジェクトのトリガー
を選択し、ダイアログを開いたら以下のように設定します。
これでシートに変更があったたびにスクリプトが呼ばれるようになります。
結果
GoogleSpreadSheetを以下のように編集してみます。
A | B | C |
---|---|---|
2018/01/05 | Keep | これはキープ |
2018/01/05 | Try | これはトライ |
2018/01/05 | Problem | これはプロブレム |
するとSlackに通知が・・・
いい感じになりました