Google Apps Script(以降、GAS)でAdSense Management APIを利用して、毎日自動実行していたスクリプトがあったのですが、急に動かなくなりました。
で、エラーの内容を見たら、GoogleJsonResponseException: API call to adsense.reports.generate failed with error: v1.4 of the AdSense Management API is no longer available; see https://ads-developers.googleblog.com/2021/04/announcing-v2-of-adsense-management-api.html for migration instructions.
とのことです。
DeepLの力を借りて翻訳を紹介すると・・・
GoogleJsonResponseException: API call to adsense.reports.generate failed with error: AdSense Management APIのv1.4は利用できなくなりました。移行方法についてはhttps://ads-developers.googleblog.com/2021/04/announcing-v2-of-adsense-management-api.html。
すなわち、AdSense Management APIのv1.4が使えなくなったので、v2にバージョンアップしましょうということです。
ということで、今回はAdSense Management APIのバージョンを1.4から2に上げたので、その時の対応を紹介します。
バージョンアップ対応
とりあえずバージョンアップして、動かないところを調査するって感じで進めようと思います。
AdSense Management APIのv1.4からv2へのバージョンアップ
まずは、利用しているAdSense Management APIのバージョンをあげます。
左のサイドメニューにあるサービスの項目のAdSenceをクリックします。
表示されるポップアップでバージョンがv1.4
になっているところをv2
に変更します。(v2.0
じゃないんだって思った)
そして、保存をクリック。これだけでバージョンが上がります。
ソースコードの修正
バージョンを上げて動かしたのですが、全然動きません。。
ちなみに、v1.4の時はAdSense.Reports.generate()
を利用してGoogleアドセンスのレポートを取得するようにしていたのですが、このgenerate()メソッドが大きく変わっていたのです。
ドキュメントを見るのが一番わかりやすいと思うので、リンクを貼っておきますね。
generate()メソッドの存在している場所が異なる
まず、generate()が存在しなくてあれれってなった。
上でも書きましたが、AdSense.Reports.generate()
だったのが、AdSense.Accounts.Reports.generate()に変わりました。
AdSenseの下にAcountsというオブジェクトが挟まったようです。アカウントを意識するようになったということなのでしょうか。
第一引数にaccountNameを入れる
そして、メソッドの引数が変わりました。第一引数には、accountNameというものを入れなくてはならなくなりました。
/** * Generates a spreadsheet report for a specific ad client in an account. * @param {string} accountName The resource name of the account. * @param {string} adClientName The reporting dimension ID of the ad client. */ function generateReport (accountName, adClientReportingDimensionId) { // Prepare report. const today = new Date(); const oneWeekAgo = new Date(today.getTime() - 7 * 24 * 60 * 60 * 1000); const report = AdSense.Accounts.Reports.generate(accountName, { (以下省略)
このようにドキュメントには書かれていて、{string} accountName The resource name of the account.
を第一引数に渡しています。
accountNameってなんだよ、と思って以下を出力してみました。
console.log(AdSense.Accounts.list())
どうやら、ここで出力されたオブジェクトのnameの項目のものでした。accounts/pub-123456789012345
みたいな文字列です。
これを第一引数に渡して解決です。
第二引数のオブジェクトも微妙に変わる
ここに関してもドキュメントとv1.4の書き方を見比べてほしいです。
const report = AdSense.Accounts.Reports.generate(accountName, { // Specify the desired ad client using a filter. filters: ['AD_CLIENT_ID==' + escapeFilterParameter(adClientReportingDimensionId)], metrics: ['PAGE_VIEWS', 'AD_REQUESTS', 'AD_REQUESTS_COVERAGE', 'CLICKS', 'AD_REQUESTS_CTR', 'COST_PER_CLICK', 'AD_REQUESTS_RPM', 'ESTIMATED_EARNINGS'], dimensions: ['DATE'], ...dateToJson('startDate', oneWeekAgo), ...dateToJson('endDate', today), // Sort by ascending date. orderBy: ['+DATE'] });
こちらがドキュメントにかかれているv2の書き方なのですが、いろいろと違いがありました。
- metricsやdimensions等が複数形に変わっている
- metricsで設定する文字列が微妙に変わっている
- sortからorderByに変わっている
- 取得期間の指定方法が変わっている
ざっとこのような感じでしょうか。いろいろ変わっているので、自分の実装とドキュメントを見比べるのがおすすめです。
戻り値の内容も変わる
これでやっと動くだろうと思ったら、戻り値の形まで変わっていました。
具体的には、reportという戻り値をdataというオブジェクトにプッシュする処理で例を挙げると、以下のようになります。
for (var i = 0; i < 30; i++) { data.push([ report.rows[i][1], report.rows[i][2] ]) }
v1.4までは上の書き方でdataに追加することができたのですが、v2だと以下のような書き方に変わりました。
for (var i = 0; i < 30; i++) { data.push([ report.rows[i].cells[1].value, report.rows[i].cells[2].value ]) }
rowsの中に、添字で取得してから、cellsという項目に入って、valueというプロパティで取れるようになった、みたいな違いです。
ここまでの対応で動いた
ここまでで紹介した対応で、やっと今までのプログラムが動くようになりました。
これでバージョンアップ対応が完了になります。
さいごに
今回は、とりあえずバージョンアップをしてみて、動かなくなったところを1つ1つ実行しながら見つけて潰していくというやり方で解決することができました。