🤮

Google Apps Script(GAS)×SerpAPIでキーワードごとの検索上位記事を自動でリスト化する方法

に公開

「SEO対策用にキーワードごとの検索上位記事を一覧にしたいけど、手作業だと面倒すぎる...」
「競合分析のために、タイトル・URL・スニペットをまとめて取得しておきたい!」

そんなニーズに応えるべく、Google Apps Script(GAS)を使って、スプレッドシートに入力したキーワードから検索上位記事を一括取得する仕組みを構築しました。

この記事では、SerpAPI を使って検索結果を取得し、Googleスプレッドシートに整形出力する方法を、実際のコードと共に詳しく解説します。

今回の記事では、プログラミングがわからない人でも実行できるようになっていますので、ぜひ臆せず試してみてください。

GAS×SerpAPIで実現したいこと

Googleスプレッドシートにキーワードを列挙します。

次に、GAS(Google Apps Script)を実行します。

スクリプトを実行すると、指定したキーワードごとにGoogle検索を行い、上位20件の記事をリスト化してくれます。
キーワード・記事タイトル・メタディスクリプションが一覧になった構造のシートが自動で生成されます。

キーワードさえ入力しておけば、あとはGASを実行するだけで記事収集が完了します。
(これまでは上位20記事をCSVで出力していたかもしれませんが、それが一瞬で完了します)

↓以前ラッコツールで記事リストを作っていましたが、圧倒的に楽になりました。
https://zenn.dev/nabesan/articles/12ab5a260c3305

今回はこのやり方を解説したいと思います。

1. スプレッドシートの準備

Googleスプレッドシートを用意します。
スプレッドシートの1つのシートの名前を「KW」とし、A列に記事集を作りたいキーワードを作成したいと思います。
そして、「result_test」というシートも作成します。

この名前のシートに記事リストが作成されるような仕様になります。

2. SerpAPIに登録してAPI keyを取得する

SerpAPIの無料アカウントを作成します。
SerpAPIは、無料アカウントでは利用制限がありますが、100回までは無料で使えます。
大抵の場合は、無料アカウントの範囲で事足りると思います。

  1. SerpAPIの公式サイトにアクセス
     右上にある「Register」ボタンをクリックします。

  1. アカウントの作成
     「Sign up with Github」または「Sign up with Google」からサインアップ方法を選びます。
     このチュートリアルではGoogleアカウントで進めます。

  1. Googleアカウントの選択
     登録に使用するGoogleアカウントを選択します。

  1. プランの選択と認証
     無料プラン(100件の検索/月)を選択します。
     この時点で、メールアドレス認証電話番号認証が必要になります。
     表示される指示に従って、それぞれを完了させてください。

  1. ダッシュボードにアクセス
     サインイン後、ダッシュボードが表示されます。左メニューの「Your Account」から自身の情報を確認できます。

  1. APIキーの確認とコピー
     「Your Private API Key」の欄に表示されている文字列がAPIキーです。
     これをコピーして、GASなどのコード内で利用します。

まずは、Googleスプレッドシートの「拡張機能」>「AppsScript」をクリックし、GASのエディタを開きます。

3. スクリプトプロパティにAPIキーを保存

先ほど取得したSerpAPIを「スクリプトプロパティ」という所に登録します。
「プロジェクト設定」をクリックします。

「スクリプトプロパティを編集」をクリックします。

ここに先ほど取得したSerpAPIのKeyを保存しておきます。

4. SerpAPIを使う場合(より正確な検索結果)

以下のコードをGoogleAppsScriptに張り付けます。

function fetchTopArticlesWithSerpAPI() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const kwSheet = ss.getSheetByName("KW");
  const outputSheetName = "result_test"; // 「シート名」はここ
  let outputSheet = ss.getSheetByName(outputSheetName);
  const apiKey = PropertiesService.getScriptProperties().getProperty("SERP_API_KEY");

  if (!outputSheet) outputSheet = ss.insertSheet(outputSheetName);
  else outputSheet.clearContents();
  outputSheet.appendRow(["KW", "title", "URL", "description"]);

  const keywords = kwSheet.getRange("A2:A" + kwSheet.getLastRow()).getValues().flat();
  keywords.forEach(keyword => {
    const url = `https://serpapi.com/search.json?q=${encodeURIComponent(keyword)}&hl=ja&num=20&api_key=${apiKey}`;
    const response = UrlFetchApp.fetch(url);
    const results = JSON.parse(response.getContentText()).organic_results || [];
    results.forEach(result => {
      outputSheet.appendRow([
        keyword,
        result.title || "",
        result.link || "",
        result.snippet || ""
      ]);
    });
    Utilities.sleep(1500);
  });
}

このコードをGASのエディタにコピペしてください。

コピペしたらコードを保存するために、「Command+S」をクリックして、コードを保存してください。

コードの構成と処理の流れ

1. スプレッドシートとシートの取得

const ss = SpreadsheetApp.getActiveSpreadsheet();
const kwSheet = ss.getSheetByName("KW");
const outputSheetName = "result_test";
let outputSheet = ss.getSheetByName(outputSheetName);
  • ss は現在アクティブなスプレッドシート。
  • kwSheet はキーワードが入力されたシート(シート名「KW」)を参照。
  • outputSheetName に結果を書き出すシート名を指定。
  • outputSheet に結果出力先シートを代入し、存在しない場合は新規作成。

2. 結果出力シートの初期化

if (!outputSheet) outputSheet = ss.insertSheet(outputSheetName);
else outputSheet.clearContents();
outputSheet.appendRow(["KW", "title", "URL", "description"]);
  • 既存の出力シートがあれば中身をクリア、なければ新規作成。
  • 最初の行にヘッダー(カラム名)を追加。

3. キーワードの取得

const keywords = kwSheet.getRange("A2:A" + kwSheet.getLastRow()).getValues().flat();
  • 「KW」シートのA列(2行目以降)からすべてのキーワードを取得。
  • flat() によって2次元配列を1次元に変換。

4. SerpAPIを用いた検索と結果出力

keywords.forEach(keyword => {
  const url = `https://serpapi.com/search.json?q=${encodeURIComponent(keyword)}&hl=ja&num=20&api_key=${apiKey}`;
  const response = UrlFetchApp.fetch(url);
  const results = JSON.parse(response.getContentText()).organic_results || [];
  results.forEach(result => {
    outputSheet.appendRow([
      keyword,
      result.title || "",
      result.link || "",
      result.snippet || ""
    ]);
  });
  Utilities.sleep(1500);
});
  • 各キーワードごとに SerpAPI のURLを構築して検索を実行。
  • レスポンスから organic_results(自然検索結果)の配列を取得。
  • タイトル(title)、URL(link)、説明文(snippet)を1行ずつスプレッドシートに追加。
  • APIのレート制限を避けるため、各リクエストの間に 1.5秒(1500ms) の待機を挿入。

5. APIキーの取得

const apiKey = PropertiesService.getScriptProperties().getProperty("SERP_API_KEY");
  • スクリプトプロパティに保存してあるAPIキーを取得。

5. カスタムメニューの追加(SerpAPI例)


このように、任意でカスタムメニューを追加することができます。
必須ではありませんが、GASをわざわざ開かずに、メニューをクリックするだけでSerpAPIを実行できるため、作業効率が向上します。

function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu("SerpAPI検索")
    .addItem("検索結果を取得", "fetchTopArticlesWithSerpAPI")
    .addToUi();
}

まとめ

今回紹介した方法では、GASとAPIを活用して、検索結果の収集を完全に自動化できます。特にSEOやマーケティングの初動リサーチを効率化したい方にとっては、非常に強力なツールになるはずです。

コードを書いてGASに慣れることで、業務の自動化や再利用性もどんどん高まっていきます。

今後はGoogleの公式Search APIやBard/Geminiの精度向上に合わせて改良も可能なので、ぜひ拡張・応用してみてください!

Discussion