あなたの生活に十六夜記念日を

# はじめに
十六夜、それはみらいちゃんとリコちゃんの出会いと再会の日。

毎月やってくるこの記念日、忘れずにお祝いしたいですよね。

でも仕事で忙殺されているなか、毎日Webで月齢を調べる余裕なんてありません。（毎日夜空を見上げる？それが一番です。魔法つかいに会えるかもしれません）

なのであらかじめGoogleカレンダーに十六夜記念日の予定を入れておきましょう。

でも、毎月の十六夜の日にちを調べてカレンダーに手入力するのは面倒です......みらリコのためならばと奮起しますがやっぱり面倒くさい。

そこでGAS。
GASを使って自動で毎月の十六夜の日に十六夜記念日を設定しようではないか！

# やりたいこと
* Googleカレンダーの毎月の十六夜の日に十六夜記念日という予定を設定したい
* GASを使って、スクリプト実行により自動で記念日を設定したい
* 記念日の予定の色は黄色にしたい。月が輝いてるみたいなので

# どうやるか
1. Google公式の"月の位相カレンダー"から満月の予定日のみ抽出する
2. 1の結果をforループで回し、満月の翌日を"十六夜記念日"として予定を作成する

参考
* 月の位相カレンダーについて
    * [代替カレンダーを追加または削除する](https://support.google.com/calendar/answer/13748650?hl=ja&co=GENIE.Platform%3DAndroid)
    * "上弦","満月","下弦","新月"の4つの予定が設定されている。"十六夜"の予定が設定されていればこんなことしなくてよかった

# GASコード
## 前準備：十六夜記念日のカレンダーを設定
```javascript
// 十六夜カレンダーの書式設定
const configIzayoiCalendarName = '十六夜記念日';
const configIzayoiEventName = configIzayoiCalendarName;
const configIzayoiEventDescription = '今夜は十六夜だね……';
const configIzayoiEventLocation = '津奈木町';
// カレンダーの予定の色はバナナ
const configIzayoiCalendarColor = '#F6BF26';

// 十六夜カレンダーを作成する範囲
const configIzayoiCalendarStartTime = new Date();
// 月の位相カレンダーの全ての予定に対して処理したいためとりあえず10年後までを指定
// 現在、月の位相カレンダーは来年12月末まで作成されているようなのでとりあえずこれでOK
const configIzayoiCalendarEndTime = new Date(
    configIzayoiCalendarStartTime.getFullYear() + 10,
    configIzayoiCalendarStartTime.getMonth(), 
    configIzayoiCalendarStartTime.getDate()
);

// 十六夜記念日カレンダーが既に存在していれば一旦すべて削除
const izayoiCalendarNum = (
    CalendarApp.getCalendarsByName(configIzayoiCalendarName)
).length;
if(izayoiCalendarNum >= 1) {
    const oldIzayoiCalendarArray = CalendarApp.getCalendarsByName(configIzayoiCalendarName);
    for(const oldIzayoiCalendar of oldIzayoiCalendarArray) {
        oldIzayoiCalendar.deleteCalendar();
    }
    Logger.log('既存の十六夜記念日のカレンダーを全て削除しました');
}
// 十六夜カレンダーを新規作成
const izayoiCalendar = CalendarApp.createCalendar(
    configIzayoiCalendarName, 
    {
        color: configIzayoiCalendarColor
    }
);
Logger.log('十六夜記念日のカレンダーを新規作成しました');
```

## 手順1："月の位相カレンダー"から満月の予定日のみ抽出する
```javascript
// 月の位相のカレンダーを取得
const moonPhasesCalendar = CalendarApp.getCalendarById(
    'ht3jlfaac5lfd6263ulfh4tql8@group.calendar.google.com'
);
if(moonPhasesCalendar === null) {
    // エラー発生したら終了
    Logger.log('月の位相カレンダーにアクセスできないため終了しました');
    return;
}

// 満月の予定を取得
const fullMoonEventArray = moonPhasesCalendar.getEvents(
    configIzayoiCalendarStartTime,
    configIzayoiCalendarEndTime,
    {
        search: '満月'
    }
);
```

## 手順2：満月の翌日を"十六夜記念日"として予定を作成する
```javascript
// 全ての満月の予定日に対してループを回す
for(const fullMoonEvent of fullMoonEventArray) {
    // 十六夜の日にちを計算
    const fullMoonDate = fullMoonEvent.getAllDayStartDate();
    const izayoiDate = new Date(
        fullMoonDate.getFullYear(), 
        fullMoonDate.getMonth(), 
        fullMoonDate.getDate() + 1
    );

    // 十六夜記念日を作成
    izayoiCalendar.createAllDayEvent(
        configIzayoiEventName,
        izayoiDate,
        {
            description: configIzayoiEventDescription,
            location: configIzayoiEventLocation
        }
    );

    // ログ出力
    Logger.log(
        Utilities.formatDate(izayoiDate, "GMT", 'yyyy/MM/dd') + 
        ' ' + 
        configIzayoiEventName
    );
}
```

# 実行結果
* ちゃんと満月の翌日に"十六夜記念日"が作成されました

![1_2024年11月.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367021/19eed340-98b5-27f2-3740-511431f13b0d.png)
![2_2024年11月_予定展開_モザイク.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367021/5c3032c7-aabb-b99c-0bbf-d87e50ea8db4.png)
*  2025/12月まで"十六夜記念日"が作成されました
    * これは月の位相カレンダーの予定が2025/12月までしか存在しないためです
    * 今後カレンダーに都度予定が追加されていくのかな？

![3_2025年12月.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367021/59b3c254-ff00-69c6-c65e-0fcd644fd0a8.png)

# やりたいことが出来たか振り返り
* Googleカレンダーの毎月の十六夜の日に十六夜記念日という予定を設定したい
＞できた。
* GASを使って、スクリプト実行により自動で記念日を設定したい
＞できた。しかしスクリプトを年1で実行する必要があるところに課題あり。
月の位相カレンダーが来年12月末までの予定しか設定されていないので、予定が更新されたタイミングでスクリプトを再実行する必要がある。

* 記念日の予定の色は黄色にしたい。月が輝いてるみたいなので
＞できた。が、予定の文字色を黒から変更したいが変更方法が分からない……

## 今後の課題まとめと対応策
* スクリプトを年1で実行する必要がある
＞スクリプトを自動で実行する方法がないか調査する。
　なければ年1で実行する。
* 予定の文字色を黒から変更する方法が分からない
＞調査を進める。なさそうなら諦める。

# おわりに
毎日夜空を見上げる習慣があればよかった。