"oauthScopes": [
"https://www.googleapis.com/auth/webmasters.readonly",
"https://www.googleapis.com/auth/script.external_request",
"https://www.googleapis.com/auth/spreadsheets"
],
Console からデータを取得していいよ。(昔は webmaster tool と呼ばれていました)
https:/auth/webmasters.readonly
から外部にデータを取りにいっていいよ。
https:/auth/script.external_request
結果をスプレッドシートに書き込んでいいよ。
https:/auth/spreadsheets
GAS → GCP → Search Console API
function testSearchConsole() {
console.log(getSearchConsole('sc-domain:testsite.example.com'));
}
function getSearchConsole(_site, _search) {
const URL = 'https://www.googleapis.com/webmasters/v3/sites/{site}/searchAnalytics/query'.replace('{site}', encodeURIComponent(_site));
// 日付範囲の指定
const dt1 = new Date(), dt2 = new Date(dt1.getTime());
dt1.setDate(dt1.getDate() - 8); //昨日から一週間前
dt2.setDate(dt2.getDate() - 1); //昨日
// ペイロード部分の作成
const body = {
dimensions: ['DATE'],
startDate: dt1.toISOString().match(/^(\d{4}-\d{2}-\d{2})/)[1],
endDate: dt2.toISOString().match(/^(\d{4}-\d{2}-\d{2})/)[1],
};
const qry = {};
// 文字検索
if (_search) {
body.dimensionFilterGroups = [{
filters: [{
dimension: 'PAGE',
operator: 'CONTAINS',
expression: _search,
}]
}];
};
// URL 生成
const req_url = URL + '?' + (function (_queries) {
var obj = _queries;
return Object.keys(obj).map(function (_id) {
return [encodeURIComponent(_id), encodeURIComponent(obj[_id])].join('=');
}).join('&');
})(qry);
// パラメータ定義
const req_params = {
muteHttpExceptions: true,
method: 'POST',
headers: {
// JSON形式での送信を宣言
'content-type': 'application/json',
// OAuth トークンを送信
authorization: 'Bearer {TOKEN}'.replace('{TOKEN}', ScriptApp.getOAuthToken())
},
payload: JSON.stringify(body)
};
// リクエストヘッダ生成(引数確認用)
console.log(UrlFetchApp.getRequest(req_url, req_params));
const res = UrlFetchApp.fetch(req_url, req_params);
// 送信処理
const sts = res.getResponseCode();
//console.log(['status', sts]);
// コンテンツ取得
const cnt = res.getContentText();
//console.log(['contents', cnt]);
if (sts !== 200) {
console.error([arguments.callee.name, 'Status:' + sts, 'Headers:', res.getAllHeaders()]);
console.error('%J', cnt);
}
var obj;
try {
obj = JSON.parse(cnt);
} catch (_error) {
console.error([arguments.callee.name, 'Body:\n' + cnt]);
obj = {};
}
return obj;
}
5:39:36 情報 { rows:
[ { keys: [Object],
clicks: 0,
impressions: 4,
ctr: 0,
position: 9.75 },
{ keys: [Object],
clicks: 0,
impressions: 8,
ctr: 0,
position: 32.875 },
{ keys: [Object], clicks: 0, impressions: 3, ctr: 0, position: 19 },
{ keys: [Object], clicks: 0, impressions: 2, ctr: 0, position: 97 },
{ keys: [Object],
clicks: 0,
impressions: 4,
ctr: 0,
position: 15.75 },
{ keys: [Object],
clicks: 0,
impressions: 5,
ctr: 0,
position: 17.2 } ],
responseAggregationType: 'byProperty' }
function testSearchConsole() {
const sht = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Google Search Console API');
// 引数はサイト ID
const res = getSearchConsole('sc-domain:testsite.example.com');
// データ確認
console.log(res);
// 戻りのオブジェクトを配列に変換
const rows = res.rows || [];
const ret = [];
// データ変換
[
rows.map(function (_row) { return _row.keys[0] }),
rows.map(function (_row) { return _row.clicks; }),
rows.map(function (_row) { return _row.impressions; }),
rows.map(function (_row) { return _row.ctr; }),
rows.map(function (_row) { return _row.position; })
].forEach(function Transform(_array, _col) {
// 行列変換
_array.forEach(function (_value, _row) {
if (!ret[_row]) ret[_row] = [];
ret[_row][_col] = _value;
});
});
// 整形後確認
//console.log(ret);
// 反映範囲確認
//console.log(sht.getRange(1, 1, ret.length, ret[0].length).getA1Notation());
sht.getRange(1, 1, ret.length, ret[0].length).setValues(ret);
}