こんにちは、hacomomo開発チームの塩濱です!
弊社では、お客様からの様々なお問い合わせを一次受けするサポートチームがあります。 サポートで受けた上で、開発チームにも2次受けとして調査依頼がくるものがあるのですが、 その際の調査担当者をGoogleカレンダーで毎週月〜金曜日で割り振っています。
月〜金での担当曜日の固定化を防ぐため、 タイトル通りとなりますが、GASを使用してランダムで担当者を割り振り、slackに通知してくれるbotを作成しました。
やりたいこと
- 毎週金曜日に来週分の担当日と担当者をslackで通知する
- 毎週月曜日に今週分の担当日と担当者をslackでリマインド通知する
slackAPIを使用する
slackのtokenを取得する必要があるので、slackでAPIをまず作成します。 この辺りは参考記事が沢山ありますので割愛します。(ポチポチしていくだけでした!)
GASでslackAPIを使用する際に、ライブラリとしてslackを追加する必要がありますので GASに追加する用のslackのLibrary Keyも調べておくとスムーズです。
以下からGASの実装備考録です。
その1 slack連携のための事前準備
- slackのtokenをセットします。
var slack = { postUrl: 'https://slack.com/api/chat.postMessage', token: '発行したtokenを記載', ChannelId: "通知を飛ばしたいchannelIdを記載", userName: "来週のサポート担当者はこちら!", }
- スプレッドシートを取得
// 該当sheetを取得 var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName('開発'); var sheet2 = ss.getSheetByName('担当日');
事前に以下のような担当者候補を記載したスプレッドシート と、担当日・担当者を転記する用のシートを準備
- 開発シート
- 担当日シート
その2 ランダムに担当者を5名決める
-コメントで解説を記載していきます。
// 担当者リストを配列に格納 var userList = sheet.getRange('A2:A').getValues(); // 担当者リストをランダムに回す for(var i = userList.length -1; i > 0; i--){ var r = Math.floor(Math.random() * (i + 1)) var tmp = userList[i] userList[i] = userList[r] userList[r] = tmp } // 先頭から5名分を取得 var assign = userList.slice(0, 5); var lastColumn = assign[1].length; //カラムの数を取得する var lastRow = assign.length; //行の数を取得する //担当日シートの担当者欄に取得した5名分の名前を記載する sheet2.getRange(2,2,lastRow,lastColumn).setValues(assign);
その3 来週の月曜日を取得し、月〜金までの担当日程を取得する
var date = new Date(); //来週月曜日を取得する date.setDate(date.getDate() + 2); //来週月曜日〜金曜日の担当日を配列に格納する var supportAssign = []; for(var i = 0; i < 5; i++) { date.setDate(date.getDate() + 1); var dateTime = Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy/MM/dd'); supportAssign.push(dateTime) } //担当日を書き込む sheet2.getRange(2,1,lastRow,lastColumn).setValues(splitArray(supportAssign));
- 取得した担当日はスプレッドシートに転記するために2次元配列に変換する必要があるので、以下で実施しています。
//二次元配列に変換 function splitArray(data) { var ary = []; for (var i=0; i<data.length; i++) { ary.push([data[i]]); } return ary }
その4 slackに通知する用のメッセージを準備する
function getMessage(){ //取得するシートの行列(2行目、1列目、5行分、2列分) var messageArray = sheet2.getRange(2, 1, 5, 2).getDisplayValues(); //2次元配列 var message = new Array(); //2次元配列を1次元配列に変換 for(var i = 0; i < messageArray.length; i++){ for(var j = 0; j < messageArray[i].length; j++){ message.push(messageArray[i][j]); } } //配列を改行で連結 var sendMessage = message.join('\n'); console.log(sendMessage) return sendMessage; }
その5 slackに通知する
var slackApp = SlackApp.create(slack["token"]); var Message = slackApp.postMessage(slack["ChannelId"], "testtest" + "\n*来週の担当者は…✧٩(ˊωˋ*)و✧*\n\n" + getMessage() + "……です!確認を忘れずに!" + "\n\n*担当者シート:*転記していたスプレッドシート URLを記載" + "\nこちらのリンクをブックマークしておけばいつでも確認できます✏️" + "\n```※変更が必要な場合は担当日シートの担当者欄を編集してください```", {username : slack["userName"]});
実際のslack通知はこんな感じになります。
- GASにトリガー機能があるので、トリガーを毎週金曜日にセットして自動通知という流れになります。
毎週月曜日にリマインドで通知するには
- 通知するslackBotの名前とメッセージだけ今週用に変更してあげます。
function remaindSalck() { slack["userName"] = "今週のサポート担当者はこちら!" var slackApp = SlackApp.create(slack["token"]); var Message = slackApp.postMessage(slack["ChannelId"], "testtest" + "\n*リマインド🙌今週の担当者は…✧٩(ˊωˋ*)و✧*\n\n" + getMessage() + "……です!確認を忘れずに!" + "\n\n*担当者シート:*転記していたスプレッドシート URLを記載" + "\nこちらのリンクをブックマークしておけばいつでも確認できます✏️", {username : slack["userName"]}); }
- こちらに関してはトリガーを月曜日にセットしてあげればOKです
最後に
GASで実行したデータをどう扱うか、どこで保持するか、みたいなところで結構悩んだりしたのですが、スプレッドシート 上でそのまま管理すれば良いのですね。
slack見るだけで良いのは便利に感じるので、他にも何か応用できないか考えたいなぁと思います!