もう手作業はいらない!Search Console APIでスプレッドシートに自動転記する設定手順

Search Consoleのデータを自動でスプレッドシートに転記しよう!
Google Search Consoleは、サイト運営者にとって欠かせないSEO分析ツールです。
しかし、SEO分析をしている人の多くは
「毎週データを手動でコピーしてスプレッドシートに貼り付ける」
という作業をされているかもしれません。
私もスプレッドシートに記録するということはやってきませんでしたが、
ちょくちょくGoogle Search Consoleは見ていました。
ただ、そろそろちゃんとブログの方も運営していこうと思い始めるようになりましたので、
これを機にGoogle Search Consoleのデータ取得もしたい!
と考えました。
でも毎日、手作業でデータを確認して記録するのはかなりの負担です。
実は、この作業はGoogle Search Console APIとGoogle Apps Script(GAS)を組み合わせることで、
完全に自動化することが可能なんですよね。
設定さえ済ませておけば、
毎朝スプレッドシートを開くだけで過去分のクリック数・表示回数・平均順位が自動更新されるようになります。
この記事では、GSC APIの設定からGASのコード記述、
トリガーを使った自動化までを実際の手順も交えて解説していきます。
Search Console APIとは?できることを簡単に解説
Google Search Console APIとは、
GSC上のデータをプログラムを通じて取得・活用できる仕組みのことです。
通常、GSCの管理画面では特定の日付範囲のデータしかエクスポートできませんが、
APIを使えば過去16か月分の検索データを自由に取得できます。
また、スプレッドシートと組み合わせれば、クリック数やCTR(クリック率)、
平均掲載順位などを自動で毎日記録することができます。
手動エクスポートと比べた場合の大きな利点は、「一度設定すれば放置できる」点です。
毎回フィルターをかけたり、CSVをダウンロードする必要がなく、常に最新データがシートに反映されます。
Google Search Console APIで取得できる主な項目は以下の通りです:
- 検索クエリ(ユーザーが実際に入力したキーワード)
- ページURL
- クリック数・表示回数
- CTR(クリック率)
- 平均掲載順位
これらを自動で記録しておけば、後から「順位が落ちたキーワード」や「CTRが急上昇したページ」を簡単に把握できます。
後述する今回私が作ったコードでは、 ‘クリック数’, ‘表示回数’, ‘CTR’, ‘平均順位’を取得しています
Search Console APIを使うための事前準備
まず大前提として、データ取得をしたいサイトがすでにSearch Consoleに登録されていることを確認しましょう。
登録が済んでいないと、API経由でデータを取得することはできません。
次に、Google Cloud ConsoleでSearch Console APIを有効化します。
これは、Googleが提供するAPIを使うための設定画面で、
ここで「OAuthクライアントID」と「クライアントシークレット」を発行する必要があります。
OAuthとは、Googleアカウントへの安全なアクセスを許可するための仕組みです。
この設定を行うことで、自分のGSCデータを安全にGASから扱えるようになります。
Search Console APIの有効化手順については、下記の公式サイトが参考になるかと思います。
注意点としては、Google Cloud ConsoleではリダイレクトURLを設定する必要があります。
リダイレクトURIには https://developers.google.com/oauthplayground ではなく、
GAS用のURI(例:https://script.google.com/macros/d/{スクリプトID}/usercallback)を入力する点に注意してください。
さらに、OAuth同意画面で「テストユーザー」に自分のGoogleアカウントを追加しないと認証が通らないので、ここも忘れずに行いましょう。
スプレッドシートの構成例(テンプレート紹介)
次にスプレッドシートのお話です。
シートをどのようなレイアウトにするかは、
Search Console APIで取得できるデータを参考に
ご自身が後続作業で加工しやすいように、自由に決めて良いと思います。
参考までに、今回私は、
主に「daily」シートと「summary」シートの2つで構成することにしました。
画面イメージはこんな感じ
※入力されているデータはブログ用に用意したダミーデータです。
dailyシート
日ごとのデータを蓄積。列には「日付」「クリック数」「表示回数」「CTR」「平均順位」などを並べます。
APIで取得したデータを転記するのがこちらのシートです。
summaryシート
週単位または月単位で集計したデータをまとめ、前週比などを表示します。
今回のブログでは出てこないシートです。
ある程度データが貯まってきたらLooker Studioにも連携して分析できれば良いなと思ったので、その前段で仕様予定。
この2層構造にしておくことで、dailyシートをもとに自動集計が可能になります。
例えば、=AVERAGE(FILTER(daily!C:C, WEEKNUM(daily!A:A)=WEEKNUM(TODAY()))) のような数式を使えば、
今週分の平均CTRを自動で算出できます。
さらに、条件付き書式を活用して、CTRや平均順位が急変したセルを色分けすれば、
SEOトレンドを一目で把握できるダッシュボードをスプレッドシートで実現することもできそうですね。
Search Console APIのデータをスプレッドシートに転記するGASスクリプト
さて、ここからが今回のメインディッシュの自動化のお話です。
自動化にはGASというプログラミング言語を使用します。
Google Apps Script(GAS)は、Googleの各サービスを自動操作できる無料ツールです。
Gmail送信やスプレッドシート操作、API連携など幅広く使えます。
Search Console APIと連携するためには、OAuth認証→データ取得→シート転記の3ステップを実行します。
まず、OAuth認証を行ってGoogleアカウントにアクセス許可を与えます。
その後、SearchConsole.SearchAnalytics.query() メソッドを使い、特定期間のデータをJSON形式で取得します。
たとえば「3日前のデータ」を取得する場合は、startDate と endDate に同じ日付を指定します。
これにより、API制限を回避しつつ安定して日次データを取得可能です。
取得したデータをスプレッドシートに書き込む処理では、
sheet.getRange(row, column).setValue(value) のように指定し、dailyシートの最終行の下に追記していきます。
こうしておくことで、スクリプトを毎日実行するだけで自動的に最新データが追加されていきます。
OAuth認証のライブラリを追加する必要がある
ここは注意なのですが、OAuth認証を行うには、
「OAuth2 for Apps Script」という外部ライブラリを追加する必要があります。
外部ライブラリと聞くと設定が面倒そうな感じがしますが、追加手順は意外と簡単です。
1.GASのプロジェクト画面のライブラリをクリック
2.「OAuth2 for Apps Script」のスクリプトIDを入力し検索します
スクリプトIDはこちらのGitHubから最新のものを確認してください
私の作業時は、「1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF」
となっていました。
3.ライブラリ名を確認して追加をクリック
これで、「OAuth2 for Apps Script」の追加は完了です。
Search Console APIでデータ取得をして、スプレッドシートにデータの転記ができるようになります。
参考までに今回私が作成したGASコードのサンプルも記載しますね。
今回作成したコード
function getSearchConsoleData3DaysAgo() { const siteUrl = 'https://example.com/'; // Search Console登録済みサイト const apiUrl = 'https://searchconsole.googleapis.com/webmasters/v3/sites/' + encodeURIComponent(siteUrl) + '/searchAnalytics/query'; // 3日前の日付 const date = new Date(); date.setDate(date.getDate() - 3); const targetDate = Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy-MM-dd'); const payload = { startDate: targetDate, endDate: targetDate, dimensions: ['date'] }; const service = getService(); if (!service.hasAccess()) { Logger.log('認証が必要です。以下のURLを開いて承認してください:'); Logger.log(service.getAuthorizationUrl()); return; } const response = UrlFetchApp.fetch(apiUrl, { method: 'post', headers: { Authorization: 'Bearer ' + service.getAccessToken(), 'Content-Type': 'application/json' }, payload: JSON.stringify(payload), muteHttpExceptions: true }); const json = JSON.parse(response.getContentText()); Logger.log(JSON.stringify(json, null, 2)); // ============================ // dailyシートに書き込む // ============================ const ss = SpreadsheetApp.getActiveSpreadsheet(); let sheet = ss.getSheetByName('daily'); if (!sheet) { sheet = ss.insertSheet('daily'); sheet.appendRow(['日付', 'クリック数', '表示回数', 'CTR', '平均順位', '更新日時']); sheet.setFrozenRows(1); } const now = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy-MM-dd HH:mm'); if (json.rows && json.rows.length > 0) { const data = json.rows.map(row => { const clicks = row.clicks || 0; const impressions = row.impressions || 0; const ctr = impressions > 0 ? clicks / impressions : 0; const position = row.position || 0; return [targetDate, clicks, impressions, ctr, position, now]; }); sheet.getRange(sheet.getLastRow() + 1, 1, data.length, data[0].length).setValues(data); } else { Logger.log('データがありません。'); } } /** * OAuth認証設定 */ function getService() { return OAuth2.createService('SearchConsoleSample') .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth') .setTokenUrl('https://oauth2.googleapis.com/token') // ↓ ここに取得した認証情報を記載。 .setClientId('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com') .setClientSecret('yyyyyyyyyyyyyyyyyyyyyyyyyyyy') // ↑ 実際の値に置き換える .setCallbackFunction('authCallback') .setScope('https://www.googleapis.com/auth/webmasters.readonly') .setPropertyStore(PropertiesService.getUserProperties()); } /** * 認証後に呼び出されるコールバック */ function authCallback(request) { const service = getService(); const authorized = service.handleCallback(request); if (authorized) { return HtmlService.createHtmlOutput('認証成功!このウィンドウを閉じてスクリプトに戻ってください。'); } else { return HtmlService.createHtmlOutput('認証失敗しました。'); } } /** * 再認証が必要な場合はこれを実行 */ function resetAuth() { getService().reset(); }
ちなみに今回は、前日や当日のデータを取得するコードにはしていません。
どうやらAPIで取得するデータとWEB画面上のデータでは反映のタイミングに違いがあるみたいです。
ChatGPTに聞いてみたところ下記のように返ってきました。
Search Consoleのデータは1〜2日遅れて確定します。
ブラウザ版は「確定済みデータ」を優先して表示するのに対し、
APIは一部「更新中(pending)」データも含むことがあります。特に最新数日分では誤差が出やすいです。
なので、3日くらい前のデータを取得するようにしました。
昨日・今日のデータがすぐ見れることよりも、
なるべく正確なデータを貯めていきたかったので、このようなコードにしてみたという次第です。
この辺は、みなさんの目的に応じて変更してもらえれば良いと思います。
トリガー設定で完全自動化する
スクリプトが完成したら、最後にトリガーを設定します。
Google Apps Scriptの「時計アイコン」から「トリガーを追加」を選択し、
関数名(例:main)を指定して、毎日または毎週の実行スケジュールを設定しましょう。
おすすめは「午前6時〜7時」の実行です。
朝のうちにデータ更新を終えておけば、出勤前や作業前に最新データを確認できます。
ただし、トリガー実行時に認証トークンの有効期限が切れていると
「Authorization required(認証が必要です)」
というエラーが発生します。
その場合は、一度スクリプトを手動実行して再認証すればOKです。
また、トリガーが動かない場合は、
スクリプトの権限」「トリガー設定時間」「エラーログ(実行履歴)」辺りを確認して原因を特定してみましょう。
まとめ:Search Console API × スプレッドシートで分析を効率化しよう
ここまでの設定を終えれば、GSCのデータ収集を完全に自動化できます。
もう毎週CSVをダウンロードしてコピー&ペーストする必要はなく、肝心のSEO分析に集中できますね!
さらに、スプレッドシートに蓄積したデータを活用すれば、Looker Studioや他のBIツールとも連携しやすくなります。
将来的には、Google Analyticsや広告データと組み合わせて「サイト全体のパフォーマンス自動モニタリング」を実現することもできそう。
今回のデータを活用して、Looker Studioや他のBIツールの紹介もこのブログで紹介していければ良いなーと思っています。
Google Apps Scriptを使った業務改善はお任せください!
私、しんさんわーくすはプログラムを活用した業務改善や効率化に関するご依頼も受け付けております。
今回のようなGoogle Search Consoleのデータ取得自動化はもちろん、
みなさんの定型業務を効率化するお手伝いができればと思いますので、ぜひお気軽にお問合せください!