スプシと連携し毎日の当番をお知らせするSlack botの作成

# 目次
[・はじめに](#はじめに)
[・当番表作成](#当番表作成)
　[・当番表の完成図](#当番表の完成図)
　[・祝日シートの作成](#祝日シートの作成)
　[・祝日と休日を除いた日付で当番表を作る](#祝日と休日を除いた日付で当番表を作る)
[・bot作成](#bot作成)
　[・Slackに送るためのWebhookURLを取得する](#slackに送るためのwebhookurlを取得する)
　[・GASを書いて当日の担当者を通知するbotを作る](#gasを書いて当日の担当者を通知するbotを作る)
　[・定期的に自動実行する](#定期的に自動実行する)
[・参考ページ](#参考ページ)

# はじめに
社内である業務を当番制にしようという話が出たのでスプレッドシートで当番表を作りましたが、わざわざ毎日スプシを見にいくのは面倒なので、GASを使ってその日の担当者をSlackに通知するbotを作ってみます。
また、休日祝日にSlackが飛ばないように設定していきます。
# 当番表作成
ここから祝日・休日を除いた当番表の作り方を説明します。
すでに当番表があり、あとはbotを作るだけという状態の方は[bot作成](#bot作成)から始めてください。
#### 当番表の完成図
ここでは下記のような、祝日・休日を除いた営業日とその日の当番を記したスプレッドシートを作成していきます。
名前や日付の入力は簡単だと思うので、休日祝日を省く方法について説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1119101/de58debb-1404-32fc-b142-80c49bbecbb6.png)
#### 祝日シートの作成
1枚目のシートの名前を当番表、2枚目のシートの名前を祝日などとして、祝日のシートにデータを入力します。
「エクセル 祝日」と検索するとそのままコピペできるものが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1119101/b0118731-ffbb-493d-e882-89f491d9bf56.png)
#### 祝日と休日を除いた日付で当番表を作る
今度は1枚目の当番表シートに移って、A列に全ての日付を記入し、B列には`=NETWORKDAYS(A1,A1,'祝日'!$A$1:$A$16)`とすることで、その日付が営業日であれば1、祝日or休日であれば0が入るようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1119101/9efe7526-2afc-8349-feb7-f318d926ca74.png)
次に、C列に`=FILTER(A1:A59,B1:B59=1)`とすることでA列の中からB列が1のもの、つまり営業日だけを抽出してくれます。（59の部分は各々の最終行に変えてください。今回は2/1から3/31までで作っているのでデータの最終行が59になっています。）
ここまでできたらD列に当番の名前を記入していきます。今回は例として鈴木、山田、田中、佐藤の4人が順番に担当することにしています。
また、A、B列は見る必要がないので非表示にしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1119101/700eddf2-2624-3aa2-438a-74b0231a7fae.png)
# bot作成
#### Slackに送るためのWebhookURLを取得する
次に、Webhook URLというものを取得する必要があります。
GASの中でWebhook URLというものを指定してこのSlackのこのチャンネルに送ってくださいね、ということを設定するためです。
https://slack.com/services/new/incoming-webhook にアクセスして、「チャンネルへの投稿」からbotを追加したいチャンネルを選び、「Incoming Webhookインテグレーションの追加」を押します。
すると、Webhook URLが発行されます。GASを書く時に使うのでメモしておきましょう。
また、下のほうに行くと「名前をカスタマイズ」でbotの名前、「アイコンをカスタマイズする」でbotのアイコンを設定できます。
全て設定が終わったら「設定を保存する」を押しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1119101/b0c1d316-b113-b91f-d2e8-7ddb37cb9fa6.png)
#### GASを書いて当日の担当者を通知するbotを作る
ここまでの設定が終わったらGASを書いていきます。
「拡張機能」から「Apps Script」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1119101/9e4257fc-511d-2e24-92d1-2bddeb15ff6b.png)
デフォルトで記入されている

```
function myFunction() {
}
```

は消して以下のコードを貼り付けてください。

``` 
function myFunction() {
 //参照するスプレッドシート
 var obj = SpreadsheetApp.openById('hogehoge'); 
 var sheet = obj.getSheetByName("当番表"); 
 //最終行と担当者、日付データの取得
 var lastrow = sheet.getLastRow();
 var name_array = sheet.getSheetValues(1, 4, lastrow, 4).filter(String);
 var date_array = sheet.getSheetValues(1, 3, lastrow, 3).filter(String);
 // 今日の日付をフォーマット指定して取得する
 var today = Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyy/MM/dd");
//dateという空の配列を作る
 var date = new Array();
// スプシの日付のレコード数だけループ処理する
 var date_num = date_array.length;
 for(var i = 0; i < date_num; i++) {
     // スプシの日付を今日の日付と同様のフォーマットで取得し、dateという空の配列に入れていく
     date.push(Utilities.formatDate(new Date(date_array[i][0]), "Asia/Tokyo", "yyyy/MM/dd"));
     // 今日の日付と一致した日付の行番号を習得、なければ-1が入る
     var num = date.indexOf(today);
    }
 // 取得した行番号を、名前の配列に渡して、該当する人の名前を取得する
 var member = name_array[num][0];
 //表示する内容
 var options =
{
   "method" : "post",
   "contentType" : "application/json",
   "payload" : JSON.stringify(
     {
       "text" : "今日のサポート担当は" + member + "さんです",
       link_names: 1
     }
   )
 };
 //投稿、num=-1（スプシに日付がない、つまり休日）のときは投稿しない
 if (num != -1){
   UrlFetchApp.fetch("hogehoge", options);
 }
} 
```
◯注意
・上から3行目の`var obj = SpreadsheetApp.openById('hogehoge'); `のhogehogeには各々のスプレッドシートのURLのdocs.google.com/spreadsheets/d/<font color="Red">hogehoge</font>/edit#gid=0にあたるところが入ります。
・下から3行目の`UrlFetchApp.fetch("hogehoge", options);`のhogehogeには前述の[Slackに送るためのWebhookURLを取得する](#slackに送るためのwebhookurlを取得する)で取得済みのWebhook URLが入ります。
・ファイルの名前がデフォルトでは「コード.gs」となっていますがこのままでは実行ボタンが押せないので適当に名前を変えてください
◯補足
・上記コードの7,8行目のname_arrayやdate_arrayはそれぞれスプシの4列目、3列目と指定してあるのですが、なぜか余計な要素が入ってしまっています。なのでname_array[num][0]、date_array[i][0]のように2つ目を[0]として、指定した行番号のデータのさらに0番目の要素、という指定の仕方をしています。

注意事項をクリアし、書き終わったら実行ボタンを押してSlackにbotが飛ぶことを確認しましょう。
#### 定期的に自動実行する
今のままでは毎回手動で実行ボタンを押す必要があり面倒なので、自動で実行していきます。
左の方にあるトリガーボタン（時計マーク）をクリックして右下の「トリガーを追加」をクリックします。
「イベントのソースを選択」を「時間主導型」に変更し、「時間ベースのトリガーのタイプを選択」を「日付ベースのタイマー」、「時刻を選択」で実行したい時間帯を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1119101/5c9fe003-4da3-7f82-b4b6-5fc44b1acd96.png)
設定が終わったら右下の保存を押します。
これで祝日、休日以外毎日決まった時間に担当者をお知らせするbotが作成できました。
# 参考ページ
下記サイトもとてもわかりやすかったので、是非参考にしてみてください。
https://www.tam-tam.co.jp/tipsnote/javascript/post8499.html
https://note.com/ajike_honda/n/n1338f719fda2