Incoming Webhookからランダムに掃除の通知をしよう！

## 何をしたいのか？
Bot(Incoming Webhook)に掃除する日を決めてもらい、指定する時間に通知をしてほしい。



## きっかけ
- 複数人で利用している事務所がある
- 定期的に掃除する日がない
- 掃除のために定期的に集まるのは難しい

 → Botから通知で居合わせた人たちで掃除しよう
と考えた



## 使うアプリケーション
- Slack
業務でよく使うため

- Incoming Webhook
常時稼働が不要とサーバーを立てる必要がない

- Google Apps Script(GASと略す)
定期的にコードを実行する設定がしやすい



## 具体的な進め方
1. SlackのチャンネルとIncoming Webhookを連携させる
2. Incoming Webhookから1/30の確率でSlackへ通知するように、GASにコードを書く
3. GASのnotifyトリガーで決まった時間帯にコードを実行するように設定する



### 1. SlackのチャンネルとIncoming Webhookを連携させる

> 参考　[Slack Botの種類と大まかな作り方](https://qiita.com/namutaka/items/233a83100c94af033575#incoming-webhooks)

https://slack.com/apps/A0F7XDUAZ--incoming-webhook-?next_id=0 にアクセスして、**Slackに追加**を押す


**チャンネルへの投稿**で導入したいチャンネルを選択する

※　**Webhook URL** はあとで使うため、コピーする
![スクリーンショット 2020-05-17 23.29.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258117/9c66d4d5-6bfc-853e-f91d-30be4526769e.png)



### 2. Incoming Webhookから1/30の確率でSlackへ通知するように、GASにコードを書く

https://drive.google.com/drive/u/0/my-drive にアクセスし、左上から**新規→その他→Google Apps Script**を押す

[![Screenshot from Gyazo](https://gyazo.com/f8df8b5130ff9560c45978fa0ea15f93/raw)](https://gyazo.com/f8df8b5130ff9560c45978fa0ea15f93)

　　コードは以下のように書いた
　　Incoming Webhookからのメッセージは自由に変えられる

> 参考　[Block Kit Builder](https://api.slack.com/tools/block-kit-builder?mode=message&blocks=%5B%7B%22type%22%3A%22section%22%2C%22text%22%3A%7B%22type%22%3A%22mrkdwn%22%2C%22text%22%3A%22Hello%2C%20Assistant%20to%20the%20Regional%20Manager%20Dwight!%20*Michael%20Scott*%20wants%20to%20know%20where%20you%27d%20like%20to%20take%20the%20Paper%20Company%20investors%20to%20dinner%20tonight.%5Cn%5Cn%20*Please%20select%20a%20restaurant%3A*%22%7D%7D%2C%7B%22type%22%3A%22divider%22%7D%2C%7B%22type%22%3A%22section%22%2C%22text%22%3A%7B%22type%22%3A%22mrkdwn%22%2C%22text%22%3A%22*Farmhouse%20Thai%20Cuisine*%5Cn%3Astar%3A%3Astar%3A%3Astar%3A%3Astar%3A%201528%20reviews%5Cn%20They%20do%20have%20some%20vegan%20options%2C%20like%20the%20roti%20and%20curry%2C%20plus%20they%20have%20a%20ton%20of%20salad%20stuff%20and%20noodles%20can%20be%20ordered%20without%20meat!!%20They%20have%20something%20for%20everyone%20here%22%7D%2C%22accessory%22%3A%7B%22type%22%3A%22image%22%2C%22image_url%22%3A%22https%3A%2F%2Fs3-media3.fl.yelpcdn.com%2Fbphoto%2Fc7ed05m9lC2EmA3Aruue7A%2Fo.jpg%22%2C%22alt_text%22%3A%22alt%20text%20for%20image%22%7D%7D%2C%7B%22type%22%3A%22section%22%2C%22text%22%3A%7B%22type%22%3A%22mrkdwn%22%2C%22text%22%3A%22*Kin%20Khao*%5Cn%3Astar%3A%3Astar%3A%3Astar%3A%3Astar%3A%201638%20reviews%5Cn%20The%20sticky%20rice%20also%20goes%20wonderfully%20with%20the%20caramelized%20pork%20belly%2C%20which%20is%20absolutely%20melt-in-your-mouth%20and%20so%20soft.%22%7D%2C%22accessory%22%3A%7B%22type%22%3A%22image%22%2C%22image_url%22%3A%22https%3A%2F%2Fs3-media2.fl.yelpcdn.com%2Fbphoto%2Fkorel-1YjNtFtJlMTaC26A%2Fo.jpg%22%2C%22alt_text%22%3A%22alt%20text%20for%20image%22%7D%7D%2C%7B%22type%22%3A%22section%22%2C%22text%22%3A%7B%22type%22%3A%22mrkdwn%22%2C%22text%22%3A%22*Ler%20Ros*%5Cn%3Astar%3A%3Astar%3A%3Astar%3A%3Astar%3A%202082%20reviews%5Cn%20I%20would%20really%20recommend%20the%20%20Yum%20Koh%20Moo%20Yang%20-%20Spicy%20lime%20dressing%20and%20roasted%20quick%20marinated%20pork%20shoulder%2C%20basil%20leaves%2C%20chili%20%26%20rice%20powder.%22%7D%2C%22accessory%22%3A%7B%22type%22%3A%22image%22%2C%22image_url%22%3A%22https%3A%2F%2Fs3-media2.fl.yelpcdn.com%2Fbphoto%2FDawwNigKJ2ckPeDeDM7jAg%2Fo.jpg%22%2C%22alt_text%22%3A%22alt%20text%20for%20image%22%7D%7D%2C%7B%22type%22%3A%22divider%22%7D%2C%7B%22type%22%3A%22actions%22%2C%22elements%22%3A%5B%7B%22type%22%3A%22button%22%2C%22text%22%3A%7B%22type%22%3A%22plain_text%22%2C%22text%22%3A%22Farmhouse%22%2C%22emoji%22%3Atrue%7D%2C%22value%22%3A%22click_me_123%22%7D%2C%7B%22type%22%3A%22button%22%2C%22text%22%3A%7B%22type%22%3A%22plain_text%22%2C%22text%22%3A%22Kin%20Khao%22%2C%22emoji%22%3Atrue%7D%2C%22value%22%3A%22click_me_123%22%7D%2C%7B%22type%22%3A%22button%22%2C%22text%22%3A%7B%22type%22%3A%22plain_text%22%2C%22text%22%3A%22Ler%20Ros%22%2C%22emoji%22%3Atrue%7D%2C%22value%22%3A%22click_me_123%22%7D%5D%7D%5D)

```javascript


function main(){
  var result;

//　1/30の確率で通知させたい
//Math.random()は0~1未満までをランダムに生成
//Math.floor()は小数点以下を切り捨て整数を返す
//0~29のうち29以上であればIncomigWebhookから通知が来る
  result = Math.floor(Math.random()*30); 
  if(result >= 29){
    Do_notify();
  }
}

function Do_notify() {
  var options =
  { // 以下のテキストはJSONの様式にそって書くと変更できる
    "method" : "post",
    "contentType" : "application/json",
    "payload" : JSON.stringify(
      {
        "attachments":[
      {
         "fallback":"今日は掃除の日です",
         "pretext":"<!channel> 今日は掃除の日です",
         "color":"#D00000",
         "fields":[
            {
               "title":"掃除内容は以下の通りです ",
               "value":"*_掃除機かける_* \n *_デスクのアルコール除菌_* \n *_ホワイトボード消し_*",
               "short":false,
              "mrkdwn_in": ["value"]
            }
         ]
        }
       ]
      }
    )
  };
 
  UrlFetchApp.fetch("https://hooks.slack.com/services/XXXXXXX/XXXXXX/XXXXXXXXXXXXXX", options);
}

```


### 3. GASのnotifyトリガーで決まった時間帯にコードを実行するように設定する

以下のボタンを押してトリガーを設定する

<img width="352" alt="スクリーンショット 2020-05-17 23.48.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258117/a807f4c2-61a4-7029-3920-5856aa8c67fd.png">

**トリガーを追加**を押すと分ベースや時間ベースで定期的に実行できるように設定できる

１日毎の１７時から18時の間で実行するようにセットし、**保存**を押せば完成


<img width="517" alt="スクリーンショット 2020-05-17 23.56.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258117/badbebaa-51bb-678a-1cc1-ab1885147eb6.png">


## 参考にした記事
- [【Slack】これなら簡単!Webhookでメッセージ送信するまでの3ステップ](https://www.sejuku.net/blog/74471)
- [Slack での Incoming Webhook の利用](https://slack.com/intl/ja-jp/help/articles/115005265063-Slack-%E3%81%A7%E3%81%AE-Incoming-Webhook-%E3%81%AE%E5%88%A9%E7%94%A8)
- [
Block Kit Builder](https://api.slack.com/tools/block-kit-builder?mode=message&blocks=%5B%5D)