GoogleSpreadSheetの更新履歴をGASでいい感じにSlackに通知する

More than 1 year has passed since last update.


この記事について

この記事では、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上で必要になります。

Incoming WebHooks   Slack App Directory.png

名前は無機質ですが、アイコンは:innocent:にしてみました。

個人的にはGoogleの:innocent:のほうが好きです :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を呼び出すように設定します。

編集 > 現在のプロジェクトのトリガーを選択し、ダイアログを開いたら以下のように設定します。

KPT_Slack通知 (1).png

これでシートに変更があったたびにスクリプトが呼ばれるようになります。


結果

GoogleSpreadSheetを以下のように編集してみます。

A
B
C

2018/01/05
Keep
これはキープ

2018/01/05
Try
これはトライ

2018/01/05
Problem
これはプロブレム

するとSlackに通知が・・・

スクリーンショット 2018-01-05 21.46.30.png

いい感じになりました :innocent: