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

# これは何？

GoogleAppsScript(GAS)を使って祝日判定をするときに、Googleに用意されている「日本の祝日」カレンダーを利用することが多いですが、このカレンダーには「祝日のみ」と「祝日およびその他の休日」の2つのコンテンツがあることを今日知ったので、その違いを記します。

今日知ったというか過去にはコンテンツが1つしかなかったと記憶しています。どこかのタイミングでコンテンツが増えて、しかも困ったことにデフォルトが「祝日およびその他の休日」になってるみたい。

**正しく使い分けないと「節分」や「七夕」が「祝日」として判定されちゃいます。**


# 先に注意点

カレンダーの設定画面で指定したコンテンツ(`祝日のみ`or`祝日およびその他の休日`)と、GASのコードで指定するカレンダーID(祝日のみ、祝日及びその他、それぞれにカレンダIDがある)を合わせておかないとエラーになります。

# 祝日判定のやりかた

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

↓赤丸を押して、 **カレンダーに登録** を選択する。
![c1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8612/17408cbd-e586-81d1-e2cb-64a4ceef5913.png)


### カレンダIDを入力

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

![c2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8612/0df24c80-96df-8893-85a9-cf127c67a144.png)


### コンテンツを選択

↓の画面で「祝日のみ」「祝日およびその他の休日」を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8612/c6f36f61-fddb-5c3c-1381-e3a902332a9d.png)


選択に応じて、カレンダーIDが異なるので注意。

「祝日のみ」のカレンダーID: ` ja.japanese.official#holiday@group.v.calendar.google.com`

「祝日およびその他の休日」のカレンダーID: `ja.japanese#holiday@group.v.calendar.google.com`


## (2)GASのコード

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

  const start = new Date(2024, 0, 1);
  const end = new Date(2025, 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);
}
```

```plaintext:実行結果
[ '2024-01-01 銀行休業日',
  '2024-01-01 元日',
  '2024-01-02 銀行休業日',
  '2024-01-03 銀行休業日',
  '2024-01-08 成人の日',
  '2024-02-11 建国記念の日',
  '2024-02-12 建国記念の日 振替休日',
  '2024-02-23 天皇誕生日',
  '2024-03-20 春分の日',
  '2024-04-29 昭和の日',
  '2024-05-03 憲法記念日',
  '2024-05-04 みどりの日',
  '2024-05-05 こどもの日',
  '2024-05-06 こどもの日 振替休日',
  '2024-07-15 海の日',
  '2024-08-11 山の日',
  '2024-08-12 休日 山の日',
  '2024-09-16 敬老の日',
  '2024-09-22 秋分の日',
  '2024-09-23 秋分の日 振替休日',
  '2024-10-14 スポーツの日',
  '2024-11-03 文化の日',
  '2024-11-04 文化の日 振替休日',
  '2024-11-23 勤労感謝の日',
  '2024-12-31 大晦日' ]
```

注意点にも書きましたが、「カレンダーの設定」と「GASの中のカレンダーID」を揃えておかないと下記のエラーになります。

```
TypeError: Cannot read properties of null (reading 'getEvents')
```


# 比較してみる

ここで `calendarId`に「祝日およびその他の休日」のカレンダーID を指定すると下記のような結果になります。(GASの実行前に、カレンダーの「祝日カレンダーのコンテンツ」を「祝日およびその他の休日」に変更する必要あり)

```plaintext: 祝日およびその他の休日
[ '2024-01-01 銀行休業日',
  '2024-01-01 元日',
  '2024-01-02 銀行休業日',
  '2024-01-03 銀行休業日',
  '2024-01-08 成人の日',
  '2024-02-03 節分',
  '2024-02-11 建国記念の日',
  '2024-02-12 建国記念の日 振替休日',
  '2024-02-23 天皇誕生日',
  '2024-03-03 雛祭り',
  '2024-03-20 春分の日',
  '2024-04-29 昭和の日',
  '2024-05-03 憲法記念日',
  '2024-05-04 みどりの日',
  '2024-05-05 こどもの日',
  '2024-05-06 こどもの日 振替休日',
  '2024-05-12 母の日',
  '2024-07-07 七夕',
  '2024-07-15 海の日',
  '2024-08-11 山の日',
  '2024-08-12 休日 山の日',
  '2024-09-16 敬老の日',
  '2024-09-22 秋分の日',
  '2024-09-23 秋分の日 振替休日',
  '2024-10-14 スポーツの日',
  '2024-11-03 文化の日',
  '2024-11-04 文化の日 振替休日',
  '2024-11-15 七五三',
  '2024-11-23 勤労感謝の日',
  '2024-12-25 クリスマス',
  '2024-12-31 大晦日' ]
  ```

  
## 表にしてみたよ

| 日付 | 祝日のみ | 祝日およびその他の休日 |
|:-:|:-:|:-:|
|2024-01-01|銀行休業日|銀行休業日|
|2024-01-01|元日|元日|
|2024-01-02|銀行休業日|銀行休業日|
|2024-01-03|銀行休業日|銀行休業日|
|2024-01-08|成人の日|成人の日|
|2024-02-03|	|節分|
|2024-02-11|建国記念の日|建国記念の日|
|2024-02-12|建国記念の日 振替休日|建国記念の日 振替休日|
|2024-02-23|天皇誕生日|天皇誕生日|
|2024-03-03| |雛祭り|
|2024-03-20|春分の日|春分の日|
|2024-04-29|昭和の日|昭和の日|
|2024-05-03|憲法記念日|憲法記念日|
|2024-05-04|みどりの日|みどりの日|
|2024-05-05|こどもの日|こどもの日|
|2024-05-06|こどもの日 振替休日|こどもの日 振替休日|
|2024-05-12|	|母の日|
|2024-07-07|	|七夕|
|2024-07-15|海の日|海の日|
|2024-08-11|山の日|山の日|
|2024-08-12|休日 山の日|休日 山の日|
|2024-09-16|敬老の日|敬老の日|
|2024-09-22|秋分の日|秋分の日|
|2024-09-23|秋分の日 振替休日|秋分の日 振替休日|
|2024-10-14|スポーツの日|スポーツの日|
|2024-11-03|文化の日|文化の日|
|2024-11-04|文化の日 振替休日|文化の日 振替休日|
|2024-11-15|	|七五三|
|2024-11-23|勤労感謝の日|勤労感謝の日|
|2024-12-25|	|クリスマス|
|2024-12-31| |大晦|


1月1日の「銀行休業日」は「祝日」の判定なんですね。そして「その他の休日」に入っているイベントは「休日」ではないので「その他のイベント」が正しいネーミングなのかなと思いました。

# Chromeの言語設定による違い

Chromeの言語設定を日本語からEnglishに設定した後にカレンダーの設定画面にアクセスしてみたら、「カレンダーを追加」する時点で


* 「祝日のみ」のカレンダーID: `ja.japanese.official#holiday@group.v.calendar.google.com` で追加した場合
![c4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8612/9d5cab73-c4e3-0587-a89a-412b8fd10102.png)



* 「祝日およびその他の休日」のカレンダーID: `ja.japanese#holiday@group.v.calendar.google.com` で追加した場合

![c3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8612/16abe6a3-f910-c73d-5a75-27347a08224b.png)


のように、設定自体が分けられていました。(訳としては `other holidays` なので、やはり「祝日」として意味づけされているようですね)