GASで土日祝を除いた営業日だけ処理を実行する方法

GASで土日祝を除いた営業日だけ処理を実行する方法

毎朝送信している日報や、期限リマインダーのメールが土曜の朝や祝日にも届いてしまい「今日は休みなのに」と社内から声が上がったことはありませんか。

Google Apps Scriptの時間主導型トリガーは曜日や祝日を意識せず、設定した時刻になれば毎日そのまま実行される仕組みです。

曜日判定とGoogleが提供する日本の祝日カレンダーの照合方法、既存の時間トリガー処理への組み込み方、会社独自の休業日への対応まで整理しています。

営業日判定の自動化を無料で相談する

基本の考え方(曜日判定と祝日カレンダーの照合)

曜日の判定自体はシンプルで、JavaScriptのgetDay()は日曜を0、土曜を6として数値を返すため、この2つを除外すれば土日は判定できます。

ただし曜日だけを見る方法では祝日を除外できず、平日に当たる祝日にもそのまま処理が走ってしまう点には注意が必要です。

祝日を判定するには、Googleが公式に提供している「日本の祝日」カレンダーを使います。

カレンダーIDはja.japanese#holiday@group.v.calendar.google.comです。

CalendarApp.getCalendarById()に渡すとカレンダーオブジェクトを取得でき、指定した日にイベント(祝日)があるかどうかを調べられます。

ただしこのGoogleの「日本の祝日」カレンダーには、近年の仕様変更で節分やひな祭りのような祝日ではない年中行事が含まれることもあります。

土日と国民の祝日だけを厳密に営業日から外したいなら、祝日のみを収録した公式カレンダーに切り替えるのが確実です。

IDja.japanese.official#holiday@group.v.calendar.google.comをカレンダー一覧へ追加し、コードのIDもこちらに差し替えてください。

このカレンダーは、スクリプトを実行するGoogleアカウントが事前に自分のカレンダー一覧へ追加しておかなければ利用できません。

Googleカレンダーの画面から「他のカレンダーを検索」で「日本の祝日」を追加していないと、getCalendarById()nullを返し、営業日判定の処理がそこで止まります。

手順

営業日を判定する関数を用意して、既存の時間トリガー処理に差し込むまでの流れは次の3ステップです。

Step1. 営業日判定の関数を追加する(コード全文)

既存のGoogle Apps Scriptプロジェクトのスクリプトエディタを開き、次の関数を追加します。

function isBusinessDay(targetDate) {
  const HOLIDAY_CALENDAR_ID = 'ja.japanese#holiday@group.v.calendar.google.com'; // ★ここを変える: 会社独自のカレンダーIDに差し替える場合

  const dayOfWeek = targetDate.getDay(); // 0:日曜 6:土曜
  if (dayOfWeek === 0 || dayOfWeek === 6) {
    return false;
  }

  const holidayCalendar = CalendarApp.getCalendarById(HOLIDAY_CALENDAR_ID);
  if (!holidayCalendar) {
    throw new Error(`祝日カレンダー「${HOLIDAY_CALENDAR_ID}」が見つかりません。Googleカレンダーで購読済みか確認してください`);
  }

  const holidays = holidayCalendar.getEventsForDay(targetDate);
  if (holidays.length > 0) {
    return false;
  }

  return true;
}

dayOfWeekが0(日曜)か6(土曜)のとき、ここでfalseを返して処理を終える仕組みです。

土日でなければ祝日カレンダーを取得し、getEventsForDay()で対象日のイベント件数を調べ、1件以上あれば祝日と判定してfalseを返します。

土日でも祝日でもなければtrueを返し、呼び出し元の処理へ進む形です。

Step2. 既存の時間トリガー処理の冒頭に組み込む

毎朝送信している日報のような既存の関数があれば、冒頭に営業日判定を1行追加するだけで組み込めます。

function sendDailyReport() {
  if (!isBusinessDay(new Date())) {
    return;
  }

  // ここから既存の処理(日報シートの内容をメールで送信する等)
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('日報');
}

isBusinessDay(new Date())falseを返した瞬間にreturnで処理を打ち切るため、既存の処理本体には手を加えずに済む仕組みです。

複数の時間トリガー関数がある場合も、それぞれの冒頭に同じ1行を追加するだけで、すべての処理に営業日判定を反映できます。

Step3. 土日祝を挟んだ1週間分をログで確認する

組み込んだ直後は、実際に土日祝を挟んだ1週間分の実行結果をログで確認しておくと安心です。

スクリプトエディタの実行数タブから、土曜と日曜、直近の祝日にあたる日の実行ログを開き、isBusinessDayで処理が打ち切られているかを確認します。

祝日にも処理が進んでしまっている場合は、祝日カレンダーが購読済みになっているかを見直してください。

土日祝を除いて営業日だけ処理を実行する設定手順の3ステップ。営業日判定の関数を追加→既存処理の冒頭に組込→土日祝の実行結果を確認

Microsoft 365環境で同様の処理をPower Automateで組む場合は、繰り返しトリガーの曜日指定と祝日リストの照合という別の方法になります。

会社独自の休業日への対応

国の祝日カレンダーだけでは、創立記念日や夏季休業のような会社独自の休業日を除外できません。

除外したい日をスプレッドシートに一覧化しておき、isBusinessDayの中でその一覧の日付とも照合すれば、同じ仕組みの中で会社独自の休業日もまとめて除外できます。

除外したい対象

判定に使うもの

更新の要否

土曜・日曜

getDay()の戻り値

更新不要

国民の祝日

Google公式の日本の祝日カレンダー

Google側で自動更新

会社独自の休業日

自作のスプレッドシート一覧

年始などに手動更新

このように判定対象を3段階に分けておくと、祝日が増減する法改正があってもGoogle側の更新を待つだけで済み、会社独自の休業日だけを自分たちで管理すればよい仕組みです。

どの業務から自動化を始めるべきか迷う場合は、着手順の考え方を別記事で整理しています。


営業日判定の組み込みでお困りではありませんか?

「土日にも通知が届いてしまう」「祝日カレンダーが反映されない」「会社独自の休業日をどう管理すればいいか分からない」

少しでもお心当たりがあれば、お気軽にご相談ください。

現在、Google Apps Scriptを使った業務自動化のお悩みをお伺いする 無料の個別相談 を実施しています。

よくある質問

Q. 祝日カレンダーを追加し忘れるとどうなりますか?

CalendarApp.getCalendarById()nullを返し、営業日判定の処理がエラーで止まります。

スクリプトを実行するGoogleアカウントが、Googleカレンダーに「日本の祝日」をあらかじめ追加しておかなければなりません。

Q. 会社独自の休業日はどこで管理すればいいですか?

専用のスプレッドシートに休業日の一覧を作り、isBusinessDayの判定にその一覧との照合を追加する形が管理しやすいです。

祝日カレンダーとは別枠で管理できるため、年末年始の休業日程が毎年変わっても祝日側の判定処理に手を加える必要がありません。

Q. Power Automateで同じ仕組みを作る場合との違いは何ですか?

Power Automateには曜日指定の設定項目があるものの、祝日の除外はGoogle Apps Scriptと同様に祝日リストとの照合を自分で組む必要があります。

Google Workspace環境ならGoogle Apps Script、Microsoft 365環境ならPower Automateというように、使っている基盤に合わせて選ぶ形になります。