日々の広告運用において、パフォーマンスが悪化している部分をパッと状況確認できれば、その都度全体を確認する必要がなく効率的ですね。
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!