Notion API を使用してデータベースへテキストを雑に投げる処理を作る
こんにちは。tsuen4 (つえんし)です。
普段の生活で感じたことや考えたことを、自分だけが見えるところへ Twitter 感覚で記録したい時はありませんか?
僕はこれまで、自分しかいない Discord サーバー上に作成した Webhook 宛に諸々を記録していました。Notion のデータベースと出会ったことで日付別に振り返りやすそうだと感じ、今回の処理を作成してみました。
こんな感じのことができます(上)
Notion API を叩く実態は AWS Lambda 上にあり、リクエストされた日時をページのタイトルとし、受け取ったテキストを追加しています。その日のページが無ければ自動で作成されます。
下に映っているものは、Discord の Webhook 宛に POST するために開発した CLI ツールです。(略してwepo)
インターネット経由で追加できるように組むことで、iOS のショートカット機能や Android アプリの HTTP Request Shortcuts からでも雑にテキストを溜められるようにできます。
GitHub
ソースコードを公開してみました。
やったこと
大まかにやったことと、Notion API を叩く側のコードを共有します。
Notion API を初めて触るにあたって、とりあえず公式が提供している SDK で触ってみたいと考えたため、TypeScript の勉強も兼ねて Notion SDK for JavaScript を採用しました。
Notion のトークンとデータベース ID を取得する
以下を参考に Notion の統合とデータベースを作成し、コネクトで接続している状態にします。トークンとデータベース ID は後で使用します。
処理を作成する
以下のように作成しました。作成するにあたり、API Reference の ENDPOINTS あたりを参照していました。
呼び出す
かなり省略していますが、以下のような形で呼び出すことで、指定したタイトルのページとテキストが Notion のデータベース上に記録されます。
const action = new Action('your token', 'your database_id');
await action.put('title', 'text');
苦労したこと
Union 型で定義された API レスポンスに対する子要素の取得
TypeScript 初心者が故に型アサーション(as)の使い所を理解しておらずハマりました。
実装当初は (result as PageObjectResponse).parent
の部分を result.parent
で取得しようとしていました。コンパイラとしては result
を PartialPageObjectResponse
として認識しており、その PartialPageObjectResponse
には parent
は存在しないため、どうしたら PageObjectResponse
として認識してくれるんだろうとウンウン悩んでいました。
幸い、「 as
で型に対して何かできた気がする」ぐらいの知識はあったので、調べてみると以下にたどり着いて解決しました。
2023/04/05 追記:
型ガードを行わずに型アサーションを使用するのは無理やりすぎると感じてはいました。もう少し調べてみると特定のキーを保持しているかどうかの判定で良いみたいでした。これを知るまでは、null かどうかでの型ガードしか頭にありませんでした。
また、公式の SDK で Type gurds 用のヘルパー関数が提供されていました! 今回の用途では isFullPage(result)
で PageObjectResponse
かどうかを判定すると良いみたいです。
最後に
最後まで読んでいただきありがとうございます。
自分の意志で作ったものを記事といった形でアウトプットするのは初めてでした。今回共有した処理が面白そう、便利そうだと感じていただけたら幸いです。
Discussion