
前編では、GA4から記事データを取得し、ChatGPTを使ってリライトが必要かどうかを自動判定する仕組みを構築しました。
今回はその続きとして、判定結果をNotionに自動で記録するところまで仕上げようと考えています。構成自体はほとんど完成しており、あとはNotionノードを設置して接続すれば完了するはずです。
後処理用のCodeノードも整備済みで、あとはNotionと正しく接続できるかどうかという段階に入っています。
⚠️【追記:2025年5月現在】
本記事は「GA4 → n8n → GPT → Notion」までの自動抽出フロー構築を目指した実装記録ですが、2022年に実施されたNotionの仕様変更により、「外部プロパティとの接続」にはビジネスプラン以上でなければ利用できないことが判明しました。
そのため、無料プランではNotion連携を含む構成全体が成立せず、後編の開発は中断されています。
本記事は、構成検討と技術的試行の記録として公開を継続し、今後はGoogleスプレッドシートなど、別の連携先を用いた構成に移行予定です。
前編構成の振り返りと改善点

後編に入る前に、前編で構築した構成をもう一度振り返っておきます。前編では、Google Analytics 4(GA4)から対象記事のデータを取得し、ChatGPTでリライトの要否を判定する構成をn8n上で構築しました。
GA4ノードから必要な指標を取り出し、Codeノードで記事のURLやPV、滞在時間などを整形。SplitInBatchesを用いて記事ごとにChatGPTへ判定を依頼し、応答内容をCodeノードで整形して次に渡す仕組みになっています。
処理ごとの役割も明確に分かれており、構成としては比較的シンプルかつ保守性の高い状態にまとまりました。
構成を進める中で、ChatGPTから返される応答にtitleなどの文脈が消えてしまう問題がありましたが、これは前処理でtitleを生成し、後処理でChatGPTの応答と組み合わせることで解決しました。
また、トークン消費を抑えるために1記事ずつループで処理する構成を採用したことで、不要な通信量やコストも最小限に抑えられています。
ここまでで、ChatGPTによる判定構成は問題なく機能しており、次はその判定結果をNotionに自動記録する段階に入ります。あとはNotionノードを設置し、データベースと正しく接続できれば、全体の構成としては完成となる見込みです。
ステップ | 処理内容 | ステータス |
---|---|---|
① | Google Analyticsノード(GA4データ取得) | 済 |
② | Codeノード(pv・直帰率・滞在時間による前処理) | 済 |
③ | Loop Over Items(1件ずつ処理開始) | 済 |
④ | OpenAIノード(ChatGPT判定) | 済 |
⑤ | Codeノード(応答と元データを統合・整形) | 済 |
⑥ | Notion送信ノード(Notion公式ノード) | 未 |
⑦ | Error Triggerノード(失敗時ログ保存と再実行フラグ付与) | 未 |
n8n上に追加するノードの構築手順
ステップ⑤および⑥で使用するNoOpノードとMergeノードについて、それぞれの構築手順をn8n上の操作画面を想定しながら解説します。
これらはChatGPTの応答と元データ(title・URL)を正しく結合するための中心的な構成要素となるため、設定ミスがないよう慎重に進めてください。
⑤ NoOpノードの設置と入力構成
NoOpノードは、SplitInBatchesノードから分岐したデータのうち、ChatGPTに送信しないメタ情報(title、URLなど)をそのまま保持するために使用します。保持された情報は後続のMergeノードでOpenAIの応答と統合されます。 設置手順は以下の通りです。
- ノードを追加し、「NoOp」と検索して選択します。
- ノード名を「Keep Original Data」など分かりやすいものに変更します。
ノード上部の名称ラベル(タイトル)を「Keep Original Data」など、処理意図がわかる名前に変更してください。ノードをクリックした後、タイトル部分をクリックすることで名称変更のモーダルが表示されます。
- 入力元はSplitInBatchesノードから分岐したラインを接続します。
入力はSplitInBatchesノードの「Done」出力ポートから分岐させて接続します。OpenAIノードと同様に、1件分のデータをNoOpノードにも並列で渡す構成としてください。
SplitInBatches(またはLoop Over Items)から受け取ったメタ情報(title、URLなど)をそのまま保持し、後続のMergeノードへ渡すために使用します。加工や変換は一切行わず、データを維持するための中継ノードとして機能します。
⑥ Mergeノードの設置と正しい設定値
Mergeノードは、OpenAIノードからのChatGPT応答と、NoOpノードからの元データ(title・URL)を統合するために使用します。ここで誤った設定や接続順にすると、データの整合性が崩れ、titleやURLが欠損したまま記録されるリスクがあります。
以下の手順でMergeノードを構築してください。
- n8nの画面左上にある「+」ボタンをクリックします。
- 検索窓に「Merge」と入力し、表示された候補から「Merge」ノードを選択します。
- 追加されたMergeノードをクリックし、右側の設定パネル「Parameters」タブを開きます。
以下の値を入力して設定します:Mode: Append
Number of Inputs: 2 - Mergeノードには上下2つの入力ポートが表示されます。
下記の順番を前提として、後続のCodeノードで整形処理を行ってください。
- Input 1(上側)には「Keep Original Data(NoOp)」ノードの出力を接続します。
- Input 2(下側)には「OpenAI(Message Model)」ノードの出力を接続します。
この構成により、Mergeされたデータは以下のように格納されます。
- items[0]:NoOpノードで保持されたtitleやurlなどの元データ
- items[1]:OpenAIノードからのChatGPT応答(判定、理由など)
⑧ Notion送信ノードの構築とマッピング照合
このセクションでは、n8n上にNotionノードを追加し、ChatGPTの判定結果をNotionデータベースに書き込む設定を行います。ここまでで取得した「データベースID」や「応答内容」を、実際にNotionへ送信する構成にしていきます。
1. Notionノードを追加して認証情報を設定する
まずは、n8n上にNotionノードを追加し、API連携のための認証設定を行います。Notionのインテグレーションで発行したトークンを使用して接続します。
- n8nのワークフロー画面で「+」ボタンをクリック
- 検索欄に「Notion」と入力し、「Notion」ノードを選択
- 画面右の「Create a page」をクリックして、Notionノードをワークフロー内に追加
- ダイアログから「Credentials」欄で「Create New」を選ぶ
- トークン欄に、Notionのインテグレーションで発行された「Internal Integration Token」を貼り付け
- 「Save」ボタンを押して認証を完了させる
Notion API Token 例:secret_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX これで、n8nからNotionへのAPIアクセスが可能な状態になります。
2. 各フィールドに値をマッピングする構成
次に、ChatGPTの応答やGA4のデータをNotionの各カラムへマッピングする設定を行います。ここでは、Notionノードの「Create Page」操作を使用します。

項目名 | 入力値 | 補足 |
---|---|---|
Resource | Page | リソースの種類として「Page」を選択 |
Operation | Create | 新規ページを作成する操作 |
Parent Page | By ID または By URL | By ID:32桁のデータベースID(例: 1f7993a7ca0780debe2ad384fff90c5a)を入力 By URL:対象ページのURL(例: https://www.notion.so/1f7993a7ca0780debe2ad384fff90c5a)を入力。 ?v=~以降は不要 |
Title | {{ $json["title"] }} | Notion上に作成されるページのタイトルとなる値 |
Options | カスタムプロパティを追加 | PVや判定結果など、必要なカラムをここに追加してExpressionで値をマッピング |
注意ポイント
「Parent Page」は 「By ID」または「By URL」 のいずれかを選択できます。指定方法により、入力内容が異なります。
- By ID を選んだ場合:Notionの32桁のデータベースID(例:1f7993a7ca0780debe2ad384fff90c5a)だけを入力します。
- By URL を選んだ場合:NotionのページURL(例:https://www.notion.so/1f7993a7ca0780debe2ad384fff90c5a)を入力します。末尾の ?v=~ は不要です。
この設定を誤ると、Notionへの書き込みに失敗するため、選択肢に応じた形式で正しく入力してください。
以下の表のように、各フィールドに対応する値を設定してください。
Notionカラム名 | 対応するマッピング内容 | 設定式(Expression) |
---|---|---|
タイトル | 対象記事のタイトル(ページタイトル) | {{ $json["title"] }} |
URL | 記事のURL | {{ $json["url"] }} |
PV | ページビュー(GA4の screenPageViews) | {{ $json["screenPageViews"] }} |
直帰率 | GA4から取得した直帰率 | {{ $json["bounceRate"] }} |
滞在時間 | 平均滞在時間(秒) | {{ $json["averageSessionDuration"] }} |
GPT判定 | ChatGPTによるリライト要否(はい/いいえ) | {{ $json["result"] }} |
理由 | リライトが必要とされた理由 | {{ $json["reason"] }} |
改善ヒント | ChatGPTによる改善アドバイス | {{ $json["hint"] }} |
マッピングが完了したら、右上の「Execute Node」でNotionへの書き込みができるかを確認してください。
応答の記録結果を確認する方法(記事タイトル・判定・理由の見え方)
Notionに記録されると、各記事が1行ずつレコードとして表示され、タイトルや判定のYES/NO、理由やヒントも一覧で確認できます。見出しのカラム順を調整することで、一覧性の高いタスクリストのような運用が可能になります。 例えば以下のように表示されます。
タイトル | GPT判定 | 理由 | 改善ヒント |
---|---|---|---|
記事A | YES | 内容が古く検索意図と合っていない | 最新の事例を追加すると改善 |
記事B | NO | 滞在時間・直帰率ともに問題なし | - |
これにより、どのコンテンツを優先的に改善すべきかを直感的に判断できます。
Notionに自動記録して一覧可視化する方法
ChatGPTによってリライト判定された結果を、n8nを通じてNotionへ自動記録することで、記事ごとの改善ステータスを一目で把握できるようになります。
このセクションでは、Notion APIの設定方法から、各フィールドへの値のマッピング、そして記録された内容の見え方までを順を追って説明します。
Notion APIとデータベースIDの取得
n8nからNotionに対してデータを書き込むには、以下の3つの準備が必要です。
- NotionのAPIインテグレーションを作成し、トークンを取得
- Notion上に書き込み先となるデータベース(表)を作成
- データベースとインテグレーションを接続し、n8nで使用できるようにする
Notionインテグレーションの作成と接続設定
n8nからNotionデータベースにアクセスするには、Notion側で「インテグレーション」を作成し、そのインテグレーションに対して明示的にアクセス権を与える必要があります。
1. Notionデータベースの作成
まず、リライト判定の結果を記録するためのデータベースをNotion上に作成します。
このデータベースは、後ほどn8nから自動でデータを書き込む保存先となります。
新規ページからデータベースを作成する
- Notionのホーム画面にアクセスし、「+ 新規ページ」をクリックします
- 新規ページ下部の「データベース」を選択します
- テンプレート選択画面が表示されたら「空のデータベース」を選択します
カラム(プロパティ)を追加・設定する
デフォルトでは「名前」列(タイトル型)のみが存在しています。
以下のように必要なカラムを1つずつ追加・設定してください。
カラム名 | 型の種類 | 入力例 |
---|---|---|
名前 | タイトル型(既定) | https://www.example.com/article/123 |
pv | 数値(Number) | 125 |
duration | 数値(Number) | 37 |
isTarget | チェックボックス | ☑ |
判定 | テキスト | 導入文が弱く改善推奨 |
1行目の入力(動作確認用)
1行目のタイトル列には、任意のテスト用URLを入力してください。
例:
https://www.pmi-sfbac.org/linux-lvm/
この行が、n8nからのデータ自動挿入時のフォーマットになります。

2. NotionのAPIインテグレーションを作成
n8nからNotion APIを使うには、専用のインテグレーション(認証トークン)を作成する必要があります。以下の手順で進めてください。
Notionインテグレーション作成画面 にアクセスしてインテグレーションを作成します。
- 「新しいインテグレーション」をクリック
- 必要項目を入力後、「保存」ボタンクリック
名前を入力(例:【AI編集長】リライト対象の自動判定システム)
種類は 内部(Internal) - 作成後に表示される Internal Integration Token をコピー
このトークンは、n8nのNotionノードとの認証に必要です。 必ずコピーして、安全な場所に保存しておいてください。
3. データベースとインテグレーションを接続する
この工程は、Notion側の仕様変更により基本的に「自動で接続される」仕組みになっています。操作の必要がないケースが多いため、確認だけで済む可能性があります。
注意
注意ポイント
以下の2つの操作を行った時点で、Notionの仕様により「インテグレーションとデータベースの接続」は自動で完了します。基本的に、手動で接続操作を行う必要はありません。
- Notionデータベースを作成する
- NotionのAPIインテグレーションを作成する
ただし、接続が確認できない場合(Notion上でインテグレーション名が表示されない場合)は、以下の手順で明示的に接続してください。
- 対象のNotionデータベース右上にある「共有(Share)」をクリック
- 表示される一覧から、作成済みのインテグレーション名を探して「接続」をクリック
- ステータスが「接続済み」になっていれば完了
4. データベースIDを取得する
n8nからNotionに書き込むには、対象データベースの「ID」を指定する必要があります。Notionのデータベースページをブラウザで開き、URLからIDを確認してください。
URLの形式によって、データベースIDの場所が異なりますが、いずれも32桁の英数字です。
- 形式①:
https://www.notion.so/yourworkspace/記事タイトル-abcdef1234567890abcdef1234567890
→ 「記事タイトル-」のあとにある32桁の部分がデータベースIDです。 - 形式②:
https://www.notion.so/abcdef1234567890abcdef1234567890?v=xxxxxx
→ 「?」より前の32桁の部分がデータベースIDです( ?v=以降は無視してください)。
このIDをコピーして、後でn8nの「Database ID」入力欄に貼り付けます。
ステップ構成に基づく各ノードの役割と処理内容
このセクションでは、後編で実装した各ノードの処理内容をステップ順に整理します。
ChatGPT応答と元データの結合処理において、どのノードが何を担い、どのように連携しているのかを明確にしながら構築の全体像を把握していきます。
具体的な処理フロー
① [Google Analyticsノード]
↓
② [Codeノード(PV・滞在時間フィルタ)]
↓
③ [SplitInBatchesノード]
↓
④ [OpenAIノード]
↓
⑤ [Codeノード(整形)]
↓
⑥ [Notionノード(Create Page)]
↓
⑦ [Error Triggerノード(通知・リカバリ)]
ステップ①〜②:フィルタ処理と記事の1件化
①GA4から取得した記事データに対し、②CodeノードでPV数・滞在時間によるフィルタ処理を実施します。
ここで条件に合致した記事のみが次工程③に渡されます。
なお、ステップ①(Google Analyticsノードによるデータ取得)およびステップ②(Codeノードによるフィルタ処理)は、前編で構築済みの内容をそのまま使用します。
これらの構成に変更は加えず、後続ステップ③以降から新たな処理を追加していきます。
ステップ③〜④:ChatGPTへの逐次送信と応答取得
③では、SplitInBatchesノードを使用して、取得した記事データを1件ずつ処理できる構成に変換します。
設定は以下の通りです。
- Batch Size: 1
- Continue On Fail: true
このノードにより、title・url・PV・滞在時間を含む1件分のオブジェクトが順に処理されます。
そのまま④OpenAIノードに接続し、titleやurlなどの情報を含めた形でChatGPTに送信します。
応答は、リライトすべきかの判定結果(はい・いいえ)に加え、理由や改善ヒントなどを含んだ形で返されます。
ステップ⑤〜⑥:整形とNotionノードによるデータ送信
ここからは、Notion APIに対応するJSON形式に整形し、Notionのデータベースに自動登録する流れを構築していきます。
⑤Codeノードでは、必要なプロパティ(title、url、screenPageViews、averageSessionDuration、result、reason、hint)をNotion用に整形します。
これはNotion公式ノードが受け取る形式である必要があるため、各カラムの内容はすべて文字列または基本型として含まれている必要があります。
// OpenAI から返ってくる JSON 文字列を取得
const raw = $json.choices?.[0]?.message?.content?.trim() || "{}";
let parsed = {};
try {
parsed = JSON.parse(raw);
} catch (e) {
throw new Error("OpenAI 出力が JSON ではない: " + e.message);
}
return {
json: {
title: parsed.title || "無題",
url: parsed.url || "",
screenPageViews: parsed.screenPageViews || 0,
averageSessionDuration: parsed.averageSessionDuration || 0,
result: parsed.result || "いいえ",
reason: parsed.reason || "理由なし",
hint: parsed.hint || "ヒントなし"
}
};
⑥Notionノードでは、「Create Page」モードを選択し、使用するデータベースを指定します。
Credentialには事前に連携済みのNotion Integrationを選択してください。
送信内容は、各プロパティとNotionデータベース上のカラム名を1対1で対応させます。
たとえば、titleはTitle型プロパティ、urlやresult、reasonはText型プロパティとして登録されている必要があります。
これにより、n8nの構成からNotionのDBへ自動でChatGPT判定結果が記録されていくフローが完成します。
ステップ⑦:失敗通知とリカバリ処理の実装
Notion APIへの送信処理が失敗した場合に備え、⑦Error Triggerノードを併設し、レスポンスステータスの監視とSlack通知・ログ保存処理を行います。
さらに、処理対象に再実行フラグを付与するなど、エラーからの復旧を可能にする構成とします。
- 条件例:status >= 400 または title === null
- 通知手段:Slack Webhook または ファイル保存
Notionノードの実行と接続エラーの発生
ここからは、構成全体の最終ステップとして、n8nのNotionノードを使ってChatGPTの判定結果をデータベースに自動記録する処理を実装していきます。
構成そのものはすでに完成しており、各ノード間のデータ連携も正常に動作しています。あとはNotionノードを設置し、データベースとの接続設定を行えば、記事の判定結果がNotion上に記録されていく──そのはずでした。
ところが、実際に接続テストを行ってみたところ、思わぬエラーに直面することになります。
Notionノードで接続できない状態が発生する
構成がすべて完成し、「あとはNotionノードで送信するだけ」という状態まで到達しました。ところが、Notionノードの設定画面を開いてデータベース一覧を確認しようとしたところ、肝心のデータベースが候補として表示されませんでした。

通常であれば、Integrationが共有されているデータベースはリストに表示されるはずですが、この時点では「No connected databases found(接続されたデータベースが見つかりません)」と表示され、先に進めなくなってしまいました。
データベースの共有設定、Integrationの再作成、Credentialの再設定など、あらゆる方法を試しましたが状況は変わらず、Notionがn8nからデータベースを認識できない状態のままです。
Integration Token(シークレット)」と「データベースとの接続許可」の再設定など、思いつく限りの操作をなん度も繰り返し試してみたのですが、どうしてもうまくつながりませんでした。
Notionのデータベースは素手み10回以上は作り替え、インテグレーションにしても同様に何度も何度もアカウントを変えたり削除、再設定を繰り返してみましたが、全くリライト対象データがNosionのデータベースへ登録される気配がありません。
調査の結果、Notionは「ビジネスプラン以上」でないと接続できないと判明
解決の糸口を探るために、Notionの公式ドキュメントを読み返し、英語圏の開発者フォーラムやGitHub Issues、Stack Overflowなどを巡回しました。
その中で、あるユーザーが「フリープランでは外部連携用のIntegrationがデータベースと接続できない」と報告している投稿を発見しました。
この報告が事実かどうかを確認するため、Notion公式サイトのプラン比較表を改めて確認したところ、「外部プロパティ接続(Connections)」の利用は、ビジネスプラン以上に限られていることが明記されていました。
この「Connections」こそが、外部ツール(n8nなど)からNotionデータベースへアクセスするために必要な仕組みです。
つまり、技術的な構成以前にフリープランの制限により、Integrationがデータベースと接続できないという状況が発生していた可能性が極めて高く、今回の構成が機能しない最大のボトルネックとなっていたことが明確になりました。
今回の構成を成立させるには、Notionをビジネスプラン(3,800円/月)にアップグレードした上で、ChatGPT APIの従量課金、VPSサーバー代、n8n運用環境の維持、さらに構築・保守にかかる人的リソースが必要となります。
つまり、月数千円の固定コストに加えて、ChatGPTの使用量に応じた課金が上乗せされる構成です。
それだけのコストを支払って得られるものが「リライト対象の記事をNotionに一覧化するだけ」であると考えたとき、現実的な運用コストとして到底見合わないという判断に至りました。
今回はこれが最終的なボトルネックとなり、構成自体は完成していたものの、運用コストと継続性の観点から、導入を見送るという判断に至りました。