💬

シフト表を作ってSlackで連絡する

2020/12/15に公開

はじめに

前回作った祝日対応の応用例です。
翌日のシフト担当者を通知するか、営業日でないか、担当者が設定されてないかを通知します。

手順

  • Slackのincomming Webhookを使う
  • GASでSlackに通知

SlackのIncomming Webhooksを使う

ここから自分のワークスペースに追加できます。
https://slack.com/apps/A0F7XDUAZ-incoming-webhooks

Webhook URLを取得して後ほどGASに設定します。

GASでSlackに通知


//日付計算用の定数
const MILLIS_PER_DAY = 1000 * 60 * 60 * 24;

//編集するシート
const SHEET_ID ="<シートのID>";
const SHEET_NAME = "<シートの名前>";

const SLACK_INCOMMING_WEBHOOK ="<Webhook URLを記載する>";

const RANGE_A1_HOLIDAY = "B2:E400";//日付,曜日,祝日,担当者

function sendSlack(message) {
  var payload = JSON.stringify({
    text: message
  })
  //POSTデータ
  var option = {
    "Content-Type":"application/json; charset=utf-8",
    "method" : "POST",
    "payload" : payload
  };
 
  UrlFetchApp.fetch(SLACK_INCOMMING_WEBHOOK, option);
}

function getBusinessDayValues() {
  var sheet = SpreadsheetApp.openById(SHEET_ID);
  var editSheet = sheet.getSheetByName(SHEET_NAME);
  var rangeValues = editSheet.getRange(RANGE_A1_HOLIDAY).getValues();
  var dateArray = {};
  for (var v of rangeValues){
    //日付のカラ行、曜日の土日、祝日に記載がある場合は担当者を取得しない
    if ((v[0] == "") || (v[1] == "土" || v[1] == "日") || (v[2] != "")){
      continue;
    }
    dateArray[v[0]] = v[3];
  }
  return dateArray;
}

function slackToShiftMember (){
  var now = new Date();
  //今日の0時
  var startOfToday = new Date(now.getFullYear(), now.getMonth(), now.getDate() ,
      0, 0, 0);
  var sheetDates = getBusinessDayValues(); 
  var nextDay = new Date(startOfToday.getTime() + MILLIS_PER_DAY);
  var member = sheetDates[nextDay];
  var message = "";
  
  if (member && member !="") {
    message = "明日の担当は" + member + "さんです";
  } else if(member == ""){
    message = "明日の担当は決まっていません";
  } else {
    message = "明日は営業日ではありません";
  }
  sendSlack(message);
}

さいごに

コードだけで土日判定と祝日判定、担当者が決まってるかを書くともうちょっと大変なので
Google Sheetにさきに記載して利用すれば、だいぶハードルは下がる気がします。

Discussion