📒

Notion API を使用してデータベースへテキストを雑に投げる処理を作る

2023/04/04に公開

こんにちは。tsuen4 (つえんし)です。

普段の生活で感じたことや考えたことを、自分だけが見えるところへ Twitter 感覚で記録したい時はありませんか?

僕はこれまで、自分しかいない Discord サーバー上に作成した Webhook 宛に諸々を記録していました。Notion のデータベースと出会ったことで日付別に振り返りやすそうだと感じ、今回の処理を作成してみました。

こんな感じのことができます(上)

notion_post.gif

Notion API を叩く実態は AWS Lambda 上にあり、リクエストされた日時をページのタイトルとし、受け取ったテキストを追加しています。その日のページが無ければ自動で作成されます。

下に映っているものは、Discord の Webhook 宛に POST するために開発した CLI ツールです。(略してwepo)

インターネット経由で追加できるように組むことで、iOS のショートカット機能や Android アプリの HTTP Request Shortcuts からでも雑にテキストを溜められるようにできます。

GitHub

ソースコードを公開してみました。

https://github.com/tsuen4/notion-database-putter

やったこと

大まかにやったことと、Notion API を叩く側のコードを共有します。

Notion API を初めて触るにあたって、とりあえず公式が提供している SDK で触ってみたいと考えたため、TypeScript の勉強も兼ねて Notion SDK for JavaScript を採用しました。

Notion のトークンとデータベース ID を取得する

以下を参考に Notion の統合とデータベースを作成し、コネクトで接続している状態にします。トークンとデータベース ID は後で使用します。

https://developers.notion.com/docs/create-a-notion-integration

処理を作成する

以下のように作成しました。作成するにあたり、API Reference の ENDPOINTS あたりを参照していました。

https://github.com/tsuen4/notion-database-putter/blob/ec13d2e9287fb9880925733d8c4516603cd11530/putter/functions/putter/action.ts

呼び出す

かなり省略していますが、以下のような形で呼び出すことで、指定したタイトルのページとテキストが 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 で取得しようとしていました。コンパイラとしては resultPartialPageObjectResponse として認識しており、その PartialPageObjectResponse には parent は存在しないため、どうしたら PageObjectResponse として認識してくれるんだろうとウンウン悩んでいました。

幸い、「 as で型に対して何かできた気がする」ぐらいの知識はあったので、調べてみると以下にたどり着いて解決しました。

https://typescriptbook.jp/reference/values-types-variables/type-assertion-as

2023/04/05 追記:

型ガードを行わずに型アサーションを使用するのは無理やりすぎると感じてはいました。もう少し調べてみると特定のキーを保持しているかどうかの判定で良いみたいでした。これを知るまでは、null かどうかでの型ガードしか頭にありませんでした。

https://stackoverflow.com/a/70797253

また、公式の SDK で Type gurds 用のヘルパー関数が提供されていました! 今回の用途では isFullPage(result)PageObjectResponse かどうかを判定すると良いみたいです。

https://github.com/makenotion/notion-sdk-js#type-guards

https://github.com/makenotion/notion-sdk-js/blob/main/src/helpers.ts#L97-L104

最後に

最後まで読んでいただきありがとうございます。

自分の意志で作ったものを記事といった形でアウトプットするのは初めてでした。今回共有した処理が面白そう、便利そうだと感じていただけたら幸いです。

Discussion