SlackとGASを使って月初の平日に予定をリマインド

こんにちは。斉藤です。
最近、週1ペースでスープカレー食べてます。血液にそろそろスープカレーが混じってきてる頃かと思います。おすすめはもっぱら一文字です。

さて、今日はslackとGoogle apps scriptを使って月初の平日に予定をリマインドするよう設定したお話です。 最初はgoogleカレンダーの繰り返し機能で毎月1日にリマインドされるようにしていたのですが、1日が土日に当たることもあり、月初の平日という設定ないかなとgoogleカレンダーを色々いじくってみたものの、できないようでしたので他の方法を探してみました。
ちなみにgoogleカレンダーとslackの連携はこちらから

 

下記サイトを参考にしました。

 

上記ではtokenを使用していたのですが、tokenを使わずにjson形式で
Incoming WebHooksで発行したURLに送るように設定しました。

/*
  メインの処理
  setTriggerDay() : はじめの営業日(0時)に次の処理をする命令を出す。
  setTriggerHoursFirst() : はじめの営業日の11時に次の命令を出す。
  sendSlack() : slackにデータを投げる。

  サブ的な処理
  deleteTrigger() : 蓄積されている命令を削除する
  firstNextBusinessDay() : 来月のはじめの営業日を求める
  isHoliday() : 本日が[日本の祝日]かどうかチェック。土日は曜日で判定してるチェック
  .getDay() : Dateオブジェクトから曜日を求めるメソッド(0:日, 6:土曜日)
*/

function setTriggerDay2()
{  
  var first = firstNextBusinessDay();
  ScriptApp.newTrigger("setTriggerHoursFirst")
    .timeBased()
    .atDate(first.getFullYear(), first.getMonth()+1, first.getDate())
    .create();
}

function setTriggerHoursFirst()
{
 ScriptApp.newTrigger("sendHttpPost")
   .timeBased()
   .after(9 * 60 * 60 * 1000)
  // .atHour(10)
  // .nearMinute(35)
  // .everyMinutes(5)
   .create();
}

function sendHttpPost()
{
    var jsonData =
    {
         "channel" : "hogehoge",(チャンネル名)
         "username" : "hoge",(slack上での送り主)
         "text" : "月初です。〜",(送りたいtext)
         "link_names": 1
    };
    var payload = JSON.stringify(jsonData);
    var options =
    {
        "method" : "post",
        "contentType" : "application/json",
        "payload" : payload
    };
    var url = "https://hooks.slack.com/services/〜";(Incoming WebHooksのURL)
    UrlFetchApp.fetch(url, options);
}

function firstNextBusinessDay() 
{
  var today = new Date();  
  var firstDayOfNextMonth = new Date(today.getFullYear(), today.getMonth()+1, 1);
  var day; // 0->日曜日

  for (var i = 2; i < 32; i++) {
    day = firstDayOfNextMonth.getDay();
    if (day == 0 || day == 6 || isHoliday(firstDayOfNextMonth)) {
      firstDayOfThisMonth = new Date(today.getFullYear(), today.getMonth(), i);
      continue;
    }
  }
  Logger.log(setTriggerHoursFirst);
  return firstDayOfNextMonth;
}

function deleteTrigger() 
{
  var triggers = ScriptApp.getProjectTriggers();
  for(var i=0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() == "main") {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }
}

function isHoliday(day) 
{
  var startDate = new Date(day.setHours(0, 0, 0, 0));
  var endDate = new Date(day.setHours(23, 59, 59));
  var cal = CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com");
  var holidays =  cal.getEvents(startDate, endDate);
  return holidays.length != 0; // 祝日ならtrue
}


これでしばらく様子を見てみたいと思います。