みなさんNotion
を使っていますか?私自身、ブログ、Markdown、Google系のドキュメントなど、過去に色々な手段を試してみましたが、最近では共有することを意識して、Notion
を使うことが多くなりました。Notion
は情報管理ツールであり、ノート、タスク、データベースなどをプラットフォーム上で管理でき、直感的なインターフェースで簡単に操作できます。実際のところはデータベースに様々なビューがあるツールと思っても良さそうです。
今回は、このNotion
をオンラインデータベースとして、Node-RED
からの使用してみたいと思います。
Notion
のデータベース化
エンジニアにとって、情報の収集や整理をデータベースを使用・格納することは大きな意味があります。私は主にNotion
をつかって気になったWebのリンク
をまとめるようにしています。以前はPocket
を使用していたのですが、すっかりNotion
に乗り換えています。今回の例もNotion
でデータベースを作成し、Node-RED
から操作していきます。
Notionを使用したデータベースの作成方法
以下のようなデータベースを作成します。保存する情報としてはタイトルとURLとなり、それらをテーブルのプロパティとして設定していきます。
テーブル構造
では早速作成してみましょう。Notion
でデータベースを作成するには以下のような手順で行います。ワークスペースに新規ページを作成し、その中にテーブルを作成します。
【ページ名】(今回はブックマークDBとしました)を入力し、画面下部にある【テーブル】をクリックします。
以下の画像は、新しく作成されたデフォルトのテーブルです。このテーブルをカスタマイズしていきます。 今回は、デフォルトで作成されるプロパティをタイトル(テキスト属性)とurl(URL属性)の2つを編集していきます。
この作業を行うことで、使用するテーブルが完成しました。
Notion APIの準備
先ほど完成したデータベースをNotion APIを使用して、Node-RED
からデータを格納します。Notion APIを使用するには2つの情報が必要になります。1つはインテグレーションと呼ばれるもので、他のサービスでいうならばAPIキーに当たるものです。もう一つはデータベースIDです。Notion APIを使用するためにこの2つを情報を事前に準備していきます。
Notion APIを使用するのに必要となる情報
- インテグレーション(APIキー)
- データベースID
インテグレーションの作成
インテグレーションの新規作成は以下のリンクへアクセスして行います。以下の画面で【新しいインテグレーションを作成する】のボタンをクリックします。
基本情報画面で今回使用するインテグレーションの【名前】(今回は"NotionAPIテスト"とします)を入力し、【送信】ボタンをクリックします。これの操作によってインテグレーションが作成されます。
作成したインテグレーションの【シークレット】にある内部インテグレーションシークレットをコピーして控えておきましょう。
インテグレーションの作成後、データベースとインテグレーションの接続設定を行います。
データベースIDの取得
続いてはデータベースIDを準備します。先ほど作成したデータベースのテーブルのURLを確認すると以下のような形式になっています。
https://www.notion.so/[ドメイン名(省略可)]/[DATABASE ID(32桁の文字列)]?v=[VIEW ID]
具体的には、下の図の部分 ”/” と ”?” で囲まれた部分の32桁の部分がデータベースIDとなります。この値をコピーして控えます。
これでNotion
側の準備は完了しました。
Node-REDからNotion上のテーブルにデータを格納する
作成方針
Node-RED
の拡張ノードにNotion
操作用の拡張ノードもありますが、今回はデフォルトのノードを使用して構成していきます。以下のような方針で作成していきます。
- インテグレーション(APIキー)、データベースIDを環境変数に格納
- データベースに書き込むデータ(JSON形式)を設定
- HTTPリクエストを使って
Notion API
にアクセスし、データベースへ情報を格納
では、以下の画像のようにパレットから選択してノードを配置していきます。
環境変数
今回はNode-RED
上から環境変数にインテグレーション(APIキー)、データベースIDに設定し、さらにmsg
のデータにも格納することを行います。環境変数は一般的にはOSの機能を使用してすることが多いのですが、今回は動作するNode-RED
が動作するOSの依存性を少なくするためにfunctionノード
でNode.js
のprocessモジュール
を使用して環境変数を使用する方針とします。
// 環境変数のセット process.env.NOTION_API_KEY = "インテグレーション"; process.env.DATABASE_ID = "データベースID"; // msgにデータを格納する msg.NOTION_API_KEY = process.env.NOTION_API_KEY; msg.DATABASE_ID = process.env.DATABASE_ID;
データベースに書き込むデータ(JSON)を設定
APIに送信するデータはJSON形式
となります。このデータはmsg.payload
にデータを格納をすることで後続のノードの処理が可能になります。この操作もfunctionノード
を使用してデータの格納を行います。個人的にはfunctionノード
はあまり使いたくない派ですが、これぐらいの処理であれば、使ってもいいかなと思います。(templateノード
でも良かったですけど、データの構造の間違いがありそうだったのでこちらにしています)
msg.payload = { "parent": { "database_id": msg.DATABASE_ID }, "properties": { "タイトル": { "title": [ { "text": { "content": "Node-REDで追加" } } ] }, "url": { "url": "https://www.google.com" } } } return msg;
Notion APIにアクセス
あとはhttp requestノード
を使用して、Notion API
へアクセスを行います。認証はヘッダ部分にインテグレーション(APIキー)を格納することで行われます。
ヘッダのプロパティ
- メソッド … POST
- URL(APIのエンドポイント) … https://api.notion.com/v1/pages
- Authorization … msg.NOTION_API_KEY
- Content-Type … application/json
- Notion-Version … 2022-06-28
フロー完成図
フローは完成すると以下の様になります。念の為、データ確認用のdebugノード
を加えていますが、存在していなくても動作します。
Pythonコードの実行後のデータ格納の様子
おわりに
Node-RED
を使用してNotion
をオンラインデータベースとして情報の格納を行うことができました。今回の例ではリモートにあるブックマークのような機能として使用していますが、単にデータを格納するといった場合でも十分に機能を果たせるように思います。
実はこのデータベースは、Chromeブラウザの拡張機能であるNotion Web Clipper
というアプリを使用することでクリックだけでテーブルへの追加も可能な形式になっている点もとても便利に感じます。
今回はNode-REDからの書き込みになりましたが、テーブルのフォーマットを時刻とセンサーデータとすることも可能ですので、格納後にダッシュボード機能を盛り込んで見やすくするといったことも十分可能ではないかと考えています。
参考リンク