[GASでカンタン自動化] 個人にお知らせくん

# はじめに
メリ〜クリスマス🎄
クリスマス当日にかけこみでアドベントカレンダーの記事を書いております(^^;)

さっそく今回作った兄弟をご紹介！

# 今回作ったもの
個人にお知らせくん

個人個人にSlackのDMで同じお知らせをするのは手間がかかるのでめんどくさいですよね。もっと楽にできたらいいのにな〜と思っていたので今回はDMの一斉送信機能をGASで実装していきます。

# アプリ概要
スプレッドシートにメンバーリストを用意しました。メッセージを送信する必要がある人にチェックを入れて関数を実行すると用意したメッセージが一斉に送信されるという仕組みです。

# スプレッドシートの準備
メンバーリストを`list`という名前のシートに、DM内容を`message`という名前のシートに用意しました。

![スクリーンショット 2023-12-25 20.13.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303938/973788fc-ff7e-c4a5-7fbe-7e62aedb820e.png)

![スクリーンショット 2023-12-25 20.03.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303938/85909e8b-3bc9-10a7-7967-da9ca75f8f1b.png)

DMを送るためには個人の`メンバーID`というものが必要になるので、Slackを開いて以下の部分からIDを取得してください。有料アカウントだと一覧表示ができるらしいですが無料プランではそんな事できないので団体メンバーの30人分くらいは力技で回収しました。もっと人数が増えるとめんどくさいですがここは頑張りましょう。

![Qiita1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303938/828cac03-8a03-171b-b456-e392ba71bd30.png)

# Slackbotの準備
[こちらのページ](https://api.slack.com/apps)にアクセスして、`Create New App`を選択します。続いて`From scratch`を選んで新しいAppを作成しましょう。

![Group 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303938/e4e591cb-6015-8dd1-b2f5-b8c30a794318.png)

名前をつけて、botを追加するSlackのワークスペースを選択します。

![Group 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303938/92139bcb-49b7-1658-865f-4889a435f509.png)

次に権限の設定をします。`OAuth & Permissions`を選択し下の方までスクロールするとスコープの設定があります。`chat:write`と`im:write`の二種類を追加してください。

![Group 6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303938/d57612a0-e7e4-47f0-bf75-6a935669dde0.png)

![Group 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303938/d3445422-fac6-d237-2475-c6cad49b39e2.png)

表示名などを設定していきます。`App Home`から`Edit`を選択し、以下のようにします。Display Nameは日本語でも良いですが、Default usernameは小文字のアルファベットのみ利用できます。

![Group 5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303938/d6b97f02-cc04-8e35-5b95-74b4d83f28fd.png)

![Group 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303938/e09abb6d-c82e-fdcb-225c-aace73dd3a49.png)

最後に、個人にお知らせくんをワークスペースにインストールします。
`Install App`から`Install App to Workspace`を選択してください。許可するとトークンが表示されるのでメモしておきましょう。

これでSlackbotの準備は完了！さっそくプログラムを書いていきます。

# 一斉送信機能
用意したスプレッドシートから、`拡張機能` `Apps Script`を選択してGASを開きます。

![スクリーンショット 2023-12-25 21.30.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303938/5027081d-3b05-75a1-6c47-ef38d0930196.png)

以下のようにプログラムを書きました。

```javascript
// SlackAppのトークン
const SLACK_TOKEN = "コピーしたトークン";

// スプレッドシートIDとシート名
const SPREADASHEET_ID = "スプレッドシートID";
const SPREADASHEET_NAME_LIST = "list";
const SPREADASHEET_NAME_MESSAGE = "message";
const SPREADASHEET_LIST = SpreadsheetApp.openById(SPREADASHEET_ID).getSheetByName(SPREADASHEET_NAME_LIST);
const SPREADASHEET_MESSAGE = SpreadsheetApp.openById(SPREADASHEET_ID).getSheetByName(SPREADASHEET_NAME_MESSAGE);

// スプシから通知対象者にメッセージを送る
function check() {
  var last_row = SPREADASHEET_LIST.getLastRow();

  for (let i = 2; i <= last_row; i++) {
    var flag = SPREADASHEET_LIST.getRange(i, 3).getValue();
    if (flag == true) {
      var userID = SPREADASHEET_LIST.getRange(i, 2).getValue();
      postDM(userID);
    }
  }
}

// botからDMを送る
function postDM(member_id) {
  var last_row = SPREADASHEET_MESSAGE.getLastRow();
  const message = SPREADASHEET_MESSAGE.getRange(last_row, 1).getValue();

  const channel_id = getChannelID(member_id);
  
  //　指定の[チャンネルID]にDMを送信する
  const message_options = {
    "method" : "post",
    "contentType": "application/x-www-form-urlencoded",
    "payload" : {
      "token": SLACK_TOKEN,
      "channel": channel_id,
      "text": message
    }
  };
  
  const message_url = 'https://slack.com/api/chat.postMessage';
  UrlFetchApp.fetch(message_url, message_options);
}

// DMを開いてチャンネルIDを取得する
function getChannelID(member_id) {
  const options = {
    "method" : "post",
    "contentType": "application/x-www-form-urlencoded",
    "payload" : {
      "token": SLACK_TOKEN,
      "users": member_id
    }
  }
  
  const url = 'https://slack.com/api/conversations.open';
  const response = UrlFetchApp.fetch(url, options);
  
  const obj = JSON.parse(response);
  console.log(obj);
  
  return obj.channel.id;
}
```
スプレッドシートIDは用意したスプシのURLの以下の部分です。コピペしてください。
```
https://docs.google.com/spreadsheets/d/ここの文字列/edit#gid=0
```

checkの関数を実行すると、、

![スクリーンショット 2023-12-25 21.16.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303938/a7279242-cf0c-9a9b-e2f7-50c90afada19.png)

できました！無事個人にお知らせくんからメッセージが届きました〜！

# スプシだけで完結させる
スプレッドシートからGASの関数を実行できるようにします。
スプレッドシートの`拡張機能`から`マクロをインポート`します。

![スクリーンショット 2023-12-25 21.33.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303938/e60435ce-0b8f-0d98-14d8-0ae4f319c64d.png)

checkという関数を追加しました。

![スクリーンショット 2023-12-25 21.33.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303938/48699fec-e040-a4a5-b268-b89bbcea59a6.png)

`拡張機能`の`マクロ`に`check`が追加されています。ここをクリックすることで一斉送信ができるようになりました！

![スクリーンショット 2023-12-25 21.36.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303938/c08c9274-9768-416e-4619-5a98d2a49fa6.png)

# おわりに
これで個人にお知らせくん完成です！
最後まで読んでいただきありがとうございました。
DMの一斉送信はお知らせくんにお任せください✨✨✨

>ps.なぜ兄弟なのかずっと気になっている人へ
🌟タスクお知らせくんの記事はこちら🌟
https://qiita.com/fuki_01/items/a841166b547e323baeaa
🌟議事録お知らせくんの記事はこちら🌟
https://qiita.com/fuki_01/items/d0434ad9ce3357d54183

# おまけ
メッセージテキストを装飾する方法
```
ボールド
*あいうえお*
メンション
<@ユーザーID> 
リンク
<https://www.youtube.com/ >
リンク２
<https://www.youtube.com/ | YouTube>
引用
>あいうえお
```

![スクリーンショット 2023-12-25 21.49.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303938/cf00ada7-f866-20df-2c81-27883e6e406a.png)