こんにちは。サーバーサイドエンジニアの杉浦です。
前回は、Google広告(旧:GoogleAdWords)のデータをGoogle Ads Scripts (旧:Google AdWords Scripts)を使ってスプレッドシートに出力する方法をご紹介いたしました。
今回はGoogleAdWordsAPIを使って、キャンペーンパフォーマンスレポートから取得したデータを出力する方法をご紹介します。

前提

Google広告を運用しているGoogleアカウントがあること

入門内容

キャンペーンパフォーマンスレポートより、下記項目を取得することを目標とします。

  • アカウントID
  • アカウント名
  • 表示回数
  • クリック数
  • コンバージョンアクションが「購入」のコンバージョン数

実際に私が直面した問題

Google広告画面で1度に表示できる項目が、AdWordsAPIだと1度に取得できない

例えばGoogle広告画面のキャンペーンにて、コンバージョンアクションで分割すると、クリック数や表示回数、費用といった項目はキャンペーンの行にのみ表示され、分割したコンバージョンアクションの行には表示されません。
キャンペーン、表示回数、クリック数、コンバージョンアクション単位でのコンバージョンを同一の表に出力する場合、キャンペーンを単位とした一覧と、コンバージョンアクションを単位とした一覧をそれぞれ取得し、script上で結合させる必要があります。

Google Ads Scriptsを作成してみよう

①.スプレッドシートを作成する

前回はscriptからスプレッドシートを作成しましたが、今回は作成したスプレッドシートに出力することにします。
そのため、下記の通りの新しいスプレッドシートを作成してください。

  • タイトルはなんでもOK
  • シート名は「シート1」のまま

②.Google Ads Scriptsを作成する

script作成方法は、前回のブログをご参照下さい。
なお、このscriptはMCCアカウントに作成してください。

③.ソースコードを設定する

新しいscript作成が完了したら、「function main(){ }」を削除し、下記コードをコピーして貼り付けてください。
※2行目:MANAGER_CUSTOMER_IDの値を、ご自身で登録しているMCCアカウントのIDに変更してください。
※5行目:SPREADSHEET_URL の値を、作成したスプレッドシートのURLに変更してください。

//レポート出力対象CustomerID ★変更してください★
var MANAGER_CUSTOMER_ID = '1234567890';

//出力先スプレッドシートのURL ★変更してください★
var SPREADSHEET_URL = 'https://docs.google.com/spreadsheets/d/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/edit#gid=0';

//出力スプレッド行
var row = 1;

function main() {
  //------------------------
  // スプレッドシートを用意
  //------------------------
  //スプレッドシートを展開
  var spreadSheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
  //出力先シートを宣言
  var sheet = spreadSheet.getSheetByName('シート1');
  //タイトルを表示
  setTitle(sheet);

  //----------------------------------------------
  // Google広告データを取得・スプレッドシートに出力
  //----------------------------------------------
  createReport(function(account) {
    //メインデータ取得
    var mainData = getMainData();
    //CVデータ取得
    var cvData = getCvData();
    //スプレッドに出力
    viewAllData(mainData, cvData, sheet);
  });
}

/**
 * アカウント情報取得
 * @param {*} callback 
 */
function createReport(callback) {

  //MCCidを指定してアカウント情報を取得
  var accountIterator = MccApp.accounts()
                              .withCondition("ManagerCustomerId = '"+MANAGER_CUSTOMER_ID+"'")
                              .get();
  Logger.log('アカウント件数 : ' + accountIterator.totalNumEntities());

  //アカウント単位でデータ抽出
  while(accountIterator.hasNext()) {

    var account = accountIterator.next();

    //MCC内に存在する対象のアカウント情報を取得
    MccApp.select(account);

    //main()内にて宣言したfunctionを実行する
    callback(account);
  }
}

/**
 * タイトル表示
 * @param {object} sheet スプレッドシートオブジェクト
 */
function setTitle(sheet){
  sheet.getRange(row, 1).setValue('アカウントID');
  sheet.getRange(row, 2).setValue('アカウント名');
  sheet.getRange(row, 3).setValue('表示回数');
  sheet.getRange(row, 4).setValue('クリック数');
  sheet.getRange(row, 5).setValue('購入CV');
  row++;
}

/**
 * メインデータ取得
 */
function getMainData() {
  var data = []; 
  var rows = AdWordsApp.report(
    'SELECT ExternalCustomerId, CustomerDescriptiveName, Clicks, Impressions'
    + ' FROM ACCOUNT_PERFORMANCE_REPORT '
    + ' DURING LAST_MONTH'
  ).rows();

  while (rows.hasNext()) {
    var row = rows.next();
    try {
      data['ExternalCustomerId'] = row['ExternalCustomerId'];
      data['CustomerDescriptiveName'] = row['CustomerDescriptiveName'];
      data['Clicks'] = row['Clicks'];
      data['Impressions'] = row['Impressions'];
    } catch (ex) {
      Logger.log('Exception:'+ex);
    }
  }
  return data;
}

/**
 * CVデータ取得
 */
function getCvData() {
  var data = []; 
  var rows = AdWordsApp.report(
    'SELECT ExternalCustomerId, CustomerDescriptiveName, ConversionTypeName, Conversions'
    + ' FROM ACCOUNT_PERFORMANCE_REPORT '
    + ' DURING LAST_MONTH'
  ).rows();

  while (rows.hasNext()) {
    var row = rows.next();
    // コンバージョンアクションが「購入」であるか
    if(row['ConversionTypeName']!='購入') continue;
    try {
      data['ExternalCustomerId'] = row['ExternalCustomerId'];
      data['CustomerDescriptiveName'] = row['CustomerDescriptiveName'];
      data['ConversionTypeName'] = row['ConversionTypeName'];
      data['Conversions'] = row['Conversions'];
      break;
    } catch (ex) {
      Logger.log('Exception:'+ex);
    }
  }
  return data;
}

/**
 * スプレッドシートにデータ出力
 * @param {array} mainData メインデータ
 * @param {array} cvData CVデータ
 * @param {object} sheet スプレッドシートオブジェクト
 */
function viewAllData(mainData, cvData, sheet){
  //メインデータがundefinedの場合
  if(mainData['ExternalCustomerId'] === void 0) return;
  sheet.getRange(row, 1).setValue(mainData['ExternalCustomerId']);
  sheet.getRange(row, 2).setValue(mainData['CustomerDescriptiveName']);
  sheet.getRange(row, 3).setValue(mainData['Clicks']);
  sheet.getRange(row, 4).setValue(mainData['Impressions']);

  //CVデータがundefinedの場合
  if(cvData['Conversions'] === void 0){
    sheet.getRange(row, 5).setValue(0);
  }else{
    sheet.getRange(row, 5).setValue(cvData['Conversions']);
  }

  row++;
}

④.実行・結果確認

コードの貼り付けが完了したら、画面右下の「プレビュー」をクリックしてください。
作成したスプレッドシートを確認すると、データが出力されていることが確認できました。

今回はAccount Performance Reportからデータを取得しましたが、取得できる項目はたくさんありますので、ぜひ他の項目も取得してみてください。

補足

アカウント取得方法

アカウントは、下記のように取得することも出来ます。

//アカウント情報を取得
var accountSelector = MccApp.accounts()
                            .withCondition("ManagerCustomerId = 'MCCアカウントID'")
                            .withCondition("LabelNames CONTAINS 'ラベル名'")
                            .forDateRange('20180401, 20180930')
                            .orderBy("ExternalCustomerId ASC");
var accountIterator =  accountSelector.get();

MccApp.accounts().withCondition()は複数設定することが出来ます。
そのため、CVが〇件以上のデータだけを抽出する、といった操作も可能です。

便利ツール

AdWordsAPIを利用するうえで欠かせないツールが、AWQL.meです。
サンプルソースではAWQL(AdWords クエリ言語)を使ってデータを取得していますが、このAWQLだけを実行することが出来るサイトです。
AWQLに関しては、公式サイトをご確認ください。

最後に

取得できる項目は他にも多くありますので、項目を増やしたり、特定のコンバージョンタイプのCPAやCVRを計算して出力することも出来ます。
ぜひ色々試してみてください。

エンジニア大募集中

Wedding Parkでは一緒に技術のウエディングパークを創っていくエンジニアを募集しています。
興味のある方はぜひ一度気軽にオフィスに遊びにいらして頂ければと思います。

ブライダル業界のデジタルシフトを加速させるリードエンジニア候補募集!

Join Us !

ウエディングパークでは、一緒に働く仲間を募集しています!
ご興味ある方は、お気軽にお問合せください(カジュアル面談から可)

採用情報を見る