17
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[GAS] カレンダーの「祝日のみ」と「祝日およびその他の休日」

Last updated at Posted at 2024-09-02

これは何?

GoogleAppsScript(GAS)を使って祝日判定をするときに、Googleに用意されている「日本の祝日」カレンダーを利用することが多いです。という記事を書いていたのですが、2025年12月20日にコメントを頂き、仕様が変わっていることを知りました。変更後の内容に以下の記載を更新しました。

カレンダーの設定

GASを実行するアカウントでカレンダーを設定する

※「GASを実行するアカウントのカレンダー」というのがポイントです。

↓赤丸を押して、 カレンダーに登録 を選択する。
image.png

カレンダIDを入力

↓の画面で ja.japanese#holiday@group.v.calendar.google.com を入力する

image.png

コンテンツを選択

image.png

以下のように「自分のカレンダーに表示させたい祝日ごとにチェックを入れる」ような仕様に変わっていました。

image.png

image.png

↓試しに「祝日」と「その他の行事」の全てにチェックがある状態だとこうなりました。

image.png

↓「その他の行事」のチェックを外すとこうなります。

image.png

GASのコード

function getJapaneseHolidays() {
  const calendarId = 'ja.japanese#holiday@group.v.calendar.google.com'
  const holidayCalendar = CalendarApp.getCalendarById(calendarId);

  const start = new Date(2026, 0, 1);
  const end = new Date(2027, 0, 1);
  const holidayEvents = holidayCalendar.getEvents(start, end);
  const holidayNames = holidayEvents.map(holidayEvent => {
    return `${Utilities.formatDate(holidayEvent.getStartTime(), "JST", "yyyy-MM-dd")} ${holidayEvent.getTitle()}`;
  })
  console.log(holidayNames);
}
実行結果
[ '2026-01-01 元日',
  '2026-01-02 銀行休業日',
  '2026-01-03 銀行休業日',
  '2026-01-12 成人の日',
  '2026-02-03 節分',
  '2026-02-11 建国記念の日',
  '2026-02-23 天皇誕生日',
  '2026-03-03 雛祭り',
  '2026-03-20 春分の日',
  '2026-04-29 昭和の日',
  '2026-05-03 憲法記念日',
  '2026-05-04 みどりの日',
  '2026-05-05 こどもの日',
  '2026-05-06 憲法記念日 振替休日',
  '2026-05-10 母の日',
  '2026-07-07 七夕',
  '2026-07-20 海の日',
  '2026-08-11 山の日',
  '2026-09-21 敬老の日',
  '2026-09-22 国民の休日',
  '2026-09-23 秋分の日',
  '2026-10-12 スポーツの日',
  '2026-11-03 文化の日',
  '2026-11-15 七五三',
  '2026-11-23 勤労感謝の日',
  '2026-12-25 クリスマス',
  '2026-12-31 大晦日' ]

うん。これで取得できた!...と思ったでしょ?

よくわからないところ

取得はできたのですが、カレンダーの設定と、GASで取得できる情報が一致しませんでした。

image.png

↑ この状態でGASを実行しても上記の実行結果と同じなんですよね。(実運用上、雛祭り とか 七五三 は祝日判定に使わないことのほうが多いですよね)

解決策

Calendar Service を眺めたのですが、記載が見つけられませんでした。

AIに聞いたら getDescription() で取得できる文字列の中の「祝日」で判定するといいよ」って教えてもらったので、まずはこれでいいのかな。

  const holidayNames = events.map(event => {
    return `${Utilities.formatDate(event.getStartTime(), "JST", "yyyy-MM-dd")} | ${event.getTitle()} | ${event.getDescription()}}`;
  })
実行結果
[ '2026-01-01 | 元日 | 祝日}',
  '2026-01-02 | 銀行休業日 | 祭日\n祭日を非表示にするには、Google カレンダーの [設定] > [日本の祝日] に移動してください}',
  '2026-01-03 | 銀行休業日 | 祭日\n祭日を非表示にするには、Google カレンダーの [設定] > [日本の祝日] に移動してください}',
  '2026-01-12 | 成人の日 | 祝日}',
  '2026-02-03 | 節分 | 祭日\n祭日を非表示にするには、Google カレンダーの [設定] > [日本の祝日] に移動してください}',
  '2026-02-11 | 建国記念の日 | 祝日}',
  '2026-02-23 | 天皇誕生日 | 祝日}',
  '2026-03-03 | 雛祭り | 祭日\n祭日を非表示にするには、Google カレンダーの [設定] > [日本の祝日] に移動してください}',
  '2026-03-20 | 春分の日 | 祝日}',
  '2026-04-29 | 昭和の日 | 祝日}',
  '2026-05-03 | 憲法記念日 | 祝日}',
  '2026-05-04 | みどりの日 | 祝日}',
  '2026-05-05 | こどもの日 | 祝日}',
  '2026-05-06 | 憲法記念日 振替休日 | 祝日}',
  '2026-05-10 | 母の日 | 祭日\n祭日を非表示にするには、Google カレンダーの [設定] > [日本の祝日] に移動してください}',
  '2026-07-07 | 七夕 | 祭日\n祭日を非表示にするには、Google カレンダーの [設定] > [日本の祝日] に移動してください}',
  '2026-07-20 | 海の日 | 祝日}',
  '2026-08-11 | 山の日 | 祝日}',
  '2026-09-21 | 敬老の日 | 祝日}',
  '2026-09-22 | 国民の休日 | 祝日}',
  '2026-09-23 | 秋分の日 | 祝日}',
  '2026-10-12 | スポーツの日 | 祝日}',
  '2026-11-03 | 文化の日 | 祝日}',
  '2026-11-15 | 七五三 | 祭日\n祭日を非表示にするには、Google カレンダーの [設定] > [日本の祝日] に移動してください}',
  '2026-11-23 | 勤労感謝の日 | 祝日}',
  '2026-12-25 | クリスマス | 祭日\n祭日を非表示にするには、Google カレンダーの [設定] > [日本の祝日] に移動してください}',
  '2026-12-31 | 大晦日 | 祭日\n祭日を非表示にするには、Google カレンダーの [設定] > [日本の祝日] に移動してください}' ]

↑ descriptionの中に「祝日」と「祭日」の区別があるようです。これを利用して↓

function getJapaneseHolidays() {
  const calendarId = 'ja.japanese#holiday@group.v.calendar.google.com';
    const holidayCalendar = CalendarApp.getCalendarById(calendarId);

  const start = new Date(2026, 0, 1);
  const end = new Date(2027, 0, 1);
  const events = holidayCalendar.getEvents(start, end);

  //フィルタリングして祝日のみを抽出
  const holidayNames = events.filter(event => {
      const desc = event.getDescription();
      return desc.includes("祝日");
    }).map(event => {
      return `${Utilities.formatDate(event.getStartTime(), "JST", "yyyy-MM-dd")} ${event.getTitle()}`;
    });

  console.log(holidayNames);
}
実行結果
[ '2026-01-01 元日',
  '2026-01-02 銀行休業日',
  '2026-01-03 銀行休業日',
  '2026-01-12 成人の日',
  '2026-02-03 節分',
  '2026-02-11 建国記念の日',
  '2026-02-23 天皇誕生日',
  '2026-03-03 雛祭り',
  '2026-03-20 春分の日',
  '2026-04-29 昭和の日',
  '2026-05-03 憲法記念日',
  '2026-05-04 みどりの日',
  '2026-05-05 こどもの日',
  '2026-05-06 憲法記念日 振替休日',
  '2026-05-10 母の日',
  '2026-07-07 七夕',
  '2026-07-20 海の日',
  '2026-08-11 山の日',
  '2026-09-21 敬老の日',
  '2026-09-22 国民の休日',
  '2026-09-23 秋分の日',
  '2026-10-12 スポーツの日',
  '2026-11-03 文化の日',
  '2026-11-15 七五三',
  '2026-11-23 勤労感謝の日',
  '2026-12-25 クリスマス',
  '2026-12-31 大晦日' ]

これで意図通り。

だけど今後の仕様変更でdescriptionの内容が変わるかもしれないですよね。そのうち、「設定画面でチェックしたものだけが取得できる」ようになるような気がしています。

17
6
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?