ノーコードツールのDifyを使って、Notionのテーブルを操作したいと思ったことはありませんか?Difyを活用すれば、大規模言語モデル(LLM)とOCR技術を組み合わせて、名刺やレシート、アンケート用紙から情報を自動で取得しNotionのテーブルに効率的に追加することが可能です。

この記事では、DifyからNotionのテーブルにデータを挿入する方法を画像付きでわかりやすく解説します。ステップバイステップで手順を紹介しているので初めての方でも安心して設定を進められます。この記事を読み終えるとDifyからNotionへのデータ挿入を完全にマスターできるように解説しています。

またNotion APIの基本設定についても画像を使って丁寧に解説しています。APIトークンの取得からDifyとの接続まで一連の手順を説明しています。

DifyとNotionを連携することで、名刺管理や経費精算、アンケートデータの自動化など業務効率を大幅に向上させることができます。本記事では、特にDifyを使ったNotionテーブルへのデータ挿入方法にフォーカスしています。なお、DifyとNotionを使ってRAG(Retrieval-Augmented Generation)用のナレッジを活用する方法もありますが今回はデータ挿入に絞って解説します。

Notion(ノーション)とは

Notionは、メモやノートを記録するだけでなく、タスク管理、スケジュール管理、さらにデータベース機能を備えた強力なツールです。これによりデジタルデータを効率的に整理・管理することができます。

さまざまな機能を1つのアプリに集約しているため情報の一元管理が可能です。個人での利用はもちろん、チームや企業での情報共有にも最適で、多くの会社でプロジェクト管理やナレッジ管理のツールとして活用されています。

Notionの設定

Notion APIとは

Notion APIをDifyなどの外部のアプリケーションから直接Notion内の情報を操作するためのインターフェイスのことです。APIを活用することでNotionのアプリを起動やブラウザからアクセスを行うことなく、Notionのページやデータベースに対してデータを挿入・更新・取得することが可能になります。

Notion APIを利用するために事前にインテグレーション(アプリとの連携)の設定を行う必要があります。

インテグレーション(アプリ連携)の設定

アプリとの連携を行うために事前にインテグレーションの設定を行う必要があります。

ブラウザからNotionログイン後に表示されるサイドメニューの下部に表示されている”設定”をクリックします。

サイドメニューの設定
サイドメニューの設定

個人設定の画面が表示されるのでサイドメニューの”自分のコネクト”をクリックすると”新しいコネクトを見つける”画面が切り替わるので、画面の中央にある”インテグレーションを作成または管理する”のリンクをクリックします。

自分のコネクト
自分のコネクト

インテグレーション画面が表示されるので”新しいインテグレーション”をクリックします。

インテグレーション画面の表示
インテグレーション画面の表示

“インテグレーション名を追加”でどのアプリケーションとの連携かわかるように任意の名前を設定しします。ここではDifyと設定しています。次にプルダウンメニューから関連ワークスペースを選択してください。種類でInternalとPublicを選択できるので”Internal”を選択します。Internalを選択すると内部と表示されます。Publicは一般のNotionユーザが利用するインテグレーションを設定する場合に利用します。

ロゴ画像もアップロードできますがアップロードなしでも問題ありません。設定したら”保存する”ボタンをクリックします。

インテグレーションの設定
インテグレーションの設定

“保存する”ボタンをクリックすると「インテグレーションが作成されました」とメッセージが表示されるので”インテグレーションの設定”ボタンをクリックします。

インテグレーションの設定完了
インテグレーションの設定完了

インテグレーション設定画面では内部インテグレーションのシークレットキーを取得することができます。これが外部のアプリケーションからアクセスする時に必須となり重要なキーです。他人と教習してはいけません。キーは厳重に管理してください。内部インテグレーションシークレットのマスキング文字の右側に表示されている”表示”のリンクをクリックするとシークレットキーをコピーすることができます。

シークレットキーのコピー
シークレットキーのコピー

これで外部のアプリケーションからNotionにアクセスするためのAPIキーの取得は完了です。

テーブルページ(データベース)の作成

Notion APIを経由してNotionで管理しているテーブルへアクセスを行うのでテーブルページの作成を行います。

新しいページを作成後に下部に表示されているテーブルをクリックします。

新しいページの作成
新しいページの作成

クリックすると新規テーブルが表示されます。新規テーブルが表示されたら名前プロパティ(列)が一つだけの状態なので、円枠で囲まれた”+”ボタンをクリックしてメールアドレスのプロパティ(列)を追加します。ここでは動作確認なので”名前”と”メールアドレス”列のみ利用します。

列の追加
列の追加

プロパティ(列)の追加後、動作確認用のページ(行)を挿入しておきます。任意の名前とメールアドレスを追加してください。ここでは名前に”John Doe”とメールアドレスに”john@example.com”を設定します。

データの挿入
ページ(行)の挿入

NotionのAPIを利用して作成したテーブルにアクセスするためにはデータベースのIDが必要となります。データベースのIDはブラウザで開いているページのURLから確認することができます。URLはブラウザの上部に表示されています。


https://www.notion.so/<データベースID>?v=<ビューID>

ブラウザのURLを見るとhttps://www.notion.so/14ba0c9b2cbb80319643f026a94547c0?v=3960a1abd11344dba952dcea0431a3caの形式をしているので14ba0c9b2cbb80319643f026a94547c0の部分がデータベースIDです。文字列は表示しているページよって異なります。

Notion APIの動作確認

APIのシークレットキーとデータベースのIDが取得できたので実際にAPIを利用して動作確認を行なっていきます。

cURLコマンドによる動作確認

curlコマンドを利用してデータベースからデータの取得を行います。DATABASE_IDとYOUR_API_TOKENは各自が取得した情報を設定してください。


 % curl -X POST "https://api.notion.com/v1/<DATABASE_ID>/query" \
  -H "Authorization: Bearer <YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -H "Notion-Version: 2022-06-28"

コマンドを実行すると指定したデータベースのIDではデータベースを見つけることができないというエラーが表示されます。シークレットキーとデータベースのIDだけでは設定が不足していることがわかりました。


{
  "object": "error",
  "status": 404,
  "code": "object_not_found",
  "message": "Could not find database with ID: 14ba0c9b-2cbb-8031-9642-f026ax4547c0. Make sure the relevant pages and databases are shared with your integration.",
  "request_id": "8bb48da0f-2167-4420-9e2e-981b7dd1b079"
}

cURLコマンドの実行方法

読者の人の中にはcurlコマンドを利用した経験がない人もいるかもしれません。windows11, macOSではデフォルトでcurlコマンドが標準でインストールされているのでWindowsであればコマンドプロンプト、macOSではターミナルを起動して実行することができます。

windows11ではスタートボタンをクリックして検索窓に”cmd”とクリックすると検索結果にコマンドプロンプトと表示されるのでクリックするとコマンドプロントが起動します。画面に文字列を入力することができるので”curl –version”と入力して”Enter”ボタンをクリックするとcurlコマンドのバージョン情報が表示されます。

macOSの場合は上部の移動をクリックしてユーティリティを開くとターミナルのアプリが起動してcurlコマンドを実行できます。

curlコマンドでWebページのURLを指定するとページのコンテンツを取得できたり、HTTPのリクエストを送信することができます。

インテグレーションの接続設定

作成したテーブルページに対してインテグレーション(連携)を設定する必要があります。表示しているページ右上の”…”のクリックして表示される接続先を選択して先ほど作成したインテグレーションのDifyをクリックすると確認画面が表示されます。確認画面で”確定する”ボタンをクリックします。ページに対してAPIからのアクセスを許可しています。

接続の設定
接続の設定

インテグレーションの設定が完了すると接続の部分にDifyが表示されれば接続設定は完了です。

接続の確認
接続の確認

接続の設定が完了したので先ほど失敗したcurlコマンドを実行します。


 % curl -X POST "https://api.notion.com/v1/<DATABASE_ID>/query" \
  -H "Authorization: Bearer <YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -H "Notion-Version: 2022-06-28"

先ほどとは異なり、テーブルに挿入されたページデータがJSONデータで戻されます。


{
  "object": "list",
  "results": [
    {
      "object": "page",
      "id": "14ba0c8b-2cbd-8081-b7e0-cac8749cbf01",
      "created_time": "2024-11-27T07:27:00.000Z",
      "last_edited_time": "2024-11-27T07:27:00.000Z",
      "created_by": {
        "object": "user",
        "id": "048629fa-aae4-441c-a661-8fd96b203e8"
      },
      "last_edited_by": {
        "object": "user",
        "id": "048629fa-aae4-441c-a661-8fd96b203e8"
      },
      "cover": null,
      "icon": null,
      "parent": {
        "type": "database_id",
        "database_id": "048629fa-aae4-441c-a661-8fd96b203e8"
      },
      "archived": false,
      "in_trash": false,
      "properties": {
        "メールアドレス": {
          "id": "%3ABRL",
          "type": "email",
          "email": "john@example.com"
        },
        "名前": {
          "id": "title",
          "type": "title",
          "title": [
            {
              "type": "text",
              "text": {
                "content": "John Doe",
                "link": null
              },
              "annotations": {
                "bold": false,
                "italic": false,
                "strikethrough": false,
                "underline": false,
                "code": false,
                "color": "default"
              },
              "plain_text": "John Doe",
              "href": null
            }
          ]
        }
      },
      "url": "https://www.notion.so/John-Doe-048629fa-aae4-441c-a661-8fd96b203e8",
      "public_url": null
    }
  ],
  "next_cursor": null,
  "has_more": false,
  "type": "page_or_database",
  "page_or_database": {},
  "request_id": "048629fa-aae4-441c-a661-8fd96b203e8"
}

Notionアプリの外側かNotion APIを利用してNotionにアクセスできるようになりました。

ページ(行)の挿入

Notion APIを経由してテーブルからページデータを取得することができたので今後はテーブルに新たなページ(行)の追加を行います。ページデータを追加する場合はテーブルを構成するプロパティの情報と値を設定する必要があります。”名前”プロパティに対してテキストで”Jane Doe”, “メールアドレス”プロパティに対してemailに”jane@example.com”を設定しています。


 % curl -X POST "https://api.notion.com/v1/pages" \
  -H "Authorization: Bearer <YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -H "Notion-Version: 2022-06-28" \
  -d '{
        "parent": { "database_id": "{database_id}" },
        "properties": {
          "名前": {
            "title": [
              {
                "text": {
                  "content": "Jane Doe"
                }
              }
            ]
          },
          "メールアドレス": {
            "email": "jane@example.com"
          }
        }
      }'

実行するとJSONデータが戻されますが、戻されるJSONデータにエラーメッセージが含まれていない場合はNotionのテーブルに新規のページデータが追加されていることを確認することができます。

新しい行の追加
新しい行の追加
テーブルからページデータを取得するcurlコマンドを実行することでもデータが追加されたことは確認できます。
fukidashi

ページデータの存在チェック

filterを利用してページデータがすべにテーブルに存在しているかどうかも確認することができます。メールアドレスプロパティを利用してjohn@example.comが登録されているかチェックを行っています。すでに登録されているメールアドレスは登録しないという要件がある場合に新規のページデータを登録する前のチェックに利用することができます。


curl -X POST "https://api.notion.com/v1/databases/<DATABASE_ID>/query" \
  -H "Authorization: Bearer <YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -H "Notion-Version: 2022-06-28" \
  -d '{
        "filter": {
          "property": "メールアドレス",
          "email": {
            "equals": "john@example.com"
          }
        }
      }'

データが存在する時はJSONデータのresultsプロパティに配列で一致するページデータが戻されます。


{
  "object": "list",
  "results": [
    {
      "object": "page",
      "id": "14ba0c8b-2cbb-801f-81e3-f29b0e35a517",
      "created_time": "2024-11-27T07:49:00.000Z",
      "last_edited_time": "2024-11-27T07:49:00.000Z",
      "created_by": {
        "object": "user",
        "id": "048619fa-7ae4-441c-a661-8fd96b4203e8"
      },
      "last_edited_by": {
        "object": "user",
        "id": "048619fa-7ae4-441c-a661-8fd96b4203e8"
      },
      "cover": null,
      "icon": null,
      "parent": {
        "type": "database_id",
        "database_id": "14ba0c8b-2cbb-8031-9643-f026a94547c0"
      },
      "archived": false,
      "in_trash": false,
      "properties": {
        "メールアドレス": {
          "id": "y%5Cup",
          "type": "email",
          "email": "john@examle.com"
        },
        "名前": {
          "id": "title",
          "type": "title",
          "title": [
            {
              "type": "text",
              "text": {
                "content": "John Doe",
                "link": null
              },
              "annotations": {
                "bold": false,
                "italic": false,
                "strikethrough": false,
                "underline": false,
                "code": false,
                "color": "default"
              },
              "plain_text": "John Doe",
              "href": null
            }
          ]
        }
      },
      "url": "https://www.notion.so/John-Doe-14ba0c8b2cbb801f81e3f29b0e35a517",
      "public_url": null
    }
  ],
  "next_cursor": null,
  "has_more": false,
  "type": "page_or_database",
  "page_or_database": {},
  "request_id": "fa60480-5767-4cb6-ba36-d47395344eb8"
}

データが存在しない場合には戻されるJSONデータのresultプロパティには空の配列が入ります。


{
  "object": "list",
  "results": [],
  "next_cursor": null,
  "has_more": false,
  "type": "page_or_database",
  "page_or_database": {},
  "request_id": "40c82cfe-5e55-4b4d-8d1f-7a3233f249b5"
}

resultに配列データが存在するかどうかチェックすることですでにデータが登録されているかどうかの判定に利用することができます。

ページデータの削除

ページデータを削除するためには削除したいページデータのIDが必要になります。ページデータを開いて、ブラウザのURLを開くと”p=”があります。その値がページデータのIDです。

ページのIDの確認方法
ページのIDの確認方法

ページデータのIDはテーブルからページデータを取得したJSONデータの中にも含まれています。


{
  "object": "list",
  "results": [
    {
      "object": "page",
      "id": "14ba0c8b-2cbd-8081-b7e0-cac8749cbf01",←これ
//略
}

以下のcurlコマンドで指定したページデータを削除(ゴミ箱へ)することができます。完全に削除されるわけではなくゴミ箱に移動します。


% curl -X PATCH "https://api.notion.com/v1/pages/<PAGE_ID>" \
  -H "Authorization: Bearer <YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -H "Notion-Version: 2022-06-28" \
  -d '{"archived": true}'

ブラウザ上のテーブルから指定したページデータが削除されますがゴミ箱を見るとそのデータが保存されており、復元することもできます。

ページデータプロパティの更新

ページデータのプロパティの更新もAPIから行うことができます。プロパティの更新にもページデータの削除と同様に更新したいプロパティを含むページのIDが必要になります。指定したページIDを持つページデータのメールアドレスプロパティの値をjohn.doe@example.comに設定しています。


% curl -X PATCH "https://api.notion.com/v1/pages/<PAGE_ID>" \
  -H "Authorization: Bearer <YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -H "Notion-Version: 2022-06-28" \
  -d '{
        "properties": {
          "メールアドレス": {
            "email": "john.doe@example.com"
          }
        }
      }'

ここまでの動作確認でテーブルに対して作成(追加)・更新・削除・表示の方法を確認することができました。これらの操作を組み合わせることでAPIを通してテーブル操作を自由に行うことができます。

DifyからのNotionの操作

curlコマンドを利用してNotionの操作方法を確認することができたので次はDifyからNotion APIを利用してテーブルの操作を行います。

Difyのスタジオ画面の”アプリを作成する”の”最初から作成”をクリックしてワークフローを作成してください。

動作確認用のアプリ作成
動作確認用のアプリ作成

環境変数の設定

Notion APIのシークレットキーは環境変数に設定します。環境変数は複数のブロック/ノードで何度も利用する値やセキュリティが重要はAPIのシークレットキーを保存する際に利用します。

オーケストレート画面の右上にあるENVと書かれたアイコンをクリックして”環境変数を追加”ボタンをクリックしてSecretタイプを選択します。任意の名前をつけて値には各自が取得したNotion APIのシークレットキーを設定します。

環境変数の設定
環境変数の設定

必須ではありませんが、データベースIDも動作確認で何度も利用する可能性があるので環境変数に設定しておきます。

設定すると下記のように表示されます。

環境変数の設定
環境変数の設定

HTTPリクエストの設定

先ほどはcurlコマンドを利用してHTTPのリクエストを送信していましたが、DifyではHTTPリクエストブロックを利用して同様の処理が行えます。

開始ノードの”+”ボタンからHTTPリクエストのブロックを選択します。

HTTPリクエストブロックの選択
HTTPリクエストブロックの選択

HTTPリクエストブロックではAPIの設定でNotion APIのシークレットキーの設定が必要になるので認証を設定する必要があります。デフォルトでは認証なしに設定されているので認証なしをクリックします。

HTTPリクエストブロックの設定画面
HTTPリクエストブロックの設定画面

認証画面ではAPIキーを選択して、認証タイプではBearerを選択し、APIキーの入力フィールドで”/”スラッシュを入力すると変数を選択できるのでENVIRONMENTのNOTION_SECRET_KEYを選択します。

認証設定
認証設定

テーブルのページデータ取得

curlでテーブルのページデータを取得した際に動作確認した値を参考にHTTPリクエストのURL、ヘッダーのパラメータを設定します。

HTTPリクエストブロックの設定後の画面
HTTPリクエストブロックの設定後の画面

HTTPリクエストノードを設定後は、終了ノードを追加します。終了ノードではリクエスト後に戻されるデータの中からstatus_codeとbodyが表示されるように設定します。

終了ノードの設定
終了ノードの設定

実行すると出力にはNotionのテーブルのページデータが表示されます。DifyからNotion APIを利用してNotionのテーブルのページデータを取得することに成功しました。

正常動作
正常動作

ページデータの挿入

開始ノードで名前とメールアドレスの入力フィールドを作成し、入力した値をNotionのテーブルにページデータとして挿入する手順を確認していきます。

開始ノードにnameとemailという変数名で入力フィールドを登録します。

2つの入力フィールドの登録
2つの入力フィールドの登録

開始ノードで登録した値を利用してJSONデータを作成する必要があります。JSONデータの作成にはコードブロックを利用します。開始ノードとHTTPリクエストの間にコードブロックを追加します。

JSONデータを作成するコードブロック
JSONデータを作成するコードブロック

コードブロックではJavaScriptを利用して入力変数を3つ設定しています。arg1, arg2は開始ノードで入力したname, emailに対応してarg3は環境変数のDATABASE_IDを設定しています。出力変数でresultをしています。resultの値はJSONデータなので型はStringになります。


function main({arg1, arg2, arg3}) {
    const jsonData = {
        parent: { database_id: arg3 },
        properties: {
            名前: {
                title: [
                    {
                        text: {
                            content: arg1
                        }
                    }
                ]
            },
            メールアドレス: {
                email: arg2
            }
        }
    };

    return {
        result: JSON.stringify(jsonData)
    };
}

HTTPリクエストではコードブロックで作成したJSONデータのresult変数をHTTPリクエストのbodyに設定しています。APIのURLはhttps://api.notion.com/v1/pagesに変更しています。

HTTPリクエストブロックの設定
HTTPリクエストブロックの設定

これで設定は完了です。”実行”ボタンをクリックしてnameフィール, emailフィールドに下記の情報を入力して”実行を開始”ボタンをクリックします。

実行で動作確認
実行で動作確認

ブラウザでテーブルを確認するとDifyで入力した名前とメールアドレスが登録されていることが確認できます。

ページデータが挿入されたテーブル
ページデータが挿入されたテーブル

DifyからNotionのテーブルへの挿入を行うことができました。

DifyからNotionのテーブルへの挿入方法が理解できたので次はNotionテーブルに挿入するデータを作成する処理をDifyに追加する必要があります。