祝日や会社の休日に起動しないSlack通知bot

はじめに

平日の18時に行っている夕会用に、開始時間になると曜日ごとのファシリテータをお知らせするbotを運用中。

土日祝日と会社指定の休日は通知飛ばないようにしてます。

祝日判定のためにGoogleAppsScriptとGoogleカレンダーを利用してます。

Googleカレンダーに用意されている日本の祝日カレンダーで祝日を、別に用意した会社の休日カレンダーで年末年始や夏季休暇に対応しています。

コード

function onOpen() {
  if (isHoliday()) {
    return
  }
  deleteAllTriggers();
  setupTriggers(); 
}

function deleteAllTriggers() {
  var allTriggers = ScriptApp.getProjectTriggers();
  for(var i=0; i < allTriggers.length; i++) {
      ScriptApp.deleteTrigger(allTriggers[i]);
  }
}

function getFormatedDate(time){
  var now = new Date();
  var year = now.getFullYear();
  var month = now.getMonth() + 1;
  var date = now.getDate();

  month = ("0" + month).slice(-2);
  date = ("0" + date).slice(-2);

  var strDate = year + "/" + month + "/" + date + " " + time;

  return strDate;
}

function setupTriggers() {
  // 通知時間の設定
  var trigger = new Date(getFormatedDate("18:00"));
  var onChangeTrigger = ScriptApp.newTrigger("notfy")
                  .timeBased()
                  .at(trigger)
                  .create();
  //全トリガー削除するので再設定
  var onChangeTrigger = ScriptApp.newTrigger("onOpen")
      .timeBased()
      .atHour(10)
      .everyDays(1)
      .create();
}

function notfy() {
  var facilitator = getTodayFacilitator();

  postSlack(facilitator);
}

function isHoliday() {
  var japanHoliday = CalendarApp.getCalendarsByName('日本の祝日');
  var companyHoliday = CalendarApp.getCalendarsByName('会社の休日'); 
  var holidays = japanHoliday[0].getEventsForDay(new Date()) + companyHoliday[0].getEventsForDay(new Date()) ;

  return (holidays != '');
}

function getMembers()
{
  var values = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('member').getRange(2, 1, 5, 2).getValues();  
  var members = {'日':'', '月':'', '火':'', '水':'', '木':'', '金':'', '土':''};
 
  for (var i = 0; i < 5; i++) {
     var youbi = values[i][0];
     members[youbi] = values[i][1];
  }
  
  return members
}

function getTodayFacilitator() {

  var now = new Date();
  var week = ['日', '月', '火', '水', '木', '金', '土']; 
  var members = getMembers();

  var facilitator = members[week[now.getDay()]];

  return facilitator;
}

// send to slack
function postSlack(name)
{
  if (name == "") return;

  var payload = {
    "text" : "<!here> " + "今日の当番は" + name + "ですよ",
    "channel" : "#general" // 表示名やアイコンはお好みで
  }

  var options = {
    "method" : "POST",
    "payload" : JSON.stringify(payload)
  }
 
  var url = "https://hooks.slack.com/services/hoge/fuga/piyo"; // 各自のURL
  var response = UrlFetchApp.fetch(url, options);
  var content  = response.getContentText("UTF-8");
}

ポイント

使うまで知らなかったけど、GoogleAppsScriptの時間起動トリガーだと毎日18時っていう指定ができませんでした。

近いのは、毎日18時〜19時の間に起動するというトリガーか特定日の18時というトリガーです。

仕方ないので、毎日10時〜11時の間に起動して、setupTriggers()という関数でその日の18時のトリガーを設定してます。

さらに面倒なことにトリガーを区別するのが大変ぽかったので、一回全部消してから全部設定し直すようにしてます。