『n8n×Googleフォーム』スプレッドシート連携によるCSVデータ自動処理システム【DX推進の実践ガイド】
全般
SEOの記事順位チェックを手動で行っていませんか?n8nとGoogle Sheetsを連携し、面倒な順位監視や下落アラートを自動化する具体的な手順を解説。この記事を参考に、定型作業から解放され、コンテンツ戦略など本来の業務に集中しましょう。
SEO担当者の皆さん、「毎週のキーワード順位チェック、正直面倒…」「順位が落ちてから気づいて、いつも後手に回ってしまう」と感じていませんか?
大量のキーワードを手作業で追いかけ、スプレッドシートに記録し続けるのは、時間も手間もかかる大変な作業です。もし、この定型作業を自動化し、コンテンツ制作や戦略立案といった「本当に価値のある仕事」に集中できるとしたら、どうでしょうか。
この記事では、ノーコードツール「n8n」と「Google Sheets」を連携させ、SEO記事の順位チェックから順位下落のアラート通知までを完全に自動化する具体的な手順を、初心者にも分かりやすく解説します。この記事を読めば、あなたも面倒な手動チェックから解放されます。
コンテンツマーケティングやSEOに携わる皆さんは、日々の業務でこのような課題に直面していませんか。
・手動での順位チェックに膨大な時間を費している:
毎日、あるいは週に何回も、大量のキーワードの検索順位を手作業で確認し、Excelやスプレッドシートに記録するのは骨の折れる作業です。
・順位下落の発見が遅れ、リライトの機会を逃してしまう:
気づいた時には手遅れで、対策が後手に回ってしまうことも少なくありません。
・複数記事の順位管理が属人化している:
チーム内での情報共有がうまくいかず、誰がどの記事を担当しているのか、現状どうなっているのかが見えにくい状況です。
・データに基づいたSEO施策を実行したいが、分析に手が回らない:
手動作業に追われ、本来注力すべきコンテンツ制作や戦略立案の時間が圧迫されていると感じているかもしれません。
もし1つでも当てはまるなら、この記事が解決策の一つとなるかもしれません。
n8nとGoogle Sheetsを活用することで、これらの悩みを解決し、高付加価値業務に集中できる環境を構築できます。
今回紹介するワークフロー構築例は、SEO記事の検索順位監視から、順位変動に応じた改善提案までを一貫して自動化します。
煩雑な定型作業から解放され、より戦略的なSEO運用が可能になります。
このn8nワークフローは、以下のステップで構成されます。

1.Schedule Trigger:週に複数回、自動でワークフローが開始されます。
2.キーワード一覧取得:Google Sheetsから監視対象のキーワードと記事URLを動的に取得します。
3.SerpAPI検索:SerpAPIを使って、各キーワードのGoogle検索結果から自社記事の順位をリアルタイムで取得します。
4.順位データ処理:取得した検索結果から自社記事の順位を特定し、構造化されたデータとして整理します。
5.過去データ取得:順位履歴を記録しているGoogle Sheetsから、過去の順位データを取得します。
6.順位変動分析:現在の順位と過去データを比較し、順位下落の有無や程度を判定します。
7.履歴保存:今回の順位チェック結果をGoogle Sheetsの履歴シートに追記します。
8.アラート判定:順位変動分析の結果に基づき、改善コメント追加が必要かどうかを判定します。
9.改善コメント追加:アラートが必要な場合、該当記事のセルに改善コメントと背景色を自動で追加し、チーム全体に視覚的に通知します。
ここからは、n8nを使用して実際の自動化ワークフローを構築していきます。
「プログラミング未経験だから難しそう…」と感じるかもしれませんが、安心してください。複雑に見える処理も、「準備」「計測」「分析」「アクション」という4つのフェーズに分解して考えれば、その構造は非常にシンプルです。
普段、皆さんが手動で行っている「キーワード表を開き(準備)、検索して順位を確認し(計測)、前回と比較して評価し(分析)、シートに書き込む(アクション)」という一連の思考プロセスを、そのままノードに置き換えていくだけです。
それでは、順を追って構築していきましょう。
最初のフェーズは、ワークフローの「開始条件」と「対象データ」の定義です。
ここでは、単に自動化を開始させるだけでなく、「運用中にキーワードが増減しても、ワークフローを修正しなくて済む仕組み」を作ることが重要です。
n8n側にキーワードを直接書き込むのではなく、外部のGoogleスプレッドシートを参照させることで、非エンジニアのメンバーでも監視リストを容易に更新できる、拡張性の高いシステムを構築します。
目的:ワークフローを週に複数回、自動で実行することで、手動実行の負荷を削減し、継続的な記事パフォーマンス監視を実現します。
追加するノード:「Schedule Trigger」ノード
スケジュール設定:毎週月・水・金の朝9時に実行したい場合は、Modeを「Cron」に設定し、Expressionに「0 9 * * 1,3,5」と入力します。
タイムゾーン:ワークフロー設定画面より、Timezoneを「Asia/Tokyo」に設定し、日本標準時でワークフローが実行されるようにします。

目的:Google Sheetsから監視対象のキーワードと記事URLを動的に取得します。
追加するノード:「Google Sheets」ノード
設定:以下のように設定します。
・Actions:Get row(s) in sheettに設定します。
・Credential to connect with:GoogleアカウントとのOAuth2認証を設定します。
・Sheet:監視対象のキーワード一覧が記載されたGoogle Sheetsを指定します。
・範囲指定:Rangeに「A2:D100」のように範囲を指定します。ヘッダー行を除くため A2 から開始し、今後の追加を考慮して広めの範囲を設定するのがおすすめです。
データ構造例:
・A列 (keyword):検索キーワード
・B列 (target_url):監視対象記事のURL
・C列 (spreadsheet_id):順位を記録するメインのスプレッドシートID
・D列 (記事タイトル):記事のタイトル

次は、実際にGoogle検索を行い、自社記事の順位を特定するフェーズです。
SEO順位チェックで最もハードルが高いのが、「Googleによるスクレイピングブロック(アクセス拒否)」と「正確な順位の特定」です。
ここでは、信頼性の高い外部API(SerpAPI)を利用して安定的に検索結果を取得し、その膨大なデータの中から「自社の記事URLが何番目に表示されているか」をプログラムで正確に探し出す処理を実装します。人間が目で見て数えている作業を、ロジックで再現するパートです。
目的:SerpAPIを利用してGoogle検索結果を取得し、各キーワードでの自社記事の順位を把握します。
追加するノード:「HTTP Request」ノード
設定:以下のように設定します。
・Method:GET
・APIエンドポイント:https://serpapi.com/search
・クエリパラメータ:Send Query ParametersをONにし、表のように設定します。
Name | Value | 説明 |
|---|---|---|
api_key | SerpAPIキー | SerpAPIに登録して取得したAPIキーを貼り付けます。 |
q | {{ $json.keyword }} | 前のノード(キーワード一覧取得)から受け取ったキーワードを動的に設定します。 |
engine | Google検索を利用する設定です。 | |
hl | ja | 検索結果を日本語に設定します。 |
gl | jp | 検索地域を日本に設定します。 |
num | 100 | 検索結果を100位まで取得する設定です。 |
ポイント:SerpAPIのような外部サービスを利用する最大のメリットは、Google検索の仕様変更やIPアドレスによるブロック、CAPTCHA認証などを気にすることなく、安定して検索結果を取得できる点です。自前でスクレイピングのプログラムを組むよりも、はるかに簡単かつ確実に順位データを取得できます。

目的:SerpAPIから取得した検索結果のJSONデータから、自社記事のURLを見つけ出し、その順位を特定します。
追加するノード:「Code」ノード
JavaScriptコードの記述:URLマッチングと順位判定ロジックを実装します。
const items = []; for (const item of $input.json) { const keyword = item.json.q; const targetUrl = item.json.target_url; let rank = null; const organicResults = item.json.organic_results || []; for (let i = 0; i < organicResults.length; i++) { const result = organicResults[i]; if (result.link && result.link.includes(targetUrl)) { rank = i + 1; break; } } items.push({ json: { keyword: keyword, target_url: targetUrl, current_rank: rank !== null ? rank : 999, // 圏外の場合は999 }, }); } return items; |
|---|

単に「現在の順位」を知るだけでは、SEOの改善アクションには繋がりません。「上がったのか、下がったのか」という文脈が必要です。
このフェーズこそが、本ワークフローの頭脳部分です。取得した最新データと、データベースに蓄積された「過去の順位」を突き合わせます。
「10位以上急落したら緊急」「圏外に飛んだらアラート」といった、普段SEO担当者が頭の中で行っている判断基準(肌感)をコードに落とし込み、機械的に異常を検知できるようにします。
目的:順位履歴シートから過去の順位データを取得し、順位変動の分析基盤を構築します。
追加するノード:「Google Sheets」ノード
設定:以下のように設定します。
・Actions:Get row(s)
・Sheet:順位履歴を記録しているGoogle Sheetsを指定します。

目的:現在取得した順位と過去データを比較し、順位変動パターンに応じたアラート判定を行います。
追加するノード:「Code」ノード
JavaScriptコードの記述:現在の順位と過去の履歴データを比較するロジックを実装します。
const items = []; for (const currentItem of $input.item) { const { keyword, target_url, current_rank } = currentItem.json; const pastRanks = $input.item[0].json.past_data .filter(data => data.keyword === keyword && data.URL === target_url) .sort((a, b) => new Date(b.チェック日) – new Date(a.チェック日)); let alertLevel = ‘None’; let comment = ”; let needsComment = false; if (pastRanks.length > 0) { const latestPastRank = pastRanks[0].順位; const rankDifference = currentRank – latestPastRank; if (rankDifference >= 10 && currentRank !== 999) { alertLevel = ‘Critical’; comment = `緊急!順位が${latestPastRank}位から${currentRank}位へ${rankDifference}位下落。要確認。`; needsComment = true; } else if (rankDifference >= 5 && currentRank !== 999) { alertLevel = ‘Warning’; comment = `注意: 順位が${latestPastRank}位から${currentRank}位へ${rankDifference}位下落。`; needsComment = true; } } else if (currentRank === 999) { alertLevel = ‘Info’; comment = `圏外(100位以内)。新規記事の場合は様子見、既存記事なら要改善検討。`; needsComment = true; } items.push({ json: { …currentItem.json, alert_level: alertLevel, comment, needs_comment: needsComment }, }); } return items; |
|---|

最後のフェーズは、分析結果の出力です。分析したデータを放置せず、資産として蓄積すると同時に、「今すぐ対応すべき記事」だけをチームに知らせる仕組みを作ります。
すべての結果を通知するのではなく、問題がある場合のみスプレッドシートのセル色を変えたりコメントを残したりすることで、ノイズを減らし、チームが即座にリライトや調査に取り掛かれる環境(アクション)を生み出します。
目的:今回の順位チェック結果を履歴シートに記録し、長期的なSEOトレンド分析の基盤を構築します。
追加するノード:「Google Sheets」ノード
設定:以下のように設定します。
・Actions:Append row
・Sheet:履歴を保存するGoogle Sheetsを指定します。
・値の設定:
A列:{{ $json.keyword }} B列:{{ $json.target_url }} C列:{{ $json.current_rank }} D列:{{ $json.CHECK_DATE }} E列:{{ $json.timestamp }} F列:{{ $json.alert_level }} |
|---|

目的:順位変動分析の結果に基づき、改善コメント追加の必要性を判定し、不要な処理を省略します。
追加するノード:「If」ノード
判定条件:前のCodeノードで出力されたneeds_commentフラグを条件に設定します。
・「Value 1」を {{ $json.needs_comment }}
・「Condition」は「Boolean」の「 is true」を選択
処理分岐:trueの場合は後続の「改善コメント追加」ノードに接続し、falseの場合はワークフローを終了させます。

目的:Google Sheets APIを使用して、順位下落が発生した記事セルに改善コメントと背景色を自動で適用し、視覚的なアラートで対応を促します。
追加するノード:「HTTP Request」ノード
設定:以下のように設定します。
Method:POST
APIエンドポイント:https://sheets.googleapis.com/v4/spreadsheets/{{ $json.spreadsheet_id }}/batchUpdate
JSON Body:セルのコメント追加と背景色変更を行うリクエストを記述します。
{ “requests”: [ { “updateCells”: { “rows”: [{“values”: [{“note”: “{{ $json.comment }}”, “userEnteredFormat”: {“backgroundColor”: {“red”: 1.0, “green”: 0.0, “blue”: 0.0}}}]}], “fields”: “note,userEnteredFormat.backgroundColor”, “start”: {“sheetId”: 0, “rowIndex”: {{ $json.target_row_index }}, “columnIndex”: {{ $json.target_column_index }}} } } ] } |
|---|
ポイント:ここではGoogle Sheets APIという仕組みを使い、n8nからスプレッドシートに対して「特定のセルの背景色を変えて、コメントを追加してください」という命令を送っています。JSONという形式で書かれたリクエストボディは、その命令書のようなものです。rowIndexやcolumnIndexでセルの場所を指定し、noteにコメント内容、backgroundColorで色を指定しています。この命令をn8nが自動で送ってくれるので、私たちは手作業でシートを編集する必要がなくなります。

この記事では、n8nとGoogle Sheetsを活用して、SEO記事の順位監視を自動化する具体的な手順を解説しました。このワークフローを導入することで、これまで手作業にかけていた膨大な時間を節約し、より創造的で戦略的な業務に集中できるようになります。
順位変動という重要なサインを見逃さず、データに基づいた迅速な改善アクションを起こすことが、SEOの成果を最大化する鍵です。
最初は難しく感じるかもしれませんが、まずはこの記事を参考に、1つのキーワードだけでも自動化を試してみてはいかがでしょうか。その小さな自動化の積み重ねが、日々の運用負担を減らし、SEOの成果を高める土台となるはずです。
株式会社TWOSTONE&Sonsグループでは
60,000人を超える
人材にご登録いただいており、
ITコンサルタント、エンジニア、マーケターを中心に幅広いご支援が可能です。
豊富な人材データベースと創業から培ってきた豊富な実績で貴社のIT/DX関連の課題を解決いたします。
幅広い支援が可能ですので、
ぜひお気軽にご相談ください!