GASを使って、スプレッドシート更新時にSlack通知を飛ばしてくれるbotを作ってみた

営業をする際、代理店とCRMを共有するわけにもいかないので、スプレッドシートで案件管理を行っていた所、シートが更新されたときにSlack通知が飛んできたら便利だと思い、Google Apps Scriptを使って実装してみました。

イメージとしては、シートのG列が更新された際に、「企業名」、「従業員数」、「ステータス」をSlackに通知します。

<img width="1384" alt="スクリーンショット 2019-07-15 14.41.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392294/116530d8-1c61-1c28-b700-f6be96778591.png">

<img width="481" alt="スクリーンショット 2019-07-15 15.51.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392294/190b981e-57fc-811a-996a-4d3ff8449524.png">


# Github
[matsukazu1112/spreadsheet_notification](https://github.com/matsukazu1112/spreadsheet_notification)

# 大まかな流れ
 
1. GASを起動
2. Incoming Webhookで、SlackとGASの連携を設定
3. GASのスクリプト実行のトリガーを作成
4. コードの実装

# 1. GASを起動
スプレッドシートの上のバーから、「ツール」→「スクリプトエディタ」で起動させることが出来ます。

<img width="289" alt="スクリーンショット 2019-07-15 14.01.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392294/6865c5fc-beed-b2d5-a7da-0a74890021d6.png">

# 2. Incoming Webhookで、SlackとGASの連携を設定
手順は[こちらの記事](https://qiita.com/vmmhypervisor/items/18c99624a84df8b31008
)を参照しました。

# 3. GASのスクリプト実行のトリガーを作成
「編集」→「現在のプロジェクトのトリガー」を選択。
<img width="344" alt="スクリーンショット 2019-07-15 14.18.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392294/70d5f545-f7b8-8d7e-fa44-de1dfa07cfcd.png">

右下の「トリガーを追加」を選択。
<img width="1420" alt="スクリーンショット 2019-07-15 14.18.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392294/5de4ffee-6646-e1aa-7cbd-e4733e6c196e.png">

実行する関数や、イベントソースを設定。今回の場合、スプレッドシートの変更をトリガーにし、保存。
<img width="668" alt="スクリーンショット 2019-07-15 14.19.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392294/2332cbb6-bdcf-87f7-c14c-e007c93ea75b.png">

# 4.コードの実装
ここからが本番です。

最初にスプレッドシートから変更の内容を取得してくるメソッドを定義。

```javascript
/**
 * スプレッドシートから必要なデータを取り出す
 *
 * @ param object e
 * @ return data
 */
function getValue(e){  
  var notifySheet = SpreadsheetApp.getActiveSpreadsheet();
  var active_sheet = SpreadsheetApp.getActiveSheet();
  var my_cell = active_sheet.getActiveCell();
  var active_sheet_column = my_cell.getColumn();
  var rowNum = my_cell.getRow();
  
  var data =
'企業名：'+ notifySheet.getRange('B' + rowNum).getValue()+ '\n' 
+'従業員数：' + notifySheet.getRange('C' + rowNum).getValue() + '\n' 
+'案件ステータス：' + notifySheet.getRange('G' + rowNum).getValue() + '\n'
+'https://docs.google.com/spreadsheets/hogehoge';

  if (active_sheet_column !== status_column){
    return;
  }
  
  return data;
}
```
getValueという関数で、data変数で取得した内容を、後ほど記載するメイン処理に値を返しています。

今回はスプレッドシートのG列が編集されたときにのみ通知を送りたいので、if文を用いて、アクティブシートのカラムが、status_culumn(=7列目と別途定義してある）と一致するときのみ、データを返すような設定にしました。

```javascript
/**
 * スラックにPostする際の詳細の設定
 *
 * @ param object value
 * @ return void
 */
function postMessage(value){
  var options = {
    'method': 'post',
    'headers': {'Content-type': 'application/json'},
    'payload' : JSON.stringify({
    'channel' : '#チャンネル名',
      'attachments':[
       {                                                              
        'fallback': '代理店案件アップデート通知',
        'color': '#36a64f',
        'title': '代理店が案件を更新しました',
        'title_link': 'https://docs.google.com/spreadsheets/hogehoge',
        'text': value,                                                 
       }
      ]
    })
  };
  UrlFetchApp.fetch("https://hooks.slack.com/services/hogehoge", options);  
 }
```

ここでは、Slackに投稿する際の詳細設定を定義しています。[こちらの記事](https://qiita.com/ref3000/items/83b36541f61e334b542e)を参考にしました。

上で定義してきた処理とその返り値を下記のメイン処理を通して遂行しています。eはスプレッドシートから取得した値です。eをgetValueメソッドに渡し、その結果をvalueという変数で定義します。また先にあったように、G列以外のデータが取得されて、都度Slackに通知が行ってしまうと鬱陶しいので、valueの値が存在するときのみ、処理を実行する旨をif文で定義しています。

```javascript
/**
 * メイン処理
 *
 * @ param object e
 * @ return void
 */
function postSheetChange(e){
  　
  const value = getValue(e);
  
  if (value) {
    postMessage(value);
  }
}
```

上記のやり方で無事、スプレッドシートのG列を編集したときに、Slackに通知が飛びました！