LoginSignup
0
2

More than 5 years have passed since last update.

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

Posted at

この記事について

この記事では、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:

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2