📅

NotionFormulaを使って記念日を自動的に管理することで、もう記念日を忘れることはありません!

2024/03/13に公開

記念日を覚えきれないと思ったことはないですか?

こんにちは、IVRyのエンジニアをしている高井です。
皆さんは記念日を覚えきれないと思ったことはないですか?
結婚記念日・誕生日・プロダクトリリース記念日などなど、歳を重ねるごとに記念日は増えがちです。記念日がたくさんあることは嬉しいことがほとんどですが、人間なんでうっかり忘れてしまうこともあります。人間は忘れる機能があるんでね。※筆者はリアルに自分の年齢を間違えることがあります。

この記事を開いている皆さんは、このうっかり問題に対して色々と対策をされているんじゃないでしょうか?

僕もこれまでカレンダーに毎年繰り返されるイベントを登録して管理などをしていたりしました。これはイベントを忘れないという意味ではベターだと思います。しかし記念日が間近に迫ってきてから気付いたり、うちの親の年齢っていくつだっけ??となることが多く、僕みたいなズボラな人間にはもっと機能が必要だと思うんです。

機能を挙げると以下があると良さそうと考えました。

  • 次の記念日の一覧
  • 対象の記念日まであと何日なのか分かる
  • 何回記念日を迎えたのか分かる

そして、それらは Notion(NotionFormula) でできそうだから調べてみるかと思い立ち、筆を取っています。

本日の成果物

結論として以下のスクリプトになりました。 prop("記念日") の部分をデータベースに合わせて書き換えると動作します👍

lets(
  targetDate, prop("記念日"),
  yearBetween, year(now()) - year(targetDate),
  foo, dateAdd(targetDate, yearBetween, "years"),
  bar, dateAdd(targetDate, yearBetween + 1, "years"),

  ifs(
    dateBetween(foo, now(), "days") < 0, bar,
    dateBetween(foo, now(), "days") > 0, style(format(foo), "b"),
    style("🎉 TODAY 🎉", "red")
  )
)

実際にデータベースに使用すると以下のようになります。

NotionFormulaを使って記念日を自動的に管理することで、もう記念日を忘れることはありません!

このコードをに至るまでの思考過程を以下に記載してます。

こんな感じで NotionFormula を使えば算出できそう

なんか一行くらいでできちゃうんじゃないかな?と書き始めたんですが、その見立ては甘くてテストケースと判定式を考えるところから出発することにしました。

今年の記念日までの日数

なにを判定したいんだよ? 次の記念日とは? と自問自答して「今年の記念日が今日より前なのか?」を求めれば良いと気づきました。

// 今年の記念日までの日数
dateBetween(
  // 今年の記念日
  parseDate(
    join([
      year(now()), // 年だけ今年に差し替える
      formatDate(prop("記念日"), "MM"),
      formatDate(prop("記念日"), "DD")
    ], "-")
  ),
  // 今と比較
  now(),
  "days"
)

これで以下を作ることができます。

  • 今年の記念日が今日であれば今年の記念日を表示
  • 今年の記念日を過ぎていれば来年の記念日を表示
  • 今年の記念日を迎えていなければ今年の記念日を表示

コーディングするとこうなります。

if(
  equal(prop("今年の記念日"), 0),
  parseDate(join([year(now()), formatDate(prop("記念日"), "MM"), formatDate(prop("記念日"), "DD")], "-")),
  if(
    prop("今年の記念日") < 0,
    dateAdd(prop("記念日"), year(now()) - year(prop("記念日")) + 1, "years"),
    dateAdd(prop("記念日"), year(now()) - year(prop("記念日")), "years")
  )
)

ここに来て僕は変数化をできる便利関数を見つけます!

lets で 今年の記念日までの日数なんかも変数化してしまえば、データベースプロパティを増やさなくて良さそう。そして、今日の判定は不要だし、 parseDate(join([year(now()), formatDate(prop("記念日"), "MM"), formatDate(prop("記念日"), "DD")], "-"))dateAdd(prop("記念日"), year(now()) - year(prop("記念日")), "years") は同じだということに気づきました。

そうして、リファクタをして以下のようになりました。

lets(
  // 記念日プロパティから日付を取得
  targetDate, prop("記念日"),
  // 記念日と今年の差分年数
  yearBetween, year(now()) - year(targetDate),
  // 今年の記念日(記念日に差分年数を加える)
  foo, dateAdd(targetDate, yearBetween, "years"),
  // 来年の記念日(記念日に差分年数+1年を加える)
  bar, dateAdd(targetDate, yearBetween + 1, "years"),

  ifs(
    // 今年の記念日を過ぎていれば来年の記念日を表示
    dateBetween(foo, now(), "days") < 0, bar,
    // 今年の記念日を迎えていなければ今年の記念日を表示
    dateBetween(foo, now(), "days") > 0, foo,
    // 今日が記念日ならばクラッカーを表示
    style("🎉 TODAY 🎉", "red")
  )
)

独自記法ではあるものの NotionFormula は Javascript が書ければ分かるなと感じました。

できた!! 記念日の自動化!!

元々は会社の Notion に今年の誕生日とかを入力する(任意)のが面倒で、自動化できるはず!と思って調べはじめました。その元々の目的は達成されて良かった🎉 それに加えて、こうして組み込み関数のドキュメントを読んで使ってみると応用が効くようになり、自分自身の期待以上に良くできました。

例えば上で説明した記念日の自動化に、記念日までの日数をカウントダウンして並べてみたりすると以下のように並んでいい感じじゃないかなと思います。

ベーシックサンプル

もう一つ例を挙げます。
IVRyでは希望者に誕生日・結婚記念日にお花を贈る福利厚生があります。これにも使えるんじゃないかと記念日の自動化を持っていったところ、「お花を送付したらチェックを付けて翌年の記念日を入力してるので、そういう感じに変更できますか?」と早速フィードバックが来ました!ここまでドキュメントを読み込んだ僕はその変更も取り入れることができ、以下が完成しました。

応用編

チェック入れると、さらに次の記念日を表示することができています👍
そして何より嬉しいのが早速データベースが編集されて僕の NotionFormula が使われていたことです☺️

めでたし


https://ivry-jp.notion.site/IVRy-e1d47e4a79ba4f9d8a891fc938e02271


参照ドキュメント

IVRyテックブログ

Discussion