GASで休日祝日や有給休暇を実行除外判定にいれる

GASで土日判定以外にも祝日、果ては各自の有給休暇を元に判定を入れてみました。
2022.10.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

最近軽いスクリプトを組む時はGASを頼るようになりました。コスト低い上によく使うGSuiteにAPIでアクセスできて便利です。ただ、処理後の通知は若干工夫が必要です。

通知用ライブラリというものが殆どみられず、言語次第では日付ライブラリ+休日網羅系ライブラリ等で手軽に判定もできますが、GASは少し工夫は必要です。

  • この曜日には通知させたくない
  • カレンダーに予定がすでに入っている日は避けたい

といった状況に対応させたいために日付判定を試してみました。

今日が土日か判定する

関数名以外は多分よくあるコードです。土日に動作させたくない場合は処理はじめに呼び出すあたりでも問題ないでしょう。

function start() {
  if (todayIsEnd()) {
     return
  }
}

function todayIsEnd(){
  let today = new Date();
  let weekInt = today.getDay(); 
  if (weekInt <= 0 || 6 <= weekInt) { return true; } //土日
  return false

祝日も判定に加える

土日以外の祝日も判定に入れたい場合。appsscript.jsonのoauthScopesに以下3つを入れておきます。

  • "https://www.googleapis.com/auth/calendar"
  • "https://www.googleapis.com/auth/calendar.readonly"
  • "https://www.google.com/calendar/feeds"

次に日本の祝日カレンダーへアクセスして、当日の予定を取得します。入っていれば祝日です。

function todayIsEnd(){
  let today = new Date();
  let weekInt = today.getDay(); 
  if (weekInt <= 0 || 6 <= weekInt) { return true; } //土日
  let calendarId = "ja.japanese#holiday@group.v.calendar.google.com";
  let calendar = CalendarApp.getCalendarById(calendarId); 
  let events = calendar.getEventsForDay(today);
  if(events.length > 0){
    return true;
  }
  return false;
}

個別の有給も判定に加える

有給を取っているスタッフには通知する必要がない場合の対処としては、以下の前提になっていれば可能です。

  • 有給を日単位のスケジュールに追加済み
  • 該当カレンダーを共有済み
function todayIsEnd(){
  let today = new Date();
  let weekInt = today.getDay(); 
  if (weekInt <= 0 || 6 <= weekInt) { return true; } //土日
  let calendarId = "ja.japanese#holiday@group.v.calendar.google.com";
  let calendar = CalendarApp.getCalendarById(calendarId); 
  let events = calendar.getEventsForDay(today);
  if(events.length > 0){
    return true;
  }

  let calendarId2 = "xxxxxxxxx@gmail.com";
  let calendar2 = CalendarApp.getCalendarById(calendarId2); 
  let events2 = calendar2.getEventsForDay(today);
  var result = false;
  events2.forEach( function(event) {
    if (event.getTitle() == "有給休暇") {
      result = true;
    }
  })
  return result;
}

時間単位での指定スケジュールはgetEvents(startTime, endTime)になります。カレンダーの共有は「特定のユーザーとの共有」にてユーザを追加した後、共有される側で「このカレンダーを追加。」リンクを踏んだ先でのポップアップ承認まで済ませることで完了となります。

あとがき

GoogleCalendarの公開祝日カレンダーはGASで日程調整する場合にとても役立ちます。他のSaaSだと中々うまくできない点だと思われます。勿論SaaSの外部実行用APIが整備されていれば、GASで日程調整後に呼び出すのもありですね。

日付判定で迷っている場合の参考になれば幸いです。