Search Consoleでプロパティセットを利用している時のAPI設定について

複数のプロパティをまとめたセット使ってますか?

Googleの公式ブログで言われているプロパティセット
個人のブログでサブドメ毎にクエリ集計を行ってたり、httpsに移行したときにプロパティが分裂してしまったりした時、それらをまとめて検索アナリティクスで見られるようにするものだ。

(多分)一般的なプログラム

Search Console APIを使って検索クエリ等のデータを取得する際にはいろいろと下準備があるのだが、そこは割愛するが
実際に値を取得する部分だけみると、大体こんな感じのコードになると思う
[javascript highlight=”18″]
var params = {
searchType: "web",
startDate: date,
endDate: date,
dimensions: ["query"],
startRow: offset,
rowLimit: limit
}
var opt = {
"method" : "POST",
"payload" :JSON.stringify(params),
"contentType": "application/json",
"headers" : {
"Authorization": "Bearer " + accessToken
},
"muteHttpExceptions" : true
};
var res = UrlFetchApp.fetch("https://www.googleapis.com/webmasters/v3/sites/"+ encodeURIComponent(site_url) +"/searchAnalytics/query", opt);
[/javascript]
肝は最終行site_urlのところ。ここにサイトのURLを入れることになるのだが、プロパティセットの場合はそれがない
そこで検索アナリティクスの画面を開いた時のここを見て欲しい(アドレスバー赤枠内)

SearchConsoleプロパティセットのサイトURL

URLにはこんな感じでsiteUrlパラメータが設定されているが、ここからsc-set%3A(%3Aは:コロンのURLエンコード)を除いた部分がプロパティセットのsiteUrlとなる

実値を入れたプログラムイメージはこうなる
[javascript]
var res = UrlFetchApp.fetch("https://www.googleapis.com/webmasters/v3/sites/3AF_VIxxxxxxxxxxxxx/searchAnalytics/query", opt);
[/javascript]

これでプロパティセットのデータにアクセスできるようになったぞ

Google Apps Scriptで使えるファイルロガー

だって、コンソールを開かないと見られないし、なによりバッチが途中でコケた時とか、なんの記録も残らないんだぜ。

ってことで、ログのテッパン「ファイル(Google ドキュメント)ロガー」を作ってみた。

ソースコード

主目的は【ログを都度出力にすることにより、処理ダウンによるログの欠落をなくす(検知する)】である。
若干パフォーマンスは落ちるものの、この方式でイク!

gallberry/GALogger

“Google Apps Scriptで使えるファイルロガー” の続きを読む

Google Apps Scriptでタイムアウトを検知する

Google Apps Scriptの制限について

Gooogle Appsの各種サービスを利用する上で考えて置かなければならないのが利用制限である。下記のURLに詳細が記載されているとおり、利用時にはいろいろな制限がある。

Google Apps Script ダッシュボード

今回はこの中の実行時間6分の壁について考えてみようと思う。

そもそも実行制限を超えると何が起こるか?

答えは簡単「何も起こらない」である。処理の書き方にもよるけど急に止まる。ロールバック処理を入れようがない。途中でファイル出力とかしてたら書きっぱなしである。
そのためトリガーをセットしてバックグラウンドで実行している時、タイムアウトが発生した場合、なにもわからないのである。

こんなのいかがでしょうか?

5分の壁を超える方法は色々な人が教えてくれているようなので、本稿ではそもそもタイム・アウトしてしまった時の処理について考えてみた。

まぁ、簡単に言うとこれだけである。

  1. タイムアウト検知用の処理を作成
  2. メイン処理開始時に上記処理を10分後(値は任意)に起動するようにトリガーを作成
  3. メイン処理終了時に先のトリガーを削除

Class ScriptApp

サンプルコード

[javascript highlight=”18,22″]
/**
* タイムアウト通知処理
*/
function sendTimeout() {
// ここにタイムアウト時に通知を行う手段を記載する
// メールで通知やSlackに投稿なんぞいかがでしょう
}

/**
* メイン処理
*/
function main() {
// タイムアウト検知用トリガーをセット(10分後)
var triggerTimeout = ScriptApp.newTrigger(‘sendTimeout’).timeBased().after(10 * 60 * 1000).create();

// メインの処理を記載します

// タイムアウト検知用トリガーを削除
ScriptApp.deleteTrigger(triggerTimeout);
}
[/javascript]

注意

タイムアウトが発生した場合、検知用トリガーが残りっぱなしになるので、こればっかりは運用で削除するしかありませんな・・・