週次で運用担当者にSlackでメンションするリマインダーBOTをサクッと作る

:::note
本記事は [ZOZO Advent Calendar 2023](https://qiita.com/advent-calendar/2023/zozo) シリーズ 7 の 6 日目の記事です。
:::
# 概要
この記事では、Google Apps Script（GAS）を使用して、Slackで定期的に担当者にメンションしてリマインドする Slack bot をササっと作成する方法をご紹介します。
# 背景
推薦基盤ブロックでは、ZOZOTOWNのHOME面に掲載しているモジュールの管理・運用を担当しています。モジュールに関する詳細な説明は [3日目の記事](https://qiita.com/yan_yan/items/a8d82eb76d5e29f267cf) で行っていますので、興味があればご参照ください。

モジュールは定期的に更新されたり、施策のモジュールが差し込まれたりするため、運用業務が頻繁に発生します。これまでは毎月、担当者をランダムに選定していましたが、差し込み依頼が増えてきたため、誰かが負担を抱える可能性もありました。

そこで、毎週担当者を指名する Slack bot を作成し、指名された担当者が一週間モジュールの運用を担当するような運用フローを導入しました。これにより、差し込み依頼が発生した際に『『誰が担当するんだ...！？』』といった曖昧な時間がなくなり、開発業務により集中できるようになりました。

# Slack APPの作成
1. [slack api > Your Apps](https://api.slack.com/apps) から「Create New App」を選択し、新しいアプリを作成します。今回の用途が限られているため、「From scratch」を選択し、App NameとWorkspaceを指定してアプリを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997599/60f3a320-d572-c9d3-5570-795e9ef33568.png)

2. 「Incoming Webhooks」を選択し、「Activate Incoming Webhooks」をONにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997599/c8900984-38b9-4065-193e-0e19f8630249.png)

3. 「Add New Webhook to Workspace」を選択し、メッセージを送信するチャンネルを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997599/064f6b49-5308-4359-3456-e9d65a8ba32c.png)

4. これにより、Webhook URLが生成されます。このURLを後で使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997599/09fa59f3-4d3f-60c6-d1e2-66beee037ba5.png)

これでSlack Appの設定が完了し、後続の手順でこのWebhook URLを使用します。


# Google Apps Script（GAS）の作成
GASの実装はこちらの[記事](https://note.com/3or9cake/n/n536a0effc259)を参考にしました。コードの詳細も詳しく説明されているので、実装がスムーズに進みました。関数の説明などはこちらを参考にしてみてください！
1. スプレットシートを用意します。
2. 以下のような表を作成します。メンション先は"<@userid>"という形式にする必要があるので、注意してください。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997599/2ebf03c1-ab42-40f1-4424-8e49a80547fb.png)


3. 上部タブから「拡張機能 > Apps Script」を選択します。
4. 以下のコードをコピーして、適宜書き換えてください。
    ```
    // slackに通知する関数
    function notifyMondayMorningInfo() {
      messageBody = fetchMembers() ;
      setForSlack(messageBody, 'チャンネル名'); // 先ほど選択したチャンネルを指定する
    }

    // 担当者の取得と通知メッセージを成形する関数
    function fetchMembers() {
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート名'); // 表が記載されているsheetの名前を指定する
      var member = sheet.getRange('B2').getValues();
      var message =
        '今週の担当者は、' + member + 'です！\n' +
        '参考資料はこちら: <https://XXXXXXX>\n' +
        '今週も一週間よろしくお願いします！！';
    
      rotateMembers(sheet);
      return message;
    }

    // 表の担当者のセルをローテーションする関数
    function rotateMembers(sheet) {
      var memberRange = sheet.getRange('B2:B7'); // 人数によってセルを変更する
      var members = memberRange.getValues();
      members.push(members.shift());
      memberRange.setValues(members);
    }
    
    // SlackのWebhook URLにHTTPリクエストを送る関数
    function setForSlack(body, channel) {  
      var url = 'https://hooks.slack.com/services/ハッシュ値'; // 生成した Webhook URL をコピペする
      var data = {
        'channel' : channel,
        'username' : '今週の担当者をお知らせ',
        'attachments': [{
          'color': '#008000',
          'text' : body,
        }],
      };
    
      var payload = JSON.stringify(data);
      var options = {
        'method' : 'POST',
        'contentType' : 'application/json',
        'payload' : payload
      };
    
      UrlFetchApp.fetch(url, options);
    }
    ```

5. コードを保存した後、トリガーを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997599/de0690d8-3441-36ab-0525-fad3e6c0390a.png)
設定内容は以下のようにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997599/f7bb05cd-9acb-e8e3-41ad-c120c40fc6e7.png)


6. これでSlackに毎週メンションが飛ぶようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997599/224f9c5d-fe60-8245-d6df-c7a1ac75206c.png)