hacomono TECH BLOG

フィットネスクラブ・スクールなど施設・店舗のための会員管理・予約・決済システム「hacomono」 開発チームの技術ブログ

GASとslackAPIを使用してランダム担当者アサインbotを作成してみた

こんにちは、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('担当日');

事前に以下のような担当者候補を記載したスプレッドシート と、担当日・担当者を転記する用のシートを準備

  • 開発シート

f:id:hacomono-tech:20210326180414p:plain

  • 担当日シート

f:id:hacomono-tech:20210326180449p:plain

その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にトリガー機能があるので、トリガーを毎週金曜日にセットして自動通知という流れになります。

f:id:hacomono-tech:20210326180952p:plain

毎週月曜日にリマインドで通知するには

  • 通知する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です

f:id:hacomono-tech:20210326181105p:plain

最後に

GASで実行したデータをどう扱うか、どこで保持するか、みたいなところで結構悩んだりしたのですが、スプレッドシート 上でそのまま管理すれば良いのですね。

slack見るだけで良いのは便利に感じるので、他にも何か応用できないか考えたいなぁと思います!