夕暮れに通知がくるようにしたい

- **夕暮れ**とは
日没のころであり、明るい昼から徐々に暗くなって完全に暗い夜となる前の境界の時間帯である。([wiki](https://ja.wikipedia.org/wiki/夕暮れ))
    - その他夕暮れに近い語句
逢魔時、夕方、暮、黄昏、晩、日暮れ、大禍時、黄昏時など
    - 薄明
太陽が地平線の下に沈んだ後でも大気による太陽光の散乱により、しばらくは明るい状態が続く。これを薄明といい、太陽が地平線の下に沈んだ直後の薄明をマジックアワーという。


# はじめに
真っ赤な夕暮れとグラデーションのかかる薄明の時間が好きで、それを外に出て見るためにGASとGoogle Calendarを使った通知システムを作りました。


# 要件
- ~~現在位置(緯度、経度)の取得~~
- 住所の緯度経度を調べて直接コードに入力
- apiを使って緯度経度の位置からの日の入り時刻を取得
[Sunset and sunrise times API](https://sunrise-sunset.org/api)
- google calendarに日の入り時刻を開始時間として予定を追加する
「日の入り」のタグをつける
30分前に通知する設定
- 毎日15時にイベントが発火する

「現在位置(緯度、経度)の取得」ですが、バックグラウンドで取得することができなさそうだったので、近場の緯度経度をベタ書きして情報を渡すことにしました。
※ブラウザを作ってGeolocation APIを使えば現在位置を取得することはできますが、「時間になったらブラウザを開かないといけない」と「時間になったら通知してほしい」は矛盾しているのでこの方法は使えません。

# 手順

### 1. google calendarに新しいカレンダーを追加
- ここでは「日の入り」という名前で作成
- GoogleカレンダーのIDを取得
        取得方法: https://qiita.com/mikeneko_t98/items/60e264941492d0b44fe5


### 2. Google Apps Scriptで新しいプロジェクトを作成
- 以下のコードをコード.gsに貼り付け
- 修正が必要な箇所
	- 夕暮れを見たい場所の緯度、経度の入力
	- GoogleカレンダーのIDの入力

```
    // 現在位置（緯度、経度）を取得する関数
   function getCurrentLocation() {
     //APIを使って緯度経度を取得する場合はここに書く
     return {latitude: 緯度, longitude: 経度};
   }
   
   // 日の入り時刻を取得する関数
   function getSunsetTime(latitude, longitude) {
     var today = new Date();
     var formattedDate = today.toISOString().split('T')[0]; // ISO 8601形式の日付に変換し、時刻部分を削除
   
     var url = 'https://api.sunrise-sunset.org/json?lat=' + latitude + '&lng=' + longitude + '&date=' + formattedDate;
   
     var response = UrlFetchApp.fetch(url);
     var data = JSON.parse(response.getContentText());
     var sunsetTimeString = data.results.sunset;
     var sunsetTimeUTC = parseTimeString(sunsetTimeString);
     // UTCをJSTに変換
     var sunsetTimeJST = new Date(sunsetTimeUTC.getTime() + (9 * 60 * 60 * 1000));
     return sunsetTimeJST;
   }
   
   function parseTimeString(timeString) {
     // 時刻文字列を解析する
     var timeParts = timeString.split(':');
     var hours = parseInt(timeParts[0], 10);
     var minutes = parseInt(timeParts[1], 10);
     var seconds = parseInt(timeParts[2].split(' ')[0], 10);
     var isPM = timeParts[2].split(' ')[1] === 'PM';
   
     // PMの場合、12時間分を加算する
     if (isPM && hours !== 12) {
       hours += 12;
     }
   
     // Dateオブジェクトを作成して返す
     var date = new Date();
     date.setHours(hours);
     date.setMinutes(minutes);
     date.setSeconds(seconds);
   
     return date;
   }
   
   // Googleカレンダーに予定を追加する関数
   function addEventToCalendar(startTime) {
     var calendarId = 'GoogleカレンダーのID';  // GoogleカレンダーのIDを指定してください
     var calendar = CalendarApp.getCalendarById(calendarId);
     var event = calendar.createEvent('日の入り', startTime, startTime); // 終了時刻は開始時刻と同じ
     event.addPopupReminder(30); // 30分前に通知する
   
     Logger.log('Event added to Google Calendar');
   }
   
   // メイン関数
   function main() {
     var location = getCurrentLocation();
     var sunsetTime = getSunsetTime(location.latitude, location.longitude);
   
     // Googleカレンダーに予定を追加します
     addEventToCalendar(sunsetTime);
   }
```

### 3. 15時ごろに発火するようにトリガーを作成

設定は以下のようにしました

![dfb491ffa64900e6a48aeef0724489d5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602666/a2d32bda-cc64-2a29-8ab9-57b9638442a8.png)




# あとがき
- 去年の冬から夕暮れを見るために毎日の繰り返しで16時半にアラームをかけていましたが、春になって日が暮れる時間が伸びてしまったので、今後も年中使えるようにこのようなものを作りました
- 通知がきちんとくることを期待して明日からが楽しみです