経緯
小規模のWEB制作兼広告代理店で広告運用をしていたが案件数がそこまで多くなかった為、
レポーティングの自動化に重きを置いてなくても正直管理画面上の確認と都度Excelダウンロードでなんとかなってた。
ただ、案件数が増えた事もあり、レポートにかける時間を下げないとそもそもの運用改善どころか家に帰る時間が怪しくなった為、まずはGoogle広告スクリプトを利用して、スプレッドシート上にCSVデータを出力する事を考えた。
BigDataを使った諸々の自動化ツール等については、費用面とそもそもの導入ハードルが高すぎるので一旦無視した。
前提
・非エンジニア(html・CSSは制作の兼ね合いで最低限の理解くらいはできる
・英語 弱い
・回りに一切聞ける人無し
必要なもの
- Google広告アカウント
- スプレッドシート
スクリプト出力フロー
- 1.Google広告管理画面上でスクリプトを設定。

「ツール」→「一括操作」からスクリプトを選択
.
作成済のスクリプト一覧画面になるので、「+」ボタンから新規スクリプトを押して作成画面へ。
実際にスクリプトのコードを記載していく画面になるのでここで出したいものを色々と書いて出す。※詳細は後述
作成画面右下に 閉じる 実行 保存 プレビュー があるので、プレビューで一回動作確認をした後に問題なければ保存。 - 2.スプレッドシートに自動でCSVデータが出る。

- 3.自動で出したデータをExcelに張り付けるなりそのままスプレッドシート上で関数組んでレポートを作成するなり、データポータル連携回りでうまいこと使うなど色々使う
詳細
サンプルコードと、内容についての詳細
レポート内容
・出力期間:2023年1月1日-2023年12月1日
・行部分:月単位・デバイス単位・キャンペーン名
・列部分:表示回数・クリック数・クリック率・消化金額・クリック単価・コンバージョン数・コンバージョン単価・コンバージョン率・すべてのコンバージョン・平均インプレッションシェア・コンバージョン値
サンプルコード
function main() {
const ID1 = '●●●●●●●●●●●●●●●';
const SHEET_NAME1 = '●●●●';
const sheet1 = SpreadsheetApp.openById(ID1).getSheetByName(SHEET_NAME1);
const query1 = "SELECT segments.month, segments.device, campaign.name, metrics.impressions, metrics.clicks, metrics.ctr, metrics.cost_micros, metrics.average_cpc, metrics.conversions, metrics.conversions_from_interactions_rate, metrics.cost_per_conversion, metrics.all_conversions, metrics.search_impression_share, metrics.conversions_value " +
"FROM campaign WHERE segments.month BETWEEN '2023-01-01' AND '2023-12-01' ORDER BY segments.month";
var report = AdsApp.report(query1);
report.exportToSheet(sheet1)
}
コードについての詳細(自分用備忘録も兼ねて)
function main() {
とりあえずこれが命令する何からしい。頭に絶対いるからとりあえず入れる。
const ID1 = '●●●●●●●●●●●●●●●';
スプレットシートのIDを入れる。
const ID1 = ‘●●●●●●●●●●●●●●●’; の意味合いは、「ID1」が以降で使われるときは●●●の部分を使ってくれって意味なので定義づけ的な感じ。
※注意点
スプレッドシートのIDは赤塗してる部分。![]()
https://docs.google.com/spreadsheets/d/1pzzzqd●●●yVbDFeQpmYinwKDyBBr5a8/edit#gid=41●●●
テキストベースだと上の部分だけをコピペして入れる感じ。
const SHEET_NAME1 = '●●●●';
const sheet1 = SpreadsheetApp.openById(ID1).getSheetByName(SHEET_NAME1);
const SHEET_NAME1 = ‘●●●●’; はスプレッドシート内の実際に出力するタブを記入する所。
Google_●●とかCSV_01とか好み。
その下のコードは、 sheet1の定義は 上二つで設定した ID1とSHEET_NAME1で入れたやつになります的な感じ。
const query1 = "SELECT segments.month, segments.device, campaign.name, metrics.impressions, metrics.clicks, metrics.ctr, metrics.cost_micros, metrics.average_cpc, metrics.conversions, metrics.conversions_from_interactions_rate, metrics.cost_per_conversion, metrics.all_conversions, metrics.search_impression_share, metrics.conversions_value " + "FROM campaign WHERE segments.month BETWEEN '2023-01-01' AND '2023-12-01' ORDER BY segments.month";
出力項目を決める場所なので一番大事。
const~~ =”SELECT までは共通。 それ以降で諸々設定していく。
segments
行の部分の値。日付・キャンペーン・デバイスとかその周りの出力したい定義を決定していく。
一番コケたのが同時に選択できないsegmentsが結構あるところ。
基本的にはGoogle広告の管理画面レポートと同じだけど、若干それよりも難しい縛りがある。
例①:年齢と性別は同時に出せない。
例②:P-maxキャンペーンを含む場合、キャンペーン単位までのsegmentsにしないとP-maxのデータは出力されない(P-maxには広告グループの概念がないので)
日付
segments.month:月単位のディメンション。サンプルに入れてないものだと、
segments.date:日単位
segments.hour:時間単位 が頻出。並べて使うことも結構あり。
ユーザーとかに関する所
segments.device:デバイス単位のディメンション。サンプルに入れてないものだと、
age_range_view.resource_name:年齢単位
gender_view.resource_name:性別単位
当たりは頻出で出すので必要だが、resource_nameは出力のされ方がややこしいのでCSV出力後に変換が必要。また、ここに関しては同時出力不可 ※理由は後述
metrics
出力する数字指標を選んでいく。個人的にはCPCとかはレポートに出すとき数式で出すので使わないので実数値の部分だけ記載。
metrics.impressions:表示回数
metrics.clicks:クリック数
metrics.cost_micros:利用金額
metrics.conversions:コンバージョン数
metrics.conversions_value:コンバージョン値
metrics.all_conversions:すべてのコンバージョン数
基本的にはそのまま使えるが、利用金額だけ非常に使いにくい部分がある。
仮にmetrics.cos_microsの指標を出力したとすると、
177792574963
60019993159
くらいの富豪みたいな数値が出てきてしまう。自分で調べた限りだと、出力時に日本円に変換したりするのは本格的なエンジニア系の人でないと不可だと感じた為、この出てきた数値を10の六乗で割ることで正しい数値を出すことになる。
177792574963/10^6=177792.575
60019993159/10^6=60019.99316
これが必須になる点だけ手間としてはあるかな?というところ。
const query1 = "SELECT~~~~~~~~~" + "FROM campaign WHERE segments.month BETWEEN '2023-01-01' AND '2023-12-01' ORDER BY segments.month";
赤字部分は、出力する大枠単位と出力する期間を指定していく。
FROM
FROM campaign: 短いが、ここを間違えると大体エラーを吐く。
今回だとsegmentsはキャンペーンを軸において計測する為キャンペーン。
これが広告グループならFROM ad_group
性別単位を計測する時はFROM gender_view とかかなり変更が必要だった(慣れ
WHERE
segments.month BETWEEN ‘2023-01-01’ AND ‘2023-12-01’ ORDER BY segments.month”;
見た目的にわかりやすいが、1/1-12/1までの期間のデータ。
最初がsegments.month になっているのは今回の出力が月単位でいいから。
これを日単位で出す場合はsegments.dateに変更してからじゃないとエラー吐く。
今回使ってる以外でいくと、
YESTERDAY:昨日
THIS_MONTH:今月(当日を含む
LAST_MONTH:先月
LAST_30_DAYS:過去30日 あたりは頻出。
これらを使う場合は、
sgments.month DURING LAST_MONTH
の記載になる。
var report = AdsApp.report(query1);
report.exportToSheet(sheet1)
}
最後のここは特にいじらない。 query1(さっき色々決めた月とか表示回数とかの数字回り)を
sheet1に出力する。みたいなコードで、最後に閉じカッコ入れて終わり。
色々やった感じ
データの成型とか正しく数字が出てるかとかの整合性合わせとかで手動でレポーティングするよりも正直1か月くらいは時間がかかってしまったものの、現在は手動でやるよりも明らかに工数は削減。
一番時間食う所は特定のデータを抜きたい時にエラーを吐いて出せないって時がやばかった感覚。
指標の定義とか行部分の名称は日本語で載せてくれてる所がないので、Google公式のリファレンスから頑張って調べるしかなさそう。
GoogleAdsAPIのリファレンス
他に調べる際に役に立った所でいくと、流行りのChatGPTにこちらで書いたコードを送って、
修正を出してもらうのは結構よかったように感じる。
最新の情報をChatGPTが仕入れることができない関係上、正解の修正が出てくるのは10%くらいだった気もするが考えの一つとしてあれこれ試すときの材料にはよかった。
自分で指標一覧がぱっとわかるように後日指標載せはしたいと思う。

コメント