立入|ITブログ
【GAS】サーチコンソールからスプレッドシートに検索順位を記録するには?

 他のGoogleサービスと同様に、Google Search ConsoleからもGoogle Apps Scriptでデータを取得する事ができます。

基本的にはGoogle Search Consoleの画面で完結できる部分も多いのですが、アナリティクスのデータと組み合わせて分析をしたり、データスタジオで表示を行うのであれば、スプレッドシートにデータを自動取得できた方が便利な場面があります。

ただしGoogle Search Consoleの場合は事前に下記の2つの手順が必要です。

  1. Google Cloud PlatformでAPIを有効にする
  2. Google Apps ScriptでAPIを有効にする

今回はそれぞれの手順とスクリプトを記載しておきます。

1. Google Cloud PlatformでAPIを有効にする

  1. Google Cloud Platform にGoogleアカウントでログインする
  2. 案内に従って初期設定(規約への同意等)を行う
  3. 画面左上「プロジェクトの選択」から新しいプロジェクトを作成する
  4. Google Search ConsoleのAPI設定ページを開く
  5. 「有効にする」を押す
  6. GCPの左側のメニュー「APIとサービス>OAuth同意画面」を開く
  7. 「作成」を押す
  8. 任意のアプリ名と、Googleアカウントのメールアドレスを入力する
  9. 「保存して次へ」を押す
  10. 「+ADD USERS」から自分のGoogleアカウントを追加する
  11. プロジェクトのホーム画面に戻る(左上「Google Cloud」を押すと楽です)
  12. プロジェクト番号を控える

2. Google Apps ScriptでAPIを有効にする

  1. Google Apps Scriptでプロジェクトを開く
  2. 「設定>GCPプロジェクト」から「プロジェクトを変更」を押す
  3. プロジェクト番号を入力して「プロジェクトを設定」
  4. 「設定>全般設定」からappsscript.jsonを表示する設定にチェックを入れる
  5. appsscript.jsonを下記に書き換える
{
  "timeZone": "Etc/GMT-9",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "oauthScopes": ["<https://www.googleapis.com/auth/spreadsheets>", "<https://www.googleapis.com/auth/webmasters","https://www.googleapis.com/auth/script.external_request>"],
  "runtimeVersion": "V8"
}

GASのプログラムを書く

GASでは下記の3つを行います。

  1. APIからサーチコンソールの情報をjsonで取得する
  2. 二次元配列に加工する
  3. スプレッドシートに記録する

1. APIからサーチコンソールの情報をjsonで取得する

基本的にはオプションを指定し、URLへHTTPリクエストを行います。

任意で設定できるのは「開始日・終了日・件数上限・区分」です。

開始日と終了日はデータを取得する期間を指定するもので、日付のフォーマットがYYYY-MM-ddなので注意して下さい。

件数上限は取得するデータの件数の最大値を示します。こちらは最大10000件という制限があります。

区分は下記の6つが選択可能です。一つの配列の中に入れれば複数指定する事も可能で、例えば「各ページの検索ワード別」という形でデータを取得する事もできます。

page ページ別
query 検索ワード別
date 日付別
device デバイス別
country 国別
searchAppearance 検索での見え方別

ただしサーチコンソール側で「ドメインプロパティ」を指定しているとデータが取得できません。これはやり方が間違っているのか、そもそもサポートされていないのか分かりません。

「URLプレフィックス」のデータは下記のコードで取得できます。

  //2022年1月のデータを「各ページの検索ワード別」に上限1万件で取得する場合
  let 件数上限 = 10000;
  let 開始日 = "2022-01-01"
  let 終了日 = "2022-01-31"
	let 区分 = ["page","query"]   
  let ドメイン = "www.abc.com" //自分のサイトのドメイン
  let URL =  '<https://www.googleapis.com/webmasters/v3/sites/https%3A%2F%2F>' + ドメイン + '%2F/searchAnalytics/query';

  let payload = {
    'startDate' : 開始日,
    'endDate': 終了日,
    "dimensions" : ["page","query"], //後述
    "rowLimit" : 件数上限
  };
  let options = {
    'payload' : JSON.stringify(payload),
    'myamethod'  : 'POST',
    'muteHttpExceptions' : true,
    'headers' : {"Authorization" : "Bearer " + ScriptApp.getOAuthToken()},
    'contentType' : 'application/json'
  };
  let response = UrlFetchApp.fetch(URL, options);
  let json = JSON.parse(response);

2. 二次元配列に加工する

取得したjsonを二次元配列に加工し、スプレッドシートへ追加できるようにします。

サーチコンソールの各データはそれぞれ下記で取得可能です。

var i //何番目のデータか
var URL = json.rows[i].keys[0]
var 検索クエリ = json.rows[i].keys[1]
var クリック数 = json.rows[i].clicks
var インプレッション = json.rows[i].impressions
var CTR = json.rows[i].ctr
var 検索順位 = json.rows[i].position

なので全てのデータをスプレッドシートへ記録するためには、下記のようにして二次元配列を作成すればいい事になります。

var values = []
for(i=0;i<json.rows.length;i++)
{
  var URL = json.rows[i].keys[0]
  var 検索クエリ = json.rows[i].keys[1]
  var クリック数 = json.rows[i].clicks
  var インプレッション = json.rows[i].impressions
  var CTR = json.rows[i].ctr
  var 検索順位 = json.rows[i].position
  values.push([URL,検索クエリ,クリック数,インプレッション,CTR,検索順位])
}

高階関数で書けば1行での記述も可能です。

  var values = json.rows.map(x => [x.keys[0],x.keys[1],x.clicks,x.impressions,x.ctr,x.position])

3. スプレッドシートに記録する

二次元配列ができれば、後はスプレッドシートへ記録するだけです。

自分の場合は最新のデータのみを参照したかったので、既存のデータを全削除し、ヘッダと全データを追加する形を取りました。

var シートID = //シートID
var シート名 = //シート名
var ヘッダ = ["URL","クエリ","クリック数","表示数","CTR","検索順位"]

SpreadsheetApp.openById(シートID).getSheetByName(シート名).clearContents()
SpreadsheetApp.openById(シートID).getSheetByName(シート名).appendRow()
SpreadsheetApp.openById(シートID).getSheetByName(シート名).getRange(2,1,values.length,values[0].length).setValues(values)

APIから取得できる値は、基本的にはサーチコンソールの管理画面でも参照できる情報です。何かAPIからだけ手に入る情報があるわけではありません。

しかしスプレッドシートにデータを自動で吐き出せれば、好きな形でデータを活用できます。

自分はアナリティクスのデータとくっつけて分析を行いました。サーチコンソールで良い成績を残すページは検索時点で興味を惹くページですが、アナリティクスの数字が良いページは中身が良いページだと思います。ページごとの役割を確認できるのは自由度の高いスプレッドシートならでは、かもしれないと思いました。

function サーチコンソールのデータをスプレッドシートへ記録する()
{
  //1月のデータをjson形式で取得する
  let 件数上限 = 10000;
  let 開始日 = "2022-01-01"
  let 終了日 = "2022-01-31"
  let ドメイン = "www.abc.com" //自分のサイトのドメイン
  let URL =  '<https://www.googleapis.com/webmasters/v3/sites/https%3A%2F%2F>' + ドメイン + '%2F/searchAnalytics/query';
  let payload = {
    'startDate' : 開始日,
    'endDate': 終了日,
    "dimensions" : ["page","query"],
    "rowLimit" : 件数上限
  };
  let options = {
    'payload' : JSON.stringify(payload),
    'myamethod'  : 'POST',
    'muteHttpExceptions' : true,
    'headers' : {"Authorization" : "Bearer " + ScriptApp.getOAuthToken()},
    'contentType' : 'application/json'
  };
  let response = UrlFetchApp.fetch(apiURL, options);
  let json = JSON.parse(response);

  //jsonを二次元配列に変換する
  var values = json.rows.map(x => [x.keys[0],x.keys[1],x.clicks,x.impressions,x.ctr,x.position])

  //スプレッドシートへ記録する
  var シートID = "xxxxxxxxxx"
  var シート名 = "aaa"
  var ヘッダ = ["URL","クエリ","クリック数","表示数","CTR","検索順位"]

  SpreadsheetApp.openById(シートID).getSheetByName(シート名).clearContents()
  SpreadsheetApp.openById(シートID).getSheetByName(シート名).appendRow()
  SpreadsheetApp.openById(シートID).getSheetByName(シート名).getRange(2,1,values.length,values[0].length).setValues(values)
}

集計項目(検索ワード別・日付別・ページ別)によって表示数やクリック数は変わる

注意すべきは、集計項目によって、表示数やクリック数が変わる事です。

例えばこのブログを初めて1ヶ月で、集計項目によって下記の差異が出ていました。

表示数 クリック数
検索ワード別(query) 534 4
ページ別(page) 1019 40
日付別(date) 979 40

集計項目によって、かなり大きな差が出る事が分かると思います。

特に検索ワード別の表示数・クリック数が低く出ています。これはどんな検索ワードで検索されたのか、全体の50%程度しかサーチコンソールでは分からない事が原因のようです。

では何を基準にすべきなのかというと、一番良いのは日付別でしょう。下記の画面に出てくるのが日付別の数値だからです。


その上でページ別や検索ワード別の集計は、総数は参考程度に留めるのが良いと思います。代わりにページ間・検索ワード間で比較を行う事で、有益な情報を得られるでしょう。