gasとChatWorkで出退勤の打刻を促す


今の会社ではクラウド勤怠を導入しているのだが、PCやスマホから打刻するため忘れることがちょこちょこあった。
出勤時間5分前と退勤時間にChatWorkで通知するようにしてみた。

var kintaiUrl = "[hr]クラウド勤怠システムのURL";
var msgMorning = "[toall]\nもうすぐ始業時間だよ、打刻を忘れないようにしてね! \n" + kintaiUrl;
var msgEvening = "[toall]\n終業時間だよ、打刻を忘れないようにしてね! \n" + kintaiUrl ;

// トリガーを始業時間5分前にセット
function setTrigger() {
    var triggerDay = new Date();
    var hours = triggerDay.getHours();

  // if文の条件はgasのデフォルトトリガーを7時〜8時、16時〜17時の間で設定しているため。いらない気もするが一応、、、
    if (hours == 7) { 
        triggerDay.setHours(8);
        triggerDay.setMinutes(55);

        // triggerDayに設定した時間で新しいトリガーを作成
        ScriptApp.newTrigger("dakokusite").timeBased().at(triggerDay).create();

    } else if (hours == 16) {
        triggerDay.setHours(18);
        triggerDay.setMinutes(00);  
        ScriptApp.newTrigger("dakokusite").timeBased().at(triggerDay).create();
    }
}

// その日のトリガーを削除する
function deleteTrigger() {
  var triggers = ScriptApp.getProjectTriggers();
  for(var i = 0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() == "dakokusite") {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }
}

function dakokusite() {
  deleteTrigger();

  var client = ChatWorkClient.factory({token: "APIトークン"});
  var today = new Date();
  var hours = today.getHours();

  // 祝日判定用
  var calendarId = "ja.japanese#[email protected]";
  var calendar = CalendarApp.getCalendarById(calendarId);
  var todayEvents = calendar.getEventsForDay(today);

  if (hours == 8 && todayEvents.length == 0) {
    client.sendMessage({
      room_id: チャットワークのルームID,
      body: msgMorning}); 
  } else if (hours == 18 && todayEvents.length == 0) {
    client.sendMessage({
      room_id: チャットワークのルームID,
      body: msgEvening}); 
  } 
}

gasのトリガーは細かい時間指定ができないが、setTrigger関数のよう実装すれば細かく指定できる。ただ、新しいトリガーを生成しているので、deleteTriggerで生成したトリガーを削除してあげないとどんどん増えていくので注意が必要。