kokh log

主にフロントエンドの備忘録

Notion日報の更新を簡単にする

背景

2024年1月にNotionCalendarが登場したことがきっかけで、すべてのタスク管理をNotionに一元化しました。
ただ、Notionはかなり高性能であるがゆえ、シンプルなテキストエディタに比べとっさのメモをとるときに腰の重さを課題に感じていました。

ページを開かずとも気軽にメモがとれるようにしたかったので、Notion API を利用してどこからでもメモを追加できるようなエントリーポイントを作りました。

今回やりたいこと

  • 今日の日報ページ(データベース上で作成日が最新のページ)にメモを追加するエントリーポイントを作る
    • Notionで毎日AM3:00に今日の日報ページを作成するように自動化しているため、リクエストしたタイミングによって追加先が変わる
    • Notion API をそのまま curl 等でたたくことでも実現できるが、iOS ショートカットや Alfred,IFTTT など様々なツールとの連携を容易にしたい
  • text, embed, video のいずれかの形式で追加できる
  • メモは日報ページの一番下に追加される
  • 無料で運用できる
  • とにかく簡単に速く、構築・デプロイができる
  • 自分好みに簡単にカスタムできる

考えたこと

GAS

最初に、無料+簡易API = GAS!とよく考えずにclaspで作成しましたが、外部モジュールを使うのにとても苦労しました(公式で rollup でバンドルして使うことを推奨されていましたが全くうまくいかず)Promise 使えないのも地味につらいです。
外部モジュールを使うほどのことでもないので大人しくGASエディタで直書きしてしばらく運用するも、何日か経つと承認エラーが発生し、手動で承認しなおさないといけないという問題が発生しました。(昔はそんなことなかった気がするのですが…)
GASは手軽ですが、今回の用途には向いていませんでした。

iPaaS

IFTTT、Zapier、makeなど便利なiPaaSがありますが、今回のようにqueryを使ってNotionページを取得する要件がある場合、まぁまぁな課金が必要でした。IFTTTだとPro+プラン$12.5ドル/monthなので、個人のちょっとした用途としてはちょっと高いかなと思いました。

ただし、IFTTTはProプラン$2.92/monthには課金しました。XがIFTTTしか対応してなさそうだったので、無料プランの2Appletだと不足だった(Proは20Appletまで)のでこちらは致し方ないです。

Vercel Functions

Vercel FunctionsはHobbyプランでも利用できAPI作成も簡単そうなので今回はこちらを選択しました。
他サーバーレスのCloud FunctionsやAWS Lambdaでも同じことは実現できると思いますが、結果的にBasic認証ややりたいことのシンプルさを加味するとVercel Functionsを選んで正解だったと思いました。

つくったもの

/api/notion/latestにGETリクエストを送ると今日の日報ページのURLを返し、PUTリクエストを送るとメモを追加します。

https://github.com/yumikokh/notion-update-trigger/blob/80157f7f35163394b4900f9a8629804a25cd7be7/app/api/notion/latest/route.ts#L10-L32:embed:lang=typescript

github.com

詳細についてはこの記事では割愛しますが、Vercel FunctionsのQuickstartを上から実行しただけになります。GASで苦労したのが嘘のようにスイスイ進みました 🤗

vercel.com

今回はNext.jsのAppRouterを使っているので、/app/api以下にルーティングを作成するだけで、NodeランタイムのAPIを追加できました🎉
保守に関して何も考えなくていいので、楽ちんです。アクセスログdashboardから確認できます。

たださすがにこのままだと、エントリーポイントが漏れたら誰でも私の日報を書き換えられてしまうので、Basic認証はかけました。

middleware.ts を追加し、/api/auth にroutingを追加するだけです。

https://github.com/yumikokh/notion-update-trigger/blob/80157f7f35163394b4900f9a8629804a25cd7be7/middleware.ts#L3-L25:embed:lang=typescript

zenn.dev

活用事例

iOSショートカットのオートメーションを使って、起床時に睡眠時間を追加するようにしています。
このデータを書いていると、AIで振り返るときの精度があがります。

まとめ

日報を1日の最後にまとめて書こうとすると、その日の出来事を思い出すのに時間がかかります。
サービスのwebhookやiOSショートカットなどを活用してライフログ的に勝手に日報を更新してくれるようになったことで、並んでいるNotionブロックを並べて整えるだけで日報が完成するようになりました。つい日報をさぼった日でも、何かしらの記録が残っていると補完ができるので、日報を書かない日がほとんどなくなるという相乗効果を発揮しました😄