本記事は ZOZO Advent Calendar 2023 シリーズ 7 の 6 日目の記事です。
概要
この記事では、Google Apps Script(GAS)を使用して、Slackで定期的に担当者にメンションしてリマインドする Slack bot をササっと作成する方法をご紹介します。
背景
推薦基盤ブロックでは、ZOZOTOWNのHOME面に掲載しているモジュールの管理・運用を担当しています。モジュールに関する詳細な説明は 3日目の記事 で行っていますので、興味があればご参照ください。
モジュールは定期的に更新されたり、施策のモジュールが差し込まれたりするため、運用業務が頻繁に発生します。これまでは毎月、担当者をランダムに選定していましたが、差し込み依頼が増えてきたため、誰かが負担を抱える可能性もありました。
そこで、毎週担当者を指名する Slack bot を作成し、指名された担当者が一週間モジュールの運用を担当するような運用フローを導入しました。これにより、差し込み依頼が発生した際に『『誰が担当するんだ...!?』』といった曖昧な時間がなくなり、開発業務により集中できるようになりました。
Slack APPの作成
-
slack api > Your Apps から「Create New App」を選択し、新しいアプリを作成します。今回の用途が限られているため、「From scratch」を選択し、App NameとWorkspaceを指定してアプリを作成します。
-
「Incoming Webhooks」を選択し、「Activate Incoming Webhooks」をONにします。
これでSlack Appの設定が完了し、後続の手順でこのWebhook URLを使用します。
Google Apps Script(GAS)の作成
GASの実装はこちらの記事を参考にしました。コードの詳細も詳しく説明されているので、実装がスムーズに進みました。関数の説明などはこちらを参考にしてみてください!
-
スプレットシートを用意します。
-
以下のような表を作成します。メンション先は"<@userid>"という形式にする必要があるので、注意してください。
-
上部タブから「拡張機能 > Apps Script」を選択します。
-
以下のコードをコピーして、適宜書き換えてください。
// 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); }