他のGoogleサービスと同様に、Google Search ConsoleからもGoogle Apps Scriptでデータを取得する事ができます。
基本的にはGoogle Search Consoleの画面で完結できる部分も多いのですが、アナリティクスのデータと組み合わせて分析をしたり、データスタジオで表示を行うのであれば、スプレッドシートにデータを自動取得できた方が便利な場面があります。
ただしGoogle Search Consoleの場合は事前に下記の2つの手順が必要です。
今回はそれぞれの手順とスクリプトを記載しておきます。
{
"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では下記の3つを行います。
基本的にはオプションを指定し、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);
取得した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])
二次元配列ができれば、後はスプレッドシートへ記録するだけです。
自分の場合は最新のデータのみを参照したかったので、既存のデータを全削除し、ヘッダと全データを追加する形を取りました。
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%程度しかサーチコンソールでは分からない事が原因のようです。
では何を基準にすべきなのかというと、一番良いのは日付別でしょう。下記の画面に出てくるのが日付別の数値だからです。
その上でページ別や検索ワード別の集計は、総数は参考程度に留めるのが良いと思います。代わりにページ間・検索ワード間で比較を行う事で、有益な情報を得られるでしょう。