こんにちは、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見るだけで良いのは便利に感じるので、他にも何か応用できないか考えたいなぁと思います!