【GAS x slack】複数ユーザーにまとめてslackでDMを送る自動化

## 概要
* slack内のメンバーの中で、期日までにやって欲しいことが完了していないメンバーにリマインドのDMを送りたい
* けれど、1人1人にメッセージを送っていくのは大変なので、GASとslack APIを連携し、自動化した

## やりたいこと
* スプレッドシートに一覧で表示されている、リマインドが必要なメンバーを取得して、全員に個別でDMを送りたい。
* 送るメッセージの内容は、特定のセル（ここでは、E12セル
）に表示させている（以下参照）
![Screenshot 2021-09-09 at 11.17.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566653/e3d6eed7-e442-cba8-a0dc-262cba2bdbbb.png)

## 使うもの
* スプレッドシート
    * 以下の情報を記載している
        * メッセージを送りたいメンバーの名前
        * それぞれのSlackID
        * 送るメッセージの内容
* Google Apps Script 
* Slack 
    * アプリを1つ作る必要があるので、管理者権限 or 管理者の承認がマスト

## 書いたコード
以下のスクリプトを書いて、スプレッドシートと接続。
ここで出てくるAPItokenは、slack側で発行する必要がある。

```javascript
const APIToken = "token"; // 自分でSlack Appを作成し、発行されたtokenに差し替えてください
const sp = SpreadsheetApp.openById('spreadsheet_id'); // Slack IDが記載された スプレッドシートのURLに差し替えてください
const sheetName = sp.getSheetByName('シート名'); // 使用するシート名に差し替えてください
const infoCol = {
  "SlackID": "B", // DMを送る相手のIDが記載された列
  "content": sheetName.getRange('E12').getValues().toString().replace(/,/g , "\n") // 送る内容が記載されたセル
}

function main() {
  const rowBegin = 2; // メンバーリストの開始行
  const rowEnd = 280; // メンバーリストの最終行（最後の行を超えていれば、アバウトで大丈夫）
  const APIMethodUrl = "https://slack.com/api/chat.postMessage";

    postMessage(rowBegin, rowEnd, APIMethodUrl);
}

function getUserID(row) {
  let userID = sheetName.getRange(infoCol.SlackID + row).getValue();

  return userID;
}


function postMessage(rowBegin, rowEnd, APIMethodUrl) {
  for (let row = rowBegin; row < rowEnd; row++) {
    let userID = getUserID(row);

    if (userID == "")
      continue;

let payload = {
      "token": APIToken,
      "channel": userID,
      "text": infoCol.content
    };
    
    let params = {
      "method" : "post",
      "payload" : payload
    };
    
    UrlFetchApp.fetch(APIMethodUrl, params);
  }
}
```

## slackとの連携
まずはslack上でbotを作成する必要がある。

slack画面上で、右上のAppディレクトリに移動。
![Screenshot 2021-09-09 at 11.21.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566653/71829aa4-824d-9a11-2a85-a32d968d39b2.png)

右上のビルドを選択。
![Screenshot 2021-09-09 at 11.22.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566653/f8399597-7303-650b-2a35-89fb722b20e6.png)

Create an appを選択。
![Screenshot 2021-09-09 at 11.23.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566653/0fd30493-35ea-fc1c-b8c8-bf8802c89655.png)

こんな表示が出てくるので、from scratch（0から作る）を選択。アプリの名前とワークスペースを選択するように指示されるので、よしなに選択。名前は後から変更可能。
![Screenshot 2021-09-09 at 11.23.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566653/52c328d3-d0de-0fc6-d2f7-6e89c76e887f.png)

メニューのOAuth & Permissionsから、botに以下のようにスコープの権限を渡す。
これで、botからDMを送ることができるようになる。
![Screenshot 2021-09-09 at 11.25.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566653/e429cf30-c8b0-fa34-2844-a1173caafa4f.png)

すると、tokenが発行されるので、bot user OAuth TokenをコピーしてGASに記述。
![Screenshot 2021-09-09 at 11.27.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566653/28dc8507-c5e2-5d28-d0bf-9c3929184d8f.png)


ここまでできたら、GASのエディタ画面から「実行」を選択。
![Screenshot 2021-09-09 at 11.32.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566653/c1ba2a7f-8bac-7e45-5db5-9951673ef4b0.png)



こんな感じでメッセージが飛んできた。
![Screenshot 2021-09-09 at 11.16.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566653/9aca299c-6c9b-ef7d-56d4-f3f0ec975595.png)