
GA4の指標をもとに、リライトすべき記事をAIが自動で判定──。
本記事では、n8nとChatGPT、Notionを組み合わせて「改善対象の記事を浮かび上がらせる仕組み」の構築を進めていきます。
PV・直帰率・滞在時間という3つのデータをもとに、GPTに「これは書き直すべきか?」を判断させ、その結果をNotionに記録。 これにより、感覚や勘ではなく、“データとAIによるリライト判定”を自動化することが可能になります。
ただし、先にお伝えしておくと、この記事で紹介する構成は(下記の理由により(ChatGPTとの連携フェーズまでであり、Notionへの記録やtitleの保持といった後続の処理には至っていません。
⚠️【追記:2025年5月現在】
本記事は「GA4 → n8n → GPT → Notion」までの自動抽出フロー構築を目指した実装記録ですが、2022年に実施されたNotionの仕様変更により、「外部プロパティとの接続」にはビジネスプラン以上でなければ利用できないことが判明しました。
そのため、無料プランではNotion連携を含む構成全体が成立せず、後編の開発は中断されています。
本記事は、構成検討と技術的試行の記録として公開を継続し、今後はGoogleスプレッドシートなど、別の連携先を用いた構成に移行予定です。
この記事で構築する「リライト候補自動抽出フロー」の全体像
この記事では、Google Analyticsの実測データをもとに、n8nとChatGPTを使ってリライト候補を自動で浮かび上がらせる“AI編集長”の中核システムを構築します。
狙いは、読者の期待に応えられていない記事をデータから炙り出し、AIにその要否を判定させ、最終的にNotionへ記録して可視化する仕組みを作ることにあります。
AI編集長の目的とこの記事でやること
このシステムの目的は、サイト運営者が「どの記事をリライトすべきか」を毎回悩むのをやめ、データとAIに判断を任せることにあります。
記事ごとのPV・直帰率・滞在時間という数値データをGA4から取得し、一定の条件に該当する記事にだけChatGPTを使ってリライト要否を判定させます。
その結果をNotionに記録することで、作業対象を視覚的に絞り込むことが可能になります。
この記事では以下の5ステップに沿って解説を進めます。
- GA4から対象となる指標データを取得する
- 指標を元に対象記事を絞り込む
- ChatGPTでリライト判定を行う
- Notionに結果を記録して一覧化する
- これらをn8nで完全自動化する
使用する4要素(GA4・n8n・ChatGPT・Notion)の連携構造
本フローでは、以下の4つの要素がそれぞれ役割を担いながら連携して動作します。
要素 | 役割 |
---|---|
GA4 | PV・直帰率・滞在時間といった記事ごとの実測データを取得する |
n8n | データの取得・判定・記録までを自動化するオーケストレーションを担当 |
ChatGPT | 対象記事に対して「リライトすべきか?」の判断と理由を返す |
Notion | 判定結果を保存し、可視化されたタスク管理リストを構成する |
n8nを軸にして、GA4のデータを取り込み、ChatGPTへ判定を依頼し、その結果をNotionに記録して可視化するという一連の流れが構築されます。
この記事で構築する自動抽出フローの処理順
本記事で構築するn8nのワークフローは、Googleアナリティクスの数値をもとにリライト候補を抽出し、その情報をChatGPTに送って判定を行い、Notionに自動記録する流れで構成されています。処理の順序は以下のとおりです。
ステップ | 処理内容 | 使用ノード |
---|---|---|
① | Googleアナリティクスのページデータを取得 | Google Analytics(GA4) |
② | pv・滞在時間によるリライト候補の抽出と整形 | Code(前処理) |
③ | 記事データを1件ずつ処理 | Loop Over Items |
④ | ChatGPTにリライト要否を判定させる | OpenAI(Message) |
⑤ | ChatGPTの応答と元データを統合して整形 | Code(後処理) |
⑥ | 整形済みデータをNotionに記録 | Notion(Create Page) |
この構成により、GA4の客観データとChatGPTの主観評価を組み合わせた、信頼性の高いリライト判定と一覧管理が可能になります。
自動判定によって得られるメリットと実現像
この自動化によって、過去記事を毎回開いてPVを見たり、Search Consoleとにらめっこする時間が消えます。
さらに、感覚や感情に左右されず、明確な数値条件に基づいてAIが判定を行うため、リライトの優先度がブレません。
最終的にNotionには「リライト候補」「リライト不要」「GPTによる改善ヒント」などが並び、どこを直せば効果があるかが即座に判断できます。
運営者は“判断”から解放され、“作業”に集中できる状態を手に入れられます。
事前に決めておく基準と準備項目
この仕組みを組み上げる前に、AIによる自動判定の基準となる数値ルールと、記録先となるNotionデータベースの設計、さらにn8nの実行環境を整えておく必要があります。
この記事では「リライト候補の判定」を完全に自動化するための、土台づくりにあたる重要な準備項目を明確に定義します。
VPS・Docker・n8nの環境準備と接続確認
この仕組みでは、n8nをVPS上にDockerで構築した環境を前提としています。 以下の手順で環境を準備してください。
git clone https://github.com/n8n-io/n8n-docker-compose.git
cd n8n-docker-compose
docker compose up -d
起動後、ブラウザで以下のようにアクセスしてn8nが表示されることを確認します。
http://your-vps-domain:5678/
また、n8nがNotionやGoogleのAPIに接続できるように、.envファイルの編集も行います。詳細は後述の各API連携パートで解説します。
仮ルール(PV120・直帰率85%以上・滞在時間1分未満)
リライト候補となる記事を自動で絞り込むには、明確な基準を定めておく必要があります。以下の数値は、初期設定として使用する“仮ルール(v1)”です。
指標 | 条件 | 根拠 |
---|---|---|
月間PV | 120以上 | アクセスの少ない記事を除外し、改善インパクトが見込める対象に限定する |
直帰率 | 85%以上 | 読者の期待と内容が合っていない可能性が高い |
滞在時間 | 1分未満 | 本文を読まずに離脱している可能性が高く、内容または構成に問題がある |
なお、これらの判定条件(PV120以上・直帰率85%以上・滞在時間60秒未満)は、n8n上のCodeノード(前処理)に記述しており、Googleアナリティクスのデータから自動的にリライト対象候補を絞り込む形で実行されます。
この条件に合致した記事だけをChatGPTに渡すことで、効率的に改善対象を抽出できます。
Notionに作成するDB構成とフィールド設計
ChatGPTによるリライト判定と、Googleアナリティクス(GA4)から取得した数値をNotion上で一元管理するため、以下のようなデータベース構成を作成します。すべてのフィールドは、n8nから自動的にデータが書き込まれることを前提としています。
フィールド名 | 型 | 用途 | 例 | Expression式 |
---|---|---|---|---|
タイトル | タイトル型 | 記事タイトル | Python入門:if文の書き方 | {{ $json["title"] }} |
URL | URL型またはテキスト | 対象記事のリンク | https://example.com/article/123 | {{ $json["url"] }} |
PV | 数値型 | ページビュー | 125 | {{ $json["screenPageViews"] }} |
直帰率 | 数値型 | バウンスレート(%) | 85.6 | {{ $json["bounceRate"] }} |
滞在時間 | 数値型 | 平均滞在時間(秒) | 43 | {{ $json["averageSessionDuration"] }} |
GPT判定 | セレクトまたはテキスト | ChatGPTによるリライト要否(はい/いいえ) | はい | {{ $json["result"] }} |
理由 | テキスト | リライトが必要とされた理由 | 冒頭の情報が弱く直帰率が高いため | {{ $json["reason"] }} |
改善ヒント | テキスト | ChatGPTによる改善提案 | 要約を冒頭に追加し、導線リンクを強化 | {{ $json["hint"] }} |
「直帰率(bounceRate)」はGA4の仕様上、Google Analyticsノードから直接取得することはできません。そのため、n8nのCodeノード(前処理)内で sessions と engagedSessions を用いて手動で算出し、Notionへ渡しています。
これらのフィールドは、記事ごとの評価結果をNotion上で一覧化・可視化することに特化しており、AIによる継続的な改善サイクルの基盤として機能します。
Google Analytics APIの利用前に必要な事前準備
Google Analyticsのデータをn8nで取得するには、APIの有効化とサービスアカウントの準備が必要です。ここでは、n8nがGA4にアクセスできるようにするための前提設定を整理します。
Analytics Data APIの有効化(GCP)
- ブラウザでGoogle Cloud Consoleにアクセス
- ログイン後、画面上部の「プロジェクト選択」から対象プロジェクトを選択
- 左側メニューの「APIとサービス」>「ライブラリ」をクリック
- 検索バーにAnalytics Data APIと入力して検索
- 「Analytics Data API(v1)」を選択する
- Google Analytics Data APIを「有効にする」をクリック

GA4にサービスアカウントを登録し、閲覧権限を付与
- ブラウザでAnalytics GA4にアクセスし、GA4の管理画面を開く
- 左下の「管理」をクリック
- 対象プロパティの「アカウントのアクセス管理」または「プロパティのアクセス管理」をクリック
- 右上の「+」>「ユーザーを追加」を選択
- サービスアカウントのメールアドレスを、ロールは「閲覧者(Viewer)」を選択して「追加」
(例:xxxxx@project-id.iam.gserviceaccount.com)
GA4のプロパティIDを確認する方法
項目 | 入力内容 |
---|---|
OAuth Redirect URL | http://dev01.p-react.co.jp:5678/rest/oauth2-credential/callback(自動入力済・編集不可) |
Client ID | GCPで発行したクライアントID |
Client Secret | GCPで発行したクライアントシークレット |
- GA4の管理画面を開く
- 左下の「管理」>「プロパティ詳細」をクリック
- 画面上部に表示されている「プロパティID」を確認(9桁の数字)
- n8nのProperty欄に手動で入力する場合は、次の形式で入力する:
properties/123456789
このIDは、Analytics Data APIへのリクエスト対象を特定するために必要です。
GA4からデータを取得するn8n構成
Google Analytics 4(GA4)から記事単位のアクセスデータを取得するには、n8nでGA4 APIを呼び出し、特定のディメンション・メトリクスを取得する構成を組みます。
具体的な処理フロー
① [Google Analyticsノード] 👈 今ここ
↓
② [Code(pv・直帰率・滞在時間による前処理)]
↓
③ [Loop Over Items]
↓
④ [OpenAI(ChatGPT判定)]
↓
⑤ [Code(ChatGPTの応答と元データを統合して整形する後処理)]
ここでは、OAuth2による認証方式を前提に、現在のn8n環境で確実に動作する手順を紹介します。
OAuth2認証の準備
GA4とn8nを連携させるためには、Google Cloud側でOAuth2認証の設定を行い、クライアントIDとシークレットを取得する必要があります。以下の手順でOAuth2クライアントを作成してください。
① Google Cloud Console にアクセス
- Google Cloud Consoleの認証情報ページを開く
- 対象のプロジェクトを選択(もしくは新規作成)
- ナビゲーションメニューから「APIとサービス」→「認証情報」
② OAuth クライアントIDの作成
- 「+認証情報を作成」→「OAuth クライアント ID」
- クライアントIDの作成:下記の内容を入力して「作成」をクリック
設定項目 | 入力内容 |
---|---|
アプリケーションの種類 | Webアプリケーション |
名前 | n8n GA4 OAuth(任意でOK) |
承認済みのリダイレクトURI | http://dev01.p-react.co.jp:5678/rest/oauth2-credential/callback |
承認済みの JavaScript 生成元 | (未入力のままでOK) |

- 表示される クライアントID と クライアントシークレット を控える

※注意: クライアントIDとクライアントシークレットは、この画面でしか表示されません。
必ずコピーして控えておいてください。n8n側でOAuth認証を設定する際に必要になります。

n8nでGoogle Analyticsノードを設定する(OAuth対応)
Google Cloud側でOAuthクライアントを作成したら、次にn8nでGoogle Analyticsノードを追加し、OAuth認証を設定します。ここでは、n8n上で認証を通し、GA4のプロパティIDに接続する手順を解説します。
① n8nで新しいワークフローを作成
- n8nにログイン後、画面右上の「New Workflow」ボタンをクリック
- 新規ワークフローの編集画面が表示されます
② Google Analyticsノードを追加
- n8nのワークフロー画面で「+ Add first step」ボタンをクリック
- 検索バーに「Google Analytics」と入力し、「Google Analytics」ノードを選択
③ 認証情報(Credential)を作成する
- ノード右側パネルにある 「Credential」欄から「Create New Credential」を選択
Google Analyticsノードを追加すると、自動的に「Google Analytics OAuth2 API」認証が適用されます。 - 以下の情報を貼り付けて入力:
- 入力完了後、「Save」をクリック
※補足: スコープや認証エンドポイントはn8n側で自動設定されているため、入力の必要はありません。
項目 | 入力内容 |
---|---|
OAuth Redirect URL | http://dev01.p-react.co.jp:5678/rest/oauth2-credential/callback(自動入力済・編集不可) |
Client ID | GCPで発行したクライアントID |
Client Secret | GCPで発行したクライアントシークレット |
※入力後は必ず「Sign in with Google」ボタンをクリックし、Googleアカウントの認証を完了させてください。
この手順を行わないと、GA4データの取得ができません。
Googleアカウントで認証できない場合の対処法(403 access_denied)
「Sign in with Google」をクリックした際に、以下のようなエラーメッセージが表示されて先に進めない場合があります:
アクセスをブロック:p-react.co.jp は Google の審査プロセスを完了していません
このアプリは現在テスト中で、デベロッパーに承認されたテスターのみがアクセスできます。
これは、作成したOAuthクライアントがGoogleの審査を完了していない状態で、未登録のユーザーがアクセスしようとした場合に表示されるものです。この問題を回避するには、自分自身をテストユーザーとして登録してください。
- Google Cloud Consoleの「OAuth同意画面」にアクセス
- 左メニューから「対象」を選択
- 自分のGoogleアカウント(例:bepro.xxxxxxxxxx@gmail.com)を追加
- 「保存」をクリック
これで、自分のGoogleアカウントでOAuth認証が可能になります。
④ Googleアカウントで認証する
- 「Sign in with Google」ボタンをクリック
- Googleアカウントの選択画面が表示されるので、認証に使用するアカウントを選択
- 「このアプリは Google で確認されていません」と表示された場合は、左下の「続行」リンクをクリック
- アクセス権限の確認画面が表示されるので、「許可」または「続行」を選択
- 認証が完了すれば、Credential名が選択可能な状態で表示されます
n8nでGA4プロパティIDを指定する
前セクションで取得したGA4のプロパティIDを、n8nのGoogle Analyticsノードに入力します。
- ワークフロー上に配置された Google Analytics ノードを右クリックして「Open」or ダブルクリック
- Property欄の「From list」をクリックし、「By ID」を選択
- 表示された入力欄に、プロパティID(例:123456789)をそのまま入力
- 設定後、「Test step」ボタンを押してGA4からのデータ取得をテストしてください
正常に認証・取得できていれば、ノード右側に「〇 items」と表示されます。
ChatGPTでリライト判定を行うフロー構成
このセクションでは、Googleアナリティクスから取得した記事データをn8n上で処理し、ChatGPTにリライト判定を依頼する構成を実装します。
具体的な処理フローは以下の通りです。
具体的な処理フロー
① [Google Analyticsノード]
↓
② [Code(pv・直帰率・滞在時間による前処理)]
↓
③ [Loop Over Items]
↓
④ [OpenAI(ChatGPT判定)] 👈 ここ
↓
⑤ [Code(ChatGPTの応答と元データを統合して整形する後処理)]
この構成により、条件を満たした記事のみを1件ずつChatGPTに渡し、リライトの必要性を自動で判定できる実用的な仕組みが完成します。
ここでは、プロンプトの設計、送信形式のテンプレート化、ループ処理による1件ずつの評価、そして返ってきた応答を構造化して後続処理に渡すまでの全フローを解説します。
判定に使用するGA4データを再取得する
先ほどの手順でGoogle Analyticsとの接続と動作確認は完了しましたが、ChatGPTに渡すデータとしては不十分です。
なぜなら、「日別ユーザー数」ではどの記事が読まれていないかを判定できないためです。
使用するGA4指標の構成
ここでは、各記事(URL)単位のアクセス指標を取得するように構成を再設定します。
設定項目 | 入力値 | 補足説明 |
---|---|---|
Date Range | Last 30 Days | 最近の傾向を判断するための期間 |
Metric① | Page Views | 記事が表示された回数(PV) |
Metric② | Session Duration | 読者がその記事に滞在した時間の平均 |
Dimension | Page Location | URLごとにデータをグルーピングする |
この設定で、「どの記事が読まれていないのか・直帰されているのか・時間をかけて読まれているか」が可視化されます。
設定手順(n8nのGA4ノード)

- GA4ノードをダブルクリックして設定を開く
- Date Range に Last 30 Days を選択
- Metrics で Page Views と Session Duration の2つを追加
- Dimensions to split by に Page Location を選択
- 「Test step」を実行し、記事単位でデータが取得されることを確認
これで、ChatGPTに渡すべき「ページごとのアクセスデータ」が整いました。次は、このデータをどのように判定させるか、プロンプト設計に進みます。
プロンプト設計と送信形式(テンプレート構文)
ChatGPTにリライトの要否を判定させるためには、GA4で取得した各記事データをテンプレート構文に埋め込んで送信する必要があります。
このセクションでは、以下の設計内容を明確にします:
- どの指標を使って判断するか(例:Page Views, Session Duration)
- どのような条件で「リライト対象」とみなすか
- 送信形式(JSON)の構造と、プロンプト内での使用方法
リライト判定ルール(仮例)
指標 | 条件 | 解釈 |
---|---|---|
Page Views | 30未満 | あまり読まれていない |
Session Duration | 60秒未満 | 最後まで読まれていない可能性がある |
このように、「PVが少なく、滞在時間も短い記事」はリライト候補とみなします。
ChatGPTに渡すテンプレート構文(n8nのOpenAIノード用)
以下は、n8nのOpenAIノードに渡すプロンプトのテンプレート例です。
[ System ]
【タイトル】{{ $json.title }}
【URL】{{ $json.url }}
【ページビュー】{{ $json.screenPageViews }}
【滞在時間(秒)】{{ Math.round(Number($json.averageSessionDuration)) }}
[ User ]
以下の形式でJSONを生成してください。1件のみで返してください。
{
"title": "{{タイトル}}",
"url": "{{URL}}",
"screenPageViews": {{PV}},
"averageSessionDuration": {{滞在時間}},
"result": "はい" または "いいえ",
"reason": "リライトすべき理由(必須)",
"hint": "改善のためのヒント(必須)"
}
上記テンプレートでは、n8nで取得した各記事の情報を `{{$json[...]}}` の形式で埋め込み、1記事ずつChatGPTに送信します。
次のセクションでは、このテンプレートをOpenAIノードでループ処理し、判定結果を受け取る方法を解説します。
OpenAIノードを作成してChatGPTに問い合わせる
取得した記事データをChatGPTへ送信するには、n8nに「OpenAI」ノードを追加し、適切な認証情報とテンプレートを設定する必要があります。
- n8nのワークフロー画面を開く
- 画面右上のノード追加ボタン「+」をクリック
- 検索欄に「OpenAI」と入力する
- 表示された候補から「Message a model(Text)」を選択
- ノードが画面上に追加されOpenAIの設定画面が表示される
- Credentialが未設定の場合は、「Credential to connect with」を選択してOpenAI API KEY情報を入力する。
詳しくは【 OpenAI API KEY 情報入力項目 】を参照してください。 - OpenAI API KEY情報を入力後「Save」ボタンを押下する
- n8nのOpenAIノード設定項目を入力する。
詳しくは【 n8nのOpenAIノード設定入力項目 】を参照してください。
- 「Test step」ボタンをクリックして正常動作の確認
- OpenAIノードがworkflowへ追加されている
ノード同士が正しく接続されていない場合は、接続線の「+」マークをドラッグして、次のノードに接続してください。
n8nでは、各ノードを接続線でつなぐことで、処理の実行順序(フロー)を定義します。
接続線そのものが特定の処理を持つわけではなく、あくまで「処理の流れ」を示すだけである点に注意してください。
以下は、n8nのOpenAIアカウント設定画面での入力項目とその意味・入力可否をまとめた表です。
【 OpenAI API KEY 情報入力項目 】
項目名 | 必須 | 入力値 | 説明 |
---|---|---|---|
API Key | 必須 | sk-〜 で始まるOpenAIのAPIキー | OpenAIのAPIにアクセスするための認証キー |
Organization ID | 任意 | 空欄でOK | OpenAIの複数組織管理用ID。個人利用では不要 |
Base URL | 必須 | https://api.openai.com/v1 | OpenAIのAPIエンドポイント。変更不要 |
以下は、n8nのOpenAIノード設定画面(最新版UI)に対応した設定項目の一覧表です。
それぞれの入力欄が何を意味し、どう入力すべきかをまとめました。
【 n8nのOpenAIノード設定入力項目 】
項目名 | 入力例 | 説明 | 入力の可否 |
---|---|---|---|
Credential to connect with | OpenAI account | OpenAIのAPIキーで認証済みの接続設定を選択 | 必須 |
Resource | Text | 使用するAPIのリソース種別(Textを選択) | 必須 |
Operation | Message a Model | ChatGPT形式の問い合わせ(GPT-4などを使う) | 必須 |
Model | gpt-4 | 使用するモデル。ドロップダウン or Expressionで手入力 | 必須 |
Prompt | e.g. Hello, how can you help me? | ChatGPTに渡すテンプレート構文(n8nのOpenAIノード用)をそのまま貼り付け | 必須 |
Role | User | ChatGPTへの発話者の役割(基本はUser) | 必須 |
判定に使用するGA4のデータ指標
ChatGPTに送る記事データは、以下3つの条件すべてを満たしたものに限定しています。
指標 | 条件 | 目的 |
---|---|---|
ページビュー(PV) | 120以上 | 一定数以上の読者が訪れている |
平均滞在時間 | 60秒未満 | 記事の本文が最後まで読まれていない可能性 |
ChatGPT判定のための処理構成(Code・Loop)
ChatGPTに記事データを渡してリライト要否を判定させるには、その前にいくつかの前処理が必要です。このセクションでは、Googleアナリティクスで取得した複数の記事データを対象に、フィルタ条件に基づいてリライト候補を絞り込み、1件ずつChatGPTへ送信するための処理構成を実装します。
具体的な処理フロー
① [Google Analyticsノード]
↓
② [Code(pv・直帰率・滞在時間による前処理)] 👈 今ここ
↓
③ [Loop Over Items]
↓
④ [OpenAI(ChatGPT判定)]
↓
⑤ [Code(ChatGPTの応答と元データを統合して整形する後処理)]
具体的には、pv・直帰率・滞在時間の3条件で記事を選別するCodeノードと、選別された複数の記事を1件ずつ順番に処理させるLoop Over Itemsノードを組み合わせて構成します。
GA4データに対して判定条件を実装する
取得したGA4データすべてをChatGPTに送信してしまうと、リライトの必要がない記事まで判定対象に含まれてしまい、無駄なリクエストや誤判定の原因となります。 そこで、このワークフローでは次の2つの条件をすべて満たす記事のみをChatGPTに送るよう、n8n上で明示的にフィルター処理を実装します。
このフィルターは、OpenAIノードの直前にFunctionノードを配置し、JavaScriptで条件分岐処理を記述することで実現します。 以下がそのFunctionノードに記述するコード例です。
【 Code(pv・直帰率・滞在時間による前処理)ソース 】
// GA4から取得した各記事データを整形し、条件に合致するもののみを抽出
return items.map(item => {
// 元データから必要な数値を取得(PV、滞在時間)
const j = item.json;
const pv = Number(j.screenPageViews) || 0;
const dur = Number(j.userEngagementDuration) / 1000 || 0;
const url = j.pageLocation || "";
// URLからスラッグ部分を抽出してタイトルを生成
const parts = url.split("/");
const slug = (parts.filter(Boolean).pop() || "").split("?")[0];
const title = slug ? slug.replace(/-/g, " ").trim() : "[root path]";
// 次のノードへ渡す形式に整形
return {
json: {
title,
url,
screenPageViews: pv,
averageSessionDuration: Math.round(dur)
}
};
}).filter(item => {
// トークン節約のための抽出条件:
// PVが100以上あるが、滞在時間が60秒未満の記事のみ対象
const pv = item.json.screenPageViews;
const dur = item.json.averageSessionDuration;
return pv >= 100 && dur < 60;
});
Code(Function)による条件分岐処理の実装
このFunctionノードを設置するには、n8n上で以下の手順を行います。
- ノード追加ボタン「+」をクリックし、「Function」と検索してノードを追加します。
ノード追加画面では「Function」ではなく 「Code」 と表示されているので注意してください。
「Code」は、JavaScriptでカスタム処理を行うノードで、ここではChatGPTへ送る対象を判定する条件分岐を実装します。 - Functionノードに、上記の条件判定コードを貼り付けて保存します。
【 条件分岐処理コード 】を入力します。
- Google Analytics → Function(=Code)の順に接続し直します。
この接続順により、GA4から取得されたすべての記事データはFunctionノードを通過し、リライト判定条件(PV120以上・直帰率85%以上・滞在時間60秒未満)を満たす記事だけがOpenAIノードに渡される構成になります。
このFunctionノードで条件を満たしたデータだけが後続に渡され、OpenAIノードへ送られます。
複数記事を1件ずつ処理するための分割処理(Loop Over Items)
具体的な処理フロー
① [Google Analyticsノード]
↓
② [Code(pv・直帰率・滞在時間による前処理)]
↓
③ [Loop Over Items] 👈 今ここ
↓
④ [OpenAI(ChatGPT判定)]
↓
⑤ [Code(ChatGPTの応答と元データを統合して整形する後処理)]
Google Analyticsノードからは、複数の記事データが一度にまとめて出力されます。
そのままOpenAIノードに渡すと、ChatGPTに複数記事分をまとめて送ることになり、判定精度が落ちたり、トークンを大量に消費してしまうリスクがあります。そこで、n8nの「SplitInBatches」ノードを使用して、1記事ずつ個別に処理する構成を挟みます。
- ノード追加ボタン「+」をクリックし、「SplitInBatches」と検索してノードを追加します。
- SplitInBatchesノードの設定画面を開き、「Batch Size」に「1」を入力します。
- Google Analytics → Function(=Code)→ SplitInBatches(または Loop)→ OpenAIの順で接続します。
ノード同士が正しく接続されていない場合は、接続線の「+」マークをドラッグして、次のノードに接続してください。
n8nでは、各ノードを接続線でつなぐことで、処理の実行順序(フロー)を定義します。
接続線そのものが特定の処理を持つわけではなく、あくまで「処理の流れ」を示すだけである点に注意してください。
これにより、ChatGPTは常に「1記事ぶんのデータだけ」を受け取り、正確な判定を行えるようになります。
ChatGPT応答をNotion連携用に整形する(Codeノード)
この整形処理は、Code(前処理)と同様に「Code」ノードを新しく追加して構成します。追加手順や基本的なノードの扱い方については、前述の「Code(Function)の実装」手順と同様の流れで問題ありません。設定内容だけが異なりますので、必要に応じて前処理セクションを参照しながら進めてください。
具体的な処理フロー
① [Google Analyticsノード]
↓
② [Code(pv・直帰率・滞在時間による前処理)]
↓
③ [Loop Over Items]
↓
④ [OpenAI(ChatGPT判定)]
↓
⑤ [Code(ChatGPTの応答と元データを統合して整形する後処理)] 👈 今ここ
ChatGPTからの応答は自然言語形式で返されるため、そのままではデータベース連携や記録処理に利用しづらい形式になっています。そこで、Codeノード(後処理)を使って、判定結果・理由・改善ヒントなどを抽出・整形し、Notionなど後続処理で扱いやすい形に変換します。 以下は、OpenAIノードから返された内容を整形するCodeノードの処理例です。
[Code(ChatGPTの応答と元データを統合して整形する後処理)ソース]
// 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);
}
// Notion登録用に整形した単一オブジェクトを返す
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への書き込み時にフィールド単位でマッピングでき、管理性の高い判定一覧を構築できます。ChatGPTからNotionへとつなぐ“橋渡し”となる重要な処理です。
ChatGPTまでの構成を実行してみる

ここまでで、GA4から記事データを取得し、リライト対象の絞り込み → ChatGPTへの送信 → 応答の整形までが完了しました。
この時点で、ChatGPTからの判定(はい/いいえ)と、その理由・ヒントを含んだ応答をNotion連携用に成形できている状態です。
あとは実際にワークフローをテスト実行し、**どのようなデータが処理されているのかを確認**してみましょう。
なお、この時点では `title` や `url` など一部の情報は ChatGPT の応答に含まれる前提で処理されています。
(構造的には不安定なため、後編記事にて完全な解決構成を紹介予定です)
ここでは、n8n上の「Test Workflow」ボタンから、取得〜判定〜整形までが問題なく動作するかをチェックしてみてください。 動作確認のポイント:
- OpenAIノードに正しくプロンプトが渡っているか(変数が展開されているか)
- ChatGPTから想定どおりのJSON形式で応答が返っているか
- Codeノードで result/reason/hint/title などが正しく抽出されているか
- 処理が途中で止まっていないか(Executionsタブでチェック)
以上のポイントを確認し、構成に問題がなければ、ChatGPT連携フェーズまでのワークフローが正常に機能していると判断できます。
次回は、このChatGPT応答と Notion を安全かつ構造的に接続する後編構成へと進みます。
まとめ
ここまでで、GA4からデータを取得し、ChatGPTに送信するところまでの構成を構築できました。
記事ごとのアクセス指標(PV・滞在時間・直帰率)を元にリライト対象を判定し、ChatGPTの応答をNotionに連携可能な形に整形するところまでの実装を行いました。
しかし現時点では、ChatGPTの出力仕様により、前段で生成した title などのフィールドが後続で欠落するという致命的な構造バグが発生しています。
この問題を回避するには、
- ChatGPTにtitleを再掲させる(非実用的)
- Mergeノードを入れて構成を変更する(記事が崩壊する)
という2択しかなく、とても本記事内に収めることができないため、上記の2課題および Notion 接続については次回記事に繰り越すことになりました。
今回は、この記事を前半構築パートとして一旦完結し、次回記事にて「title欠損問題の本質的な解決方法」と「構成の最適解」を提示します。