前週比でCTRが落ちている広告グループを自動通知するGoogle 広告スクリプト(旧 AdWords Script)

AdWords scriptでAdWords API v201502レポート取得が可能に

運用型広告レポート作成支援システム glu グルー日々の広告運用において、パフォーマンスが悪化している部分をパッと状況確認できれば、その都度全体を確認する必要がなく効率的ですね。

 

Googleが公開しているAdWords Scriptサンプルコードの中で、3週に渡ってクリック率が下落している広告グループを抽出し、Googleスプレッドシートの簡単なレポートを自動作成し、メールで抜粋版を通知するものがあります。こちらを取り上げたいと思います。

 

原文はこちらです。
リンク: AdWords Script/Solutions – Declining Ad Groups Report
こちらに対して:

  • 日本語化:レポートやメールを英語から日本語対応に
  • 3週比較だけでなく、2週比較も作成
  • バグ修正:そのままでは正しく動作しない箇所が一部ありました

 

アウトプットイメージ

AdWords Scriptを実行した際のイメージはこのようになります:

URLを指定したGoogleスプレッドシートのレポートテンプレートが更新されます。

 

screenshot22

 

また、レポートの内容を抜粋したメールが作成と同時に指定したメールアドレス(Googleスプレッドシート上で指定)に送付されます。

 

screenshot24

 

準備いただくこと

  1. 下記のサンプルコード(3週比較または2週比較)をコピーし、管理したいAdWordsアカウントのスクリプトとして登録(スクリプト名は任意。承認作業を忘れずに)
  2. Googleスプレッドシートを準備する。3週比較→https://goo.gl/Tm6US5、2週比較→https://goo.gl/49nOmo。読み取り専用ですので、メニュー→ファイル→コピーを作成
  3. GoogleスプレッドシートのURLを一行目のカッコ(’)内にペースト
  4. D3セルに通知を送信したいメールのアドレスを記入

 

なお、このままであれば気になった際に都度実行する形になりますが、決められた頻度でスクリプトの自動実行をかけることも可能です。スクリプト一覧で該当するスクリプトの実行ボタンの右となりに「スケジュールを作成」というリンクをクリックして、必要な頻度を設定してください。これで自動的に実行され、レポート作成、メール送信が定期的に行われます。

screenshot24

以上で準備は完了です!

 

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!

【Google 広告の設定や使い方を正しく理解し効果を最大化しませんか?】

✓Google 広告設定を最適化したい
✓固定フィーベースの広告運用サービスに興味がある
✓社内の知識を醸成するため、Google 広告のトレーニングをしてほしい(広告主も広告代理店も受講可)
という方は、まずはライトな相談から
アタラの運用型広告最適化サービスの内容とお問い合わせはこちらをクリック

Related posts

Top