🗓️

【GAS】土日・祝日を判定する、祝日の日付一覧を取得する方法

2023/07/18に公開

追記(2024年11月)

2024年9月頃からGoogleカレンダーの仕様に変更があり、祝日に加えてその他の行事(節分、雛祭り、母の日、七夕、七五三、クリスマス)が表示されるようになっています。この問題の解決方法は以下の記事をご参考ください。
https://zenn.dev/gas/articles/f052a8ecb242e4

土曜日・日曜日を判定する

この関数isWeekend()は、特定の日付targetDateが土曜日か日曜日かを判定します。

function isWeekend(targetDate) {
  const day = targetDate.getDay();  // 0 (日曜日) ~ 6 (土曜日)
  if (day === 0 || day === 6) {
    return true;
  }
  return false;
}

// 使用例:今日の日付が土日か判定する
function main() {
  const targetDate = new Date(); // 現在の日時
  // 文字列で日付の指定ができる
  // const targetDate = new Date("2023/07/15");
  console.log("日付: " + Utilities.formatDate(targetDate, "JST", "yyyy/MM/dd"));
  if (isWeekend(targetDate)) {
    console.log("土曜日・日曜日です。");
  } else {
    console.log("平日(月~金)です。");
  }
}

DateオブジェクトのgetDayメソッドは、日曜日を0として月曜日から土曜日までを1から6の数字で返します。そのためこの関数は、指定された日付が土曜日(6)または日曜日(0)である場合にtrueを返し、それ以外の場合はfalseを返します。

祝日の一覧を取得する

祝日の一覧を取得するのにGoogleカレンダーを使用します。ja.japanese.official#holiday@group.v.calendar.google.comは、Googleカレンダーの日本の祝日カレンダーのIDを表します。

// 祝日を取得する関数を定義
function getHolidays() {

  // 2023年の開始日と終了日を設定
  const startDate = new Date("2023/01/01");
  const endDate = new Date("2023/12/31");

  // 日本の祝日カレンダーのIDを定義
  const holidayCalendarId = 'ja.japanese.official#holiday@group.v.calendar.google.com';
  
  // カレンダーIDを使用してカレンダーを取得
  const calendar = CalendarApp.getCalendarById(holidayCalendarId);
  
  // 2023年の間で定義したカレンダー上の全イベント(祝日)を取得
  const events = calendar.getEvents(startDate, endDate);

  // 各イベント(祝日)について繰り返し処理
  for (const event of events) {

    // 祝日の日付を取得し、日本のタイムゾーンで"yyyy/MM/dd"形式にフォーマット
    const holidayDate = Utilities.formatDate(event.getStartTime(), "JST", "yyyy/MM/dd");
    
    // 祝日の名前を取得
    const holidayTitle = event.getTitle();
    
    // 祝日の名前と日付をコンソールに出力
    console.log(`${holidayTitle}: ${holidayDate}`);

  }

}
  • holidayCalendarId: この変数は、Googleカレンダー上で日本の祝日を表すカレンダーのIDを保持しています。これはGoogle Apps Scriptの getCalendarById メソッドでカレンダーを取得するために使われます。
  • calendar: この変数は、holidayCalendarId で指定されたIDを持つカレンダーのオブジェクトを保持します。このオブジェクトを使用してカレンダーからイベント(祝日)を取得します。
  • events: この変数は、startDate から endDate の間の calendar カレンダー上の全てのイベント(祝日)を保持する配列(リスト)です。
  • event: これはfor...ofループの中で使用される変数で、ループが進むたびに events 配列の次の要素(祝日)を保持します。
  • holidayDate: この変数は、現在の event (祝日)の開始時刻(実際には日付)を保持します。日付は "yyyy/MM/dd" 形式の文字列としてフォーマットされ、日本のタイムゾーン("JST")に基づいています。
  • holidayTitle: この変数は、現在の event (祝日)のタイトル(つまり祝日の名前)を保持します。

エラー

マイカレンダー( https://calendar.google.com/ )に「日本の祝日」カレンダーが登録されていないとエラーになります。

エラー
TypeError: Cannot read properties of null (reading 'getEvents')
getHolidays @ コード.gs:8

カレンダーの追加画面でja.japanese.official#holiday@group.v.calendar.google.comを入力して追加しましょう。

祝日を判定する

この関数isHoliday()は特定の日付targetDateが祝日であるかどうかを判定します。

function isHoliday(targetDate) {
  // 日本の祝日カレンダーのIDを定義
  const holidayCalendarId = 'ja.japanese.official#holiday@group.v.calendar.google.com';
  
  // カレンダーIDを使用してカレンダーを取得
  const calendar = CalendarApp.getCalendarById(holidayCalendarId);

  // ターゲットの日付のイベント(祝日)を取得
  const events = calendar.getEventsForDay(targetDate);

  // イベントが存在するかどうかをチェック(存在すれば祝日、存在しなければ非祝日)
  return events.length > 0;
}

// 使用例:2023年1月1日が祝日(元日)であることを確認
function main() {

  const targetDate = new Date("2023/01/01"); // 特定の日付

  console.log("日付: " + Utilities.formatDate(targetDate, "JST", "yyyy/MM/dd"));

  if (isHoliday(targetDate)) {
    console.log("○ きょうは祝日です。");
  } else {
    console.log("× 祝日ではないです。");
  }

}

getEventsForDay()でその日のイベント(祝日)を取得します。eventsは配列なので祝日の場合は要素数が1になります。

Discussion