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

# この記事について
この記事では、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](https://qiita-image-store.s3.amazonaws.com/0/40456/d521f4d4-a853-52b6-2667-81f792909568.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列のセルの値も一緒に取得してしまいます。

```javascript
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に通知する
せっかくなのでちょっとリッチな感じで通知してみます。
コードはこんな感じになりました。

```javascript
// 通知の色を決める
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](https://qiita-image-store.s3.amazonaws.com/0/40456/c643d455-d111-5a8b-6a4c-c43d6de47b9d.png)

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

# 結果

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

|A|B|C|
|:---|:---|:---|
|2018/01/05|Keep|これはキープ|
|2018/01/05|Try|これはトライ|
|2018/01/05|Problem|これはプロブレム|

するとSlackに通知が・・・

<img width="501" alt="スクリーンショット 2018-01-05 21.46.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/40456/0a57e8c3-9cd8-623f-a1f6-de842d0eceaf.png">

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