thumbnail

ゴミ収集日のリマインダーを作る。

Date: 2022/04/10 12:57

Category: none

はじめに

全ての予定はGoogleカレンダーなどのスマホで確認したい派の人間にとって、いまだに紙に印刷されたスケジュール表という形を採用している「ゴミ収集日カレンダー」は厄介者である。

そこで53cal.jpというゴミ収集日をメールで事前に教えてくれるサービスを用いて、Googleカレンダーに自動でゴミ収集日を登録してもらう、という手段を取っていた。
前日に以下のようなメールが送られてくるので、これをGASで読み取ってGoogleカレンダーに登録するという簡単なものだ。

3/30(水)は、「トレー・プラスチック容器」の収集日です。

ただ、このサービス、以下のメール文を最後にサービスが終了してしまっていた...
どうりで最近通知が来なかったわけである。

誠に勝手ながら53calは2022年3月末をもちまして、情報提供サービスを終了させていただきます。これまでのご愛顧に心より感謝申し上げます。
-----
ごみ収集日お知らせサービス53cal(ゴミカレ)

53cal.jpのような代替サービスが他にもあれば助かったのだが、そんなものは今のところ見当たらなかった。
せめてゴミ収集日の情報をAPIで取得できないかも調査したが、少なくとも私が住んでいる地域ではそのようなものは見当たらなかった。

とりあえず、ゴミ収集日のカレンダーを自動的にGoogleカレンダーに登録できさえすればいいので、
その方法を考えることにする。

ゴミ収集日について知る。そして記述する。

私が住んでいる地域ではどうやら、毎週月曜日は紙ゴミの日、などといった感じで、曜日ごとに収集されるゴミが決まっていた。また、1回目の月曜日はペットボトルの日、といった感じで、何回目の何曜日か、というところでも決まっているらしい。

つまり、ゴミ収集日のルールは、以下の3変数で記述できることになる。

  1. ゴミの種類
  2. 曜日
  3. タイミング(1回目, 2回目, ... 5回目)

たとえば、毎週月曜日が燃えるゴミの日であれば、ゴミの種類=燃えるゴミ,曜日=月曜日,タイミング=1回目,2回目,3回目,4回目,5回目という感じだ。

ここまで書き下すことができれば、あとは従来通りGASでGoogleカレンダーに追加できるようにJSON形式などにして、それを読み取り自動でカレンダーを追加できるようにすればいい。

ゴミの種類によっては、月曜日と金曜日のように週に2回収集するものもあるので、以下のように複数定義されることも想定しておく。(以下は一例である)

ゴミ収集日の定義に従ってリマインダーをセットする。

今回の問題は、JSON形式で定義された、いくつかの曜日とタイミングの入った配列を読み取り、それに対応する日付を得るものと考えていい。

もっと噛み砕いて言えば、特定の月において、月曜日の日付を全て取得してきて、1回目の月曜日だったら、その日付の1番目を返してあげさえすれば達成できる。

以下のステップを踏むことでこれを実装した。詳細はコードを見てもらえればわかると思う。

  1. その月の初日の曜日を取得する
  2. その月の最終日を翌月の1日前の日付を求めて特定し、その月が何日あるのかを把握した
  3. range()を定義してその月の最初の各曜日の日付から、曜日ごとの日付配列を作成した
  4. 作成した曜日ごとの日付配列をゴミの種類ごとに定義したJSONを読み取り、対応する日付を求めた
<details><summary>書いたGASのコード</summary>
</details>

実際に登録されたカレンダー

まとめ

53cal.jpで今まで得ていたゴミ収集日カレンダーを、サービス終了をきっかけに多少アナログだがゴミ収集日の情報をJSON形式に変換した。
そのデータをもとにゴミ収集日を取得し、GoogleCalendarに登録するGASを書いた。
事象を観察し一般化することで、自動化(プログラム)に落とし込めるということを改めて実感した例だった。

Hero

まさき。です。PHPエンジニアをやってます。

自分の課題を技術で乗り越えるの好きかもしれないです。

フロントエンドは苦手ですが、少しでもできるようになれたらな、ということでNextJSでこのブログサイトを作りました。