日々の広告運用において、パフォーマンスが悪化している部分をパッと状況確認できれば、その都度全体を確認する必要がなく効率的ですね。
Googleが公開しているAdWords Scriptサンプルコードの中で、3週に渡ってクリック率が下落している広告グループを抽出し、Googleスプレッドシートの簡単なレポートを自動作成し、メールで抜粋版を通知するものがあります。こちらを取り上げたいと思います。
原文はこちらです。
リンク: AdWords Script/Solutions – Declining Ad Groups Report
こちらに対して:
- 日本語化:レポートやメールを英語から日本語対応に
- 3週比較だけでなく、2週比較も作成
- バグ修正:そのままでは正しく動作しない箇所が一部ありました
アウトプットイメージ
AdWords Scriptを実行した際のイメージはこのようになります:
URLを指定したGoogleスプレッドシートのレポートテンプレートが更新されます。
また、レポートの内容を抜粋したメールが作成と同時に指定したメールアドレス(Googleスプレッドシート上で指定)に送付されます。
準備いただくこと
- 下記のサンプルコード(3週比較または2週比較)をコピーし、管理したいAdWordsアカウントのスクリプトとして登録(スクリプト名は任意。承認作業を忘れずに)
- Googleスプレッドシートを準備する。3週比較→https://goo.gl/Tm6US5、2週比較→https://goo.gl/49nOmo。読み取り専用ですので、メニュー→ファイル→コピーを作成
- GoogleスプレッドシートのURLを一行目のカッコ(’)内にペースト
- D3セルに通知を送信したいメールのアドレスを記入
なお、このままであれば気になった際に都度実行する形になりますが、決められた頻度でスクリプトの自動実行をかけることも可能です。スクリプト一覧で該当するスクリプトの実行ボタンの右となりに「スケジュールを作成」というリンクをクリックして、必要な頻度を設定してください。これで自動的に実行され、レポート作成、メール送信が定期的に行われます。
以上で準備は完了です!
3週比較版サンプルコード
var SPREADSHEET_URL = 'ここにGoogleスプレッドシートのURLをペースト';
function main() {
var spreadsheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
var sheet = spreadsheet.getSheets()[0];
spreadsheet.getRangeByName('account_id').setValue(
AdWordsApp.currentAccount().getCustomerId());
sheet.getRange(1, 2, 1, 1).setValue('日付');
sheet.getRange(1, 3, 1, 1).setValue(new Date());
sheet.getRange(7, 1, sheet.getMaxRows() - 7, sheet.getMaxColumns()).clear();
var adGroupsIterator = AdWordsApp.adGroups()
.withCondition("Status = 'ENABLED'")
.withCondition("CampaignStatus = 'ENABLED'")
.forDateRange('LAST_7_DAYS')
.orderBy('Ctr ASC')
.withLimit(100)
.get();
var today = getDateInThePast(0);
var oneWeekAgo = getDateInThePast(7);
var twoWeeksAgo = getDateInThePast(14);
var threeWeeksAgo = getDateInThePast(21);
var reportRows = [];
while (adGroupsIterator.hasNext()) {
var adGroup = adGroupsIterator.next();
// Let's look at the trend of the ad group's CTR.
var statsThreeWeeksAgo = adGroup.getStatsFor(threeWeeksAgo, twoWeeksAgo);
var statsTwoWeeksAgo = adGroup.getStatsFor(twoWeeksAgo, oneWeekAgo);
var statsLastWeek = adGroup.getStatsFor(oneWeekAgo, today);
// Week over week, the ad group is declining - record that!
if (statsLastWeek.getCtr() < statsTwoWeeksAgo.getCtr() &&
statsTwoWeeksAgo.getCtr() < statsThreeWeeksAgo.getCtr()) {
reportRows.push([adGroup.getCampaign().getName(), adGroup.getName(),
statsLastWeek.getCtr(), statsLastWeek.getCost(),
statsTwoWeeksAgo.getCtr(), statsTwoWeeksAgo.getCost(),
statsThreeWeeksAgo.getCtr(), statsThreeWeeksAgo.getCost()]);
}
}
if (reportRows.length > 0) {
sheet.getRange(7, 2, reportRows.length, 8).setValues(reportRows);
sheet.getRange(7, 4, reportRows.length, 1).setNumberFormat('#0.00%');
sheet.getRange(7, 6, reportRows.length, 1).setNumberFormat('#0.00%');
sheet.getRange(7, 8, reportRows.length, 1).setNumberFormat('#0.00%');
sheet.getRange(7, 5, reportRows.length, 1).setNumberFormat('#,##0');
sheet.getRange(7, 7, reportRows.length, 1).setNumberFormat('#,##0');
sheet.getRange(7, 9, reportRows.length, 1).setNumberFormat('#,##0');
}
var email = spreadsheet.getRangeByName('email').getValue();
if (email) {
var body = [];
body.push('過去3週間に以下の広告グループのクリック率が落ちています。\n ');
body.push('レポートはこちら: ' + SPREADSHEET_URL + '\n\n');
for (var i = 0; i < reportRows.length; i++) {
body.push(reportRows[i][0] + ' > ' + reportRows[i][1]);
body.push(' ' + ctr(reportRows[i][6]) + ' > ' + ctr(reportRows[i][4]) +
' > ' + ctr(reportRows[i][2]) + '\n');
}
MailApp.sendEmail(email, '' +
reportRows.length + ' 個の広告グループのパフォーマンスが下がっています。AdWordsアカウント: ' +
AdWordsApp.currentAccount().getCustomerId(), body.join('\n'));
}
}
function ctr(number) {
return parseInt(number * 10000) / 10000 + '%';
}
// Returns YYYYMMDD-formatted date.
function getDateInThePast(numDays) {
var today = new Date();
today.setDate(today.getDate() - numDays);
return Utilities.formatDate(today, 'JST', 'yyyyMMdd');
}
2週比較版サンプルコード
var SPREADSHEET_URL = 'ここにGoogleスプレッドシートのURLをペースト';
function main() {
var spreadsheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
var sheet = spreadsheet.getSheets()[0];
spreadsheet.getRangeByName('account_id').setValue(
AdWordsApp.currentAccount().getCustomerId());
sheet.getRange(1, 2, 1, 1).setValue('日付');
sheet.getRange(1, 3, 1, 1).setValue(new Date());
sheet.getRange(7, 1, sheet.getMaxRows() - 7, sheet.getMaxColumns()).clear();
var adGroupsIterator = AdWordsApp.adGroups()
.withCondition("Status = 'ENABLED'")
.withCondition("CampaignStatus = 'ENABLED'")
.forDateRange('LAST_7_DAYS')
.orderBy('Ctr ASC')
.withLimit(100)
.get();
var today = getDateInThePast(0);
var oneWeekAgo = getDateInThePast(7);
var twoWeeksAgo = getDateInThePast(14);
var reportRows = [];
while (adGroupsIterator.hasNext()) {
var adGroup = adGroupsIterator.next();
// Let's look at the trend of the ad group's CTR.
var statsTwoWeeksAgo = adGroup.getStatsFor(twoWeeksAgo, oneWeekAgo);
var statsLastWeek = adGroup.getStatsFor(oneWeekAgo, today);
// Week over week, the ad group is declining - record that!
if (statsLastWeek.getCtr() < statsTwoWeeksAgo.getCtr()) {
reportRows.push([adGroup.getCampaign().getName(), adGroup.getName(),
statsLastWeek.getCtr(), statsLastWeek.getCost(),
statsTwoWeeksAgo.getCtr(), statsTwoWeeksAgo.getCost(),]);
}
}
if (reportRows.length > 0) {
sheet.getRange(7, 2, reportRows.length, 6).setValues(reportRows);
sheet.getRange(7, 4, reportRows.length, 1).setNumberFormat('#0.00%');
sheet.getRange(7, 6, reportRows.length, 1).setNumberFormat('#0.00%');
sheet.getRange(7, 5, reportRows.length, 1).setNumberFormat('#,##0');
sheet.getRange(7, 7, reportRows.length, 1).setNumberFormat('#,##0');
}
var email = spreadsheet.getRangeByName('email').getValue();
if (email) {
var body = [];
body.push('過去2週間に以下の広告グループのクリック率が落ちています。\n ');
body.push('レポートはこちら: ' + SPREADSHEET_URL + '\n\n');
for (var i = 0; i < reportRows.length; i++) {
body.push(reportRows[i][0] + ' > ' + reportRows[i][1]);
body.push(' ' + ctr(reportRows[i][6]) + ' > ' + ctr(reportRows[i][4]) + '\n');
}
MailApp.sendEmail(email, '' +
reportRows.length + ' 個の広告グループのパフォーマンスが下がっています。AdWordsアカウント: ' +
AdWordsApp.currentAccount().getCustomerId(), body.join('\n'));
}
}
function ctr(number) {
return parseInt(number * 10000) / 10000 + '%';
}
// Returns YYYYMMDD-formatted date.
function getDateInThePast(numDays) {
var today = new Date();
today.setDate(today.getDate() - numDays);
return Utilities.formatDate(today, 'JST', 'yyyyMMdd');
}
さらなる改良を加えるには
こちらのサンプルコードをベースにして、さらなる改良を加えることもできます。例としては:
- 比較期間の変更:2週間単位に変更など
- 比較指標の変更: クリック数、コンバージョン数など
こういう改良が比較的簡単にできるのもAdWords Scriptのいいところですね。
Happy scripting!


