スプレッドシートの日付の列が今日だったら必要な列の情報を拾ってSlackに送る

スプレッドシートのデータをSlackに通知する処理を書いたのでメモです。このようなスプレッドシートがあったとして、日付が今日だったらその行の項目1と項目3の内容をSlackに送ってみます。スケジュールに仕掛けておくことで毎朝Slackに通知することもできます。

<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/82ca58ec-b600-9e00-c60d-feb797908a31.png">
（日付は順序よく並んでいなくてもよい。途中に空欄があっても大丈夫。）


ツール -> スクリプトエディタ　を開いてスクリプトファイルを登録する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/50e3bdcf-07d0-5d60-835d-a235756eb3d8.png)
スクリプトファイル コピペ用（"//編集"はそれぞれの環境で編集が必要）

```javascript
function checkCell() {
    // スプレッドシートを指定（URLからコピペする）
    var spreadsheet = SpreadsheetApp.openById('xxxxxxxxxxxxx') //編集
    //シートの名前を指定する
    var sheet = spreadsheet.getSheetByName('管理表1'); //編集
   
    //今日の日時を取得する
    var today = new Date()
    //console.log(today); //Sat Jun 20 2020 01:14:58 GMT+0900 (日本標準時)
   
    var string = "";

        //必要な列のデータを配列で取得していく。getValues()を使って配列でvaluesXに入れる。
        //日付の列を取得する。
        var rangeA = sheet.getRange("A:A");
        var valuesA = rangeA.getValues();

        //項目1の列
        var rangeB = sheet.getRange("B:B");
        var valuesB = rangeB.getValues();

        //項目3の列
        var rangeD = sheet.getRange("D:D");
        var valuesD = rangeD.getValues();
    
    //valuesA[1][0]やvaluesA[2][0]にデータが入っているのでforをネストさせている
    for (var i = 0; i < valuesA.length; i++) {
        var date = "";
        for (var j = 0; j < valuesA[i].length; j++) {
            date = valuesA[i][j];

              //MomentjsのisSameで日付が同じかどうか（今日かどうか）を判定。日付が今日ならstringに代入する。
              if ( Moment.moment(today).isSame(date,'day')) {
                string = string + ('\n') + " 項目1は " + valuesB[i][j] + "です。" + " 項目3は " + valuesD[i][j] + "です。"; //編集
              }
            }
        }
    //stringが空だったら何もしないで終わる。
    if ( !string ) {
    return ;
    }
    //stringに何か入っていたらSlackに送信する関数を実行する。
      sendSlackMessage(string);
  }

  // Slackへ送信するfunction
  function sendSlackMessage(message) {
   
    var postUrl = 'https://hooks.slack.com/services/xxx/xxx/xxxxxxxx' //編集
   
    var jsonData =
    {
       "text" : "*今日の予定*" + message //編集
    };
    var payload = JSON.stringify(jsonData);
    var options =
    {
      "method" : "post",
      "contentType" : "application/json",
      "payload" : payload
    };
    UrlFetchApp.fetch(postUrl, options);
  }
```
SpreadsheetApp.openByIdに入れたIDはURLのマスクしている部分
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/f7e428dd-913f-b922-0777-68c743e52542.png)


日付の処理を扱うライブラリMoment.jsを使ったのでインストールする。ここを参考にしました。
https://tonari-it.com/gas-moment-js-moment/

リソース -> ライブラリ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/2373564e-0871-5a86-357a-0e8cb5438d2d.png)

スクリプトID: MHMchiX6c1bwSqGM1PZiW_PxhMjh3Sh48
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/4a47ff8f-cc23-da4b-49d3-d65717e6ccdb.png)



インストールしたら手動実行してみる（checkCellを選んで▶をクリック）。最初は権限の許可が必要なので許可する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/2ae1bc2b-b7e7-3f6a-0c28-836950fb9dbb.png)

Slackにこんなふうに送られてきたのでとりあえずOKとします。
<img width="440" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/7417b713-045c-9793-f31e-b04c6ba09965.png">


[時間主導型]でタスクに登録しておけば定期的に通知もできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/12154ecf-67cd-19a2-d502-dec11f23b9e9.png)

<img width="430" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75914/19a694b6-acaf-1dfb-9892-c8ec944651d2.png">