【GAS + Slackbot】毎朝担当を通知する当番botをつくる #2

## はじめに

こちらの記事の続きです。
https://qiita.com/k_ued/items/499b25c0bd56094c7cfd
今回はこのSlack botに機能を追加して、運用できる形にしていきます。

## 追加機能

毎朝の通知に加え、以下の機能を追加します。

### 通知機能
- 平日の毎朝8-9時の間に、今日の朝会担当者をメンション付きで通知します。
  - 通知の例：「@ hogehoge 今日の朝会当番はほげほげさんです。」
- 月・木曜日は朝会担当者とは別に、フリートーク担当者を通知します。
- フリートーク担当者については、月・木曜日の朝11-12時に次の担当者を通知します。
- 長期休暇など、通知をしない期間を設定することができます。

### 担当者変更機能

- 各コマンドの引数に`d`もしくは`f`を指定することで、朝会とフリートークのどちらをスキップするか決めることができます。
  - 例：`/skip d`：今日の朝会担当者をスキップ
- Slackから`/skip`コマンドを実行することで、今日の担当者をスキップすることができます。
- Slackから`/pass`コマンドを実行することで、今日の担当者を1周分スキップすることができます。
- Slackから`/pone`コマンドを実行することで、今日の開催を延期することができます。
- Slackから`/check`コマンドを実行することで、次の担当者を確認することができます。

## ソースコード

以下のGitHubにソースコードを載せています。
GASのワークスペースにコピペし、BOTのトークンなどの必要な情報を入力します。

https://github.com/watamoko/slack-daily-notifications

## 導入方法

### 1. GASの設定

#### 1-1. ソースコードのコピペ
[GAS](https://script.google.com/home/start)で新規プロジェクトを作成したのち、とりあえずGitHubのソースコードをすべてコピペしてください。（README.mdとappsscript.jsonはコピペしないでください）
一応ファイル分割されていますが、GASの特性上、`コード.gs`にすべて貼り付ける形でもOKです。
ただ、分割しておいた方が後々メンテナンスしやすくなります。

#### 1-2. ライブラリの追加

GASの一部の処理に`SlackApp`というAPIを使っているので、インストールします。
サイドメニューの「ライブラリ」の右にある＋ボタンを押下し、以下のスクリプトIDをペーストします。
`1on93YOYfSmV92R5q59NpKmsyWIQD8qnoLYk-gkQBI92C58SPyA2x1-bq`
「検索」ボタン → 「追加」ボタンの順にクリックします。

#### 1-3. タイムゾーンの設定

GASのタイムゾーンを日本に設定します。
サイドメニューの「プロジェクトの設定」から変更できます。

#### 1-4. トリガーの設定

毎朝同じ時刻に実行されるトリガーを追加します。
[前回](https://qiita.com/k_ued/items/499b25c0bd56094c7cfd)の問題は改善されたため、追加するトリガーは2つでOKです。
以下の2つのトリガーを追加します。
![gas_trigger_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429691/75f22b00-591d-c6fa-7285-9751dcf68ba9.png)
![gas_trigger_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429691/db5b94f0-1d12-28ef-21cd-8d1384200c9e.png)

### 2. GSSの設定

スプレッドシートで当番表を作ります。
1. 新規スプレッドシートを作成し、シート名を「当番表」に変更します。
1. A列に行数、B列に名前、C列にSlackのユーザーID、D列に0、E列の先頭に「当番」の文字列、F列に0、G列の先頭に「当番」の文字列を入力します。
1. 2のA,B,C,D,F列に対しての操作を司会持ち回り担当者数分追加します。
1. J1セルにメンバ数を入力します。

すべて入力後、以下のような状態になっていればOKです。
![gss_dutyinfo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429691/a7efbdc3-9e75-ff0f-04c3-2e4fb0c84f9d.png)
完成したらスプレッドシートIDを保管しておきます。

### 3. Slack Botの設定

通知やSlash Commandを実行するSlack Botを作成します。
基本的な作成方法は以下の記事を参考にしてください。

https://qiita.com/k_ued/private/07978ede29a67be761bb

#### 権限の設定とアプリのインストール

[OAuth & Permissions - Scopes - Bot Token Scopes]に以下の4つの権限を追加してください。
```
- chat:write
- chat:write.customize
- chat:write.public
- commands
```

権限を追加するとワークスペースにアプリをインストールできるようになります。
アプリをインストールし、発行される[Bot User OAuth Token]を保管しておきます。

### 4. GASに必要な情報を設定

ここまでの手順で取得したトークンやIDをGASに追記します。
以下の操作をGASのmain.gsに対して行います。
- 1行目のGSS_IDにスプレッドシートIDをペースト
- 3行目のGSS_SHEET_NAMEにユーザー数を入力
- 23行目のCHANNELにメッセージを投稿するチャンネル名を入力（例：#general）
- 24行目のSLACK_BOT_TOKENにSlackbotのトークンをペースト

ペーストしたコードでデプロイします。
GASのデプロイ方法については、以下の記事が参考になると思います。

https://www.shanaidx.com/webapp_deploy/#:~:text=GAS%E3%82%92%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88,%E6%96%B0%E3%81%97%E3%81%84%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%80%8D%E3%82%92%E9%81%B8%E3%81%B3%E3%81%BE%E3%81%97%E3%82%87%E3%81%86%E3%80%82

デプロイできたら、ウェブアプリURLを保管しておきます。

### 5. Slash Commandsの設定

これが最後の設定項目です。
Slack Botの設定から[Slash Commands - Create New Command]から以下の4つのコマンドを追加します。

1. `/skip`
![slashcommand_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429691/7ea94984-5748-1d3b-67e9-7e09cf61439f.png)
1. `/pass`
![slashcommand_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429691/ac3624de-d527-b1da-5e16-aa209ae071b8.png)
1. `/pone`
![slashcommand_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429691/bcf938d3-9c76-f97a-86c6-d3c77f02c719.png)
1. `/check`
![slashcommand_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429691/b04ddbcf-2211-211c-d174-ff00bc2a86cf.png)

同じワークスペースの他のチームとコマンドを区別したい場合、Commandに登録するコマンドを`/skip:Aチーム`のように、`:`で分けることができます。