見出し画像

【ナレッジ】Google広告のレポートデータ取得自動化

与件

Google広告のレポートデータを手動でダウンロードするのが手間だから自動化して欲しい

使った技術

・GoogleAPI(Googleスプレッドシート)
Googleスプレッドシートは取得したレポートデータの転記先として利用しました。直接メールで送ることもできたのですが、ちゃんとデータが取れているのかの確認をしやすくするためにもスプレッドシートに転記しています。
が、Google広告の場合はライブラリのインストールや余計なせっても必要なく関数呼び出せばすぐ使えるので便利。

・広告スクリプト
本記事のメインです。
広告のプラットフォームにはすでに広告スクリプトという便利機能が備えられており、今回はこの機能を使うことで実現しました。
今回はGoogleに限っての記事ですが、MicroSoftでもYahooでも同様の機能はあります。(個人的にYahooが一番使いやすかった)

広告スクリプトとは

公式ドキュメント

広告スクリプト機能までのアクセスは広告管理画面のヘッダーメニューから「ツールと設定」>「一括操作-スクリプト」で画面まで辿り着けます。

また、便器な機能としてスケジュールの設定(=定期実行)などもできるので、実行させたい処理だけ書いてあとは定期でお任せできるのは便利です!
※時間単位でしか指定不可

処理ステップ

1.広告スクリプトを利用して、対象のレポートデータを取得
2.取得したデータをスプレッドシートに転記する

スクリプトの処理の中身としては上記の3つで、全体的なコードとしては以下のような感じです。
冒頭の処理はレポートの日付期間を設定したり、スプレッドシートを設定したり、レポートデータのヘッダー行を設定したりしてます。

function main() {
  //本日の日付を取得
  var today = new Date();
  today.setHours(today.getHours() + 14);

  var todaySt = Utilities.formatDate(today, "GMT+9", "yyyy-MM-dd");

  // 今月の1日を開始日とする
  var startDate = Utilities.formatDate(
    new Date(today.getFullYear(), today.getMonth(), 1),
    "GMT+9",
    "yyyy-MM-dd"
  );

  // 現在日時の前日を終了日とする
  var endDate = Utilities.formatDate(
    new Date(today.getFullYear(), today.getMonth(), today.getDate() - 1),
    "GMT+9",
    "yyyy-MM-dd"
  );

  //実行日が1日の場合、期間を前月に変更
  if (startDate == todaySt) {
    Logger.log("月初の処理");
    startDate = Utilities.formatDate(
      new Date(today.getFullYear(), today.getMonth() - 1, 1),
      "GMT+9",
      "yyyy-MM-dd"
    );
  }
  Logger.log("レポート期間:" + startDate + "〜" + endDate);
  // スプレッドシート設定
  var spreadsheet = SpreadsheetApp.openById(
    "★シートID★"
  );
  var sheet = spreadsheet.getSheetByName("★シート名★");
  sheet.clearContents(); // シートの内容をクリアする

  var accountList = ["★アカウントリスト★"];
  // ヘッダー行を作成する
  var headerRow = [
    "日",
    "コンバージョン アクション",
    "キャンペーン",
    "コンバージョン",
  ];
  sheet.appendRow(headerRow);

  // アカウント一覧取得
  const accountIterator = AdsManagerApp.accounts().get();

  //アカウントごとに処理
  while (accountIterator.hasNext()) {
    //対象のアカウントを設定
    account = accountIterator.next();
    accountId = account.getCustomerId();
    Logger.log("アカウントID:" + accountId);
    AdsManagerApp.select(account);
    if (accountList.includes(accountId)) {
      Logger.log("対象アカウント:" + accountId);
      getReport(sheet, accountId, startDate, endDate);
    }
  }
}

function getReport(sheet, accountId, startDate, endDate) {
  //レポート取得用クエリ
  report = AdsApp.report(
    "SELECT segments.date, segments.conversion_action_name, campaign.name, metrics.conversions " +
      "FROM campaign " +
      "WHERE segments.date BETWEEN '" +
      startDate +
      "' AND '" +
      endDate +
      "' " +
      "ORDER BY segments.date,segments.conversion_action_name,campaign.name, metrics.conversions DESC"
  );
  var rows = report.rows();
  while (rows.hasNext()) {
    var row = rows.next();
    var h = [];
    //日付
    var dates = row["segments.date"];
    h.push(dates);
    //コンバージョンアクション
    var conversion_action_name = row["segments.conversion_action_name"];
    h.push(conversion_action_name);
    //キャンペーン
    var campaign_name = row["campaign.name"];
    h.push(campaign_name);
    //コンバージョン数
    var metrics_conversions = row["metrics.conversions"];
    h.push(metrics_conversions);
    //シートに追記
    sheet.appendRow(h);
  }
}


1.広告スクリプトを利用して、対象のレポートデータを取得

(ドキュメント)

(呼び出し部分)
ポイントは今回レポートの対象となるアカウントが複数存在していたため各アカウントごとにデータを取得するように、アカウントを配列として一つずつ渡しています。

// アカウント一覧取得
  const accountIterator = AdsManagerApp.accounts().get();

  //アカウントごとに処理
  while (accountIterator.hasNext()) {
    //対象のアカウントを設定
    account = accountIterator.next();
    accountId = account.getCustomerId();
    Logger.log("アカウントID:" + accountId);
    AdsManagerApp.select(account);
    if (accountList.includes(accountId)) {
      Logger.log("対象アカウント:" + accountId);
      getReport(sheet, accountId, startDate, endDate);
    }
  }


(関数部分)
メインのAdsApp.reportの処理を記載している箇所です。
引数にSQLを記述するとデータが取得できるためSQLに慣れているエンジニアの方はサクッと理解できるかと思います。
少し横道ですが、クエリを書くときに取りたい指標がどういう論理名で格納されているのかわかんないときに使えるのがこのツールです。
論理名もさることながらクエリ自体も生成してくれるので楽です。

function getReport(sheet, accountId, startDate, endDate) {
  //レポート取得用クエリ
  report = AdsApp.report(
    "SELECT segments.date, segments.conversion_action_name, campaign.name, metrics.conversions " +
      "FROM campaign " +
      "WHERE segments.date BETWEEN '" +
      startDate +
      "' AND '" +
      endDate +
      "' " +
      "ORDER BY segments.date,segments.conversion_action_name,campaign.name, metrics.conversions DESC"
  );

2.取得したデータをスプレッドシートに転記する

ここはご存じの方多いと思うので詳細は割愛しますが、
取得したデータ(配列になっている)を一つずつ取り出してシートにappendRawしていってます。

  var rows = report.rows();
  while (rows.hasNext()) {
    var row = rows.next();
    var h = [];
    //日付
    var dates = row["segments.date"];
    h.push(dates);
    //コンバージョンアクション
    var conversion_action_name = row["segments.conversion_action_name"];
    h.push(conversion_action_name);
    //キャンペーン
    var campaign_name = row["campaign.name"];
    h.push(campaign_name);
    //コンバージョン数
    var metrics_conversions = row["metrics.conversions"];
    h.push(metrics_conversions);
    //シートに追記
    sheet.appendRow(h);
  }
}

感想

この機能に気づくまでに時間がかかりましたが、発見してからは一瞬で開発まで終えることができました。
Google様様です。。。

参考にしたサイト


この記事が気に入ったらサポートをしてみませんか?