Node-REDからのNotion活用 - uepon日々の備忘録

Notionをオンラインデータベース化!Node-REDからのデータ格納法

みなさんNotionを使っていますか?私自身、ブログ、MarkdownGoogle系のドキュメントなど、過去に色々な手段を試してみましたが、最近では共有することを意識して、Notionを使うことが多くなりました。Notionは情報管理ツールであり、ノート、タスク、データベースなどをプラットフォーム上で管理でき、直感的なインターフェースで簡単に操作できます。実際のところはデータベースに様々なビューがあるツールと思っても良さそうです。

www.notion.so

今回は、この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

インテグレーションの作成

インテグレーションの新規作成は以下のリンクへアクセスして行います。以下の画面で【新しいインテグレーションを作成する】のボタンをクリックします。

www.notion.so

基本情報画面で今回使用するインテグレーションの【名前】(今回は"NotionAPIテスト"とします)を入力し、【送信】ボタンをクリックします。これの操作によってインテグレーションが作成されます。

作成したインテグレーションの【シークレット】にある内部インテグレーションシークレットをコピーして控えておきましょう。

インテグレーションの作成後、データベースとインテグレーションの接続設定を行います。

データベースIDの取得

続いてはデータベースIDを準備します。先ほど作成したデータベースのテーブルのURLを確認すると以下のような形式になっています。

https://www.notion.so/[ドメイン名(省略可)]/[DATABASE ID(32桁の文字列)]?v=[VIEW ID]

具体的には、下の図の部分 ”/” と ”?” で囲まれた部分の32桁の部分がデータベースIDとなります。この値をコピーして控えます。

これでNotion側の準備は完了しました。

Node-REDからNotion上のテーブルにデータを格納する

作成方針

Node-REDの拡張ノードにNotion操作用の拡張ノードもありますが、今回はデフォルトのノードを使用して構成していきます。以下のような方針で作成していきます。

  1. インテグレーション(APIキー)データベースID環境変数に格納
  2. データベースに書き込むデータ(JSON形式)を設定
  3. HTTPリクエストを使ってNotion APIにアクセスし、データベースへ情報を格納

では、以下の画像のようにパレットから選択してノードを配置していきます。

  • injectノード(トリガー)
  • functionノード*2(環境変数処理/送信データ作成)
  • http requestノード(APIアクセス)

環境変数

今回はNode-RED上から環境変数インテグレーション(APIキー)データベースIDに設定し、さらにmsgのデータにも格納することを行います。環境変数は一般的にはOSの機能を使用してすることが多いのですが、今回は動作するNode-REDが動作するOSの依存性を少なくするためにfunctionノードNode.jsprocessモジュールを使用して環境変数を使用する方針とします。

uepon.hatenadiary.com

// 環境変数のセット
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からの書き込みになりましたが、テーブルのフォーマットを時刻とセンサーデータとすることも可能ですので、格納後にダッシュボード機能を盛り込んで見やすくするといったことも十分可能ではないかと考えています。

chromewebstore.google.com

参考リンク

developers.notion.com

www.notion.so

/* -----codeの行番号----- */