Google広告スクリプトで前日分をスプレッドシートに追記するレポートを作ると、1週間後にコンバージョンだけが管理画面と合わなくなる問題を解決します。原因の構造と、直近14日を毎日上書きするスクリプト(コピペで動くコード)、それでも合わないときの切り分け方までを順に示します。
追記型のスクリプトで数字がずれる本当の理由
コンバージョンは「クリックした日」に後から積み上がる
Google広告の「コンバージョン」列は、成果が起きた日ではなく、広告がクリックされた日に計上されます。数日前のクリックから今日申し込みがあると、過去の日付のコンバージョンがあとから増えます。前日分だけを追記するシートは、追記した朝の数字のまま固まるため、管理画面とずれていきます。コードの誤りではなく、取得のタイミングの問題です。
次の表は、10月14日の行が取得のたびにどう変わるかを、再現用のサンプルデータで示したものです(実在のアカウントの数字ではありません)。
| 取得した朝 | 管理画面の10月14日 | 前日分を追記するシート | 直近14日を上書きするシート |
|---|---|---|---|
| 10月15日 | 12件 | 12件 | 12件 |
| 10月17日 | 15件 | 12件 | 15件 |
| 10月21日 | 16件 | 12件 | 16件 |
| 10月29日 | 17件 | 12件 | 16件(取り直す範囲の外) |
費用が100万倍・コンバージョンが小数になる理由
スクリプトでは、レポートの数字をGAQL(Google Ads Query Language)というSQLに似た文で取り出します。費用の項目 metrics.cost_micros は100万分の1円単位で返るため、100万で割らないと費用が100万倍で表示されます。コンバージョンが小数になるのは、データドリブンのアトリビューションで1件の成果が複数のクリックに分けて割り当てられるためで、誤りではありません。
広告レポートの集計作業に時間を取られていませんか?ADminiなら無料で始められます。無料で試してみる →
直近14日を毎日上書きして解決する
出力先のシートを用意し、コードを貼る
- 出力先のGoogleスプレッドシートを作り、シート名を「raw」にしてURLを控える
- スプレッドシートのタイムゾーン(「ファイル」→「設定」)を、広告アカウントと同じ日本にそろえる。ずれていると日付の比較が1日ずれ、残すべき行を消すことがあるため
- Google広告の管理画面の「ツール」→「一括操作」→「スクリプト」で新しいスクリプトを作り、次のコードを貼って1行目のURLを書き換える
const SHEET_URL = 'ここに出力先スプレッドシートのURL';
const SHEET_NAME = 'raw';
const DAYS = 14; // 毎回取り直す日数
const HEADER = ['日付', 'キャンペーン', '表示回数', 'クリック', '費用', 'コンバージョン', 'コンバージョン値'];
function main() {
const tz = AdsApp.currentAccount().getTimeZone();
const day = 24 * 60 * 60 * 1000;
const fmt = function (d) { return Utilities.formatDate(d, tz, 'yyyy-MM-dd'); };
const num = function (v) { return Number(v || 0); };
const start = fmt(new Date(Date.now() - DAYS * day));
const end = fmt(new Date(Date.now() - day));
const query = 'SELECT segments.date, campaign.name, metrics.impressions, metrics.clicks, ' +
'metrics.cost_micros, metrics.conversions, metrics.conversions_value FROM campaign ' +
"WHERE segments.date BETWEEN '" + start + "' AND '" + end + "' ORDER BY segments.date";
const fresh = [];
const rows = AdsApp.search(query);
while (rows.hasNext()) {
const r = rows.next();
fresh.push([r.segments.date, r.campaign.name, num(r.metrics.impressions), num(r.metrics.clicks),
num(r.metrics.costMicros) / 1000000, num(r.metrics.conversions), num(r.metrics.conversionsValue)]);
}
const sheet = SpreadsheetApp.openByUrl(SHEET_URL).getSheetByName(SHEET_NAME);
const last = sheet.getLastRow();
const kept = last > 1 ? sheet.getRange(2, 1, last - 1, HEADER.length).getValues().filter(function (row) {
const d = row[0] instanceof Date ? fmt(row[0]) : String(row[0]);
return d < start; // 取り直す期間より前の行だけ残す
}) : [];
const all = [HEADER].concat(kept, fresh);
sheet.clearContents();
sheet.getRange(1, 1, all.length, HEADER.length).setValues(all);
}
このコードは、昨日までの14日分をキャンペーン×日付の行で取り出し、シートにある同じ期間の行を消してから書き直します。14日より前の行は残るため、毎日動かすと過去の数字が積み上がり、直近の2週間だけが毎朝入れ替わります。num() で空の値を0にしているのは、AdsApp.search() の結果では値が0の項目が省かれることがあるためです。
プレビューで確かめ、午前3時以降に毎日実行する
- 「承認」でスプレッドシートへのアクセスを許可する
- プレビューで実行し、ログとシートを確かめる。表示回数とクリックが管理画面の昨日の値と同じなら、取り出し方は合っている
- 自動実行の頻度を「毎日」、時刻を午前3時以降にする。Googleは公式サンプル「アカウント概要レポート」で、統計の反映が最大3時間遅れるとして午前3時以降の実行を勧めているため
公式の上限は、1回の実行が最大30分、承認済みのスクリプトが1アカウント250件までです(Google Ads Scripts「Limits」)。広告アカウントが複数あるなら、同じスクリプトを各アカウントに置くか、MCC(クライアントセンター)のスクリプトで1回の実行につき最大50アカウントを並行して処理します。
14日より前の変動は、月の締めで取り直す
上書きするシートも、14日より前の変動は拾えません。上の表でも、10月29日の朝には10月14日が取り直す範囲から外れ、その後に増えた1件が漏れています。月初に DAYS を45にして1回だけ手動で実行し、前月分をまとめて書き直すと、この漏れを埋められます。常に DAYS を30にすれば拾える範囲は広がりますが、そのぶん毎回書き直す行も増えます。
それでも合わないときに見る3つの原因
| 原因 | 何が起きるか | 直し方 |
|---|---|---|
| タイムゾーン | スプレッドシートと広告アカウントの設定が違い、日付の境目がずれる | スプレッドシートのタイムゾーンを広告アカウントにそろえる |
| 列の種類 | 管理画面で「すべてのコンバージョン」を見ていると、スクリプトの metrics.conversions(「コンバージョン」列)と一致しない |
管理画面も「コンバージョン」列で比べる |
| 期間 | 管理画面の期間に今日が含まれていると、スクリプトの「昨日まで」と範囲が違う | 管理画面の期間を昨日までにそろえる |
確かめる順番は、表示回数→費用→コンバージョンです。表示回数が合っていてコンバージョンだけ合わないなら、列の種類か取得のタイミングを疑うと切り分けが早く進みます。
まとめ
- 前日分を追記するだけのスクリプトは、クリックした日にあとから積み上がるコンバージョンを取り逃がす。直近14日を毎日上書きする作りにする
- 費用は
metrics.cost_microsを100万で割る。コンバージョンの小数はアトリビューションによるもので誤りではない - それでも合わなければ、タイムゾーン・列の種類・期間の順に確かめ、14日より前の変動は月初に前月分をまとめて取り直す
よくある質問
Google広告スクリプトでレポートをスプレッドシートに自動出力できますか?
できます。管理画面の「ツール」→「一括操作」→「スクリプト」でスクリプトを作り、GAQLで取り出した数字をスプレッドシートへ書き込むコードを貼って、頻度を「毎日」に設定します。追加の料金はかかりません。前日分だけを追記するとあとから増えたコンバージョンを取り逃がすため、直近14日程度を毎日取り直す作りにします。
Google広告スクリプトの費用の数字が大きすぎるのはなぜですか?
費用の項目metrics.cost_microsが、100万分の1円単位で返るためです。1,000,000で割ると円になります。割らずにシートへ書くと、費用が100万倍で表示されます。コンバージョンが小数になるのは、データドリブンのアトリビューションで1件の成果が複数のクリックに分けて割り当てられるためで、誤りではありません。
Google広告スクリプトで出した数字が管理画面と合わないのはなぜですか?
多くは取得のタイミングです。Google広告のコンバージョンは広告がクリックされた日に計上されるため、過去の日付の数字があとから増えます。ほかに、スプレッドシートと広告アカウントのタイムゾーンの違い、管理画面で「すべてのコンバージョン」を見ている、管理画面の期間に今日が含まれている、の3点を確かめます。
Google広告スクリプトは何時に実行すればよいですか?
前日のデータを書き込むなら、午前3時以降に毎日実行します。Googleは公式サンプル「アカウント概要レポート」で、統計の反映が最大3時間遅れることがあるとして、午前3時以降の実行を勧めています。1回の実行は最大30分までなので、出力する行が多い場合は期間や集計の単位を絞ります。
図解・表つきの完全版はこちら:Google広告スクリプトでレポートを自動化する手順|直近14日をスプレッドシートに毎日上書きするコードと、管理画面と数字を合わせる確認
広告レポートの集計作業に時間を取られていませんか?ADminiなら無料で始められます。無料で試してみる →
この記事が役に立ったら LGTM をいただけると励みになります!
