【Google広告スクリプト】MCCアカウントから全アカウントの運用レポートを取得する方法

2021年12月28日

Google広告のMCC(管理アカウント)配下に複数の広告アカウントがある場合、それぞれのアカウントのデータをまとめてスプレッドシートに出力したい場面があります。

本記事ではAdsManagerAppを使ってMCCの全アカウントをループ処理し、AdsApp.report()でレポートを取得してスプレッドシートに蓄積する方法を解説します。

AdsApp.reportを使用する主な利点

  • 通常のGoogle広告エンティティでは取得できない詳細な統計情報にアクセスできる
  • 100万行のレポートを取得できる大量データ対応
  • レポート行の反復処理が高速

詳細はGoogle広告スクリプトのリファレンスを参照してください。

MCCアカウントでAdsApp.report()できないときの対処

MCCアカウントでAdsApp.report()を使って複数アカウントのデータを取得しようとすると、最初のアカウントのデータしかスプレッドシートに出力できないことがあります。

これはreport.exportToSheet()をmain関数内で直接呼ぶと上書きが発生するためです。report.exportToSheetを別の関数に切り出すことで解決します。

スクリプトの実装

Google広告MCCアカウントのスクリプト画面でコードを記入します。

Google広告スクリプト設定画面

スクリプト全体

function main() {
    var accountIterator = AdsManagerApp.accounts().get();
    Logger.log('アカウント件数 : ' + accountIterator.totalNumEntities());

    while (accountIterator.hasNext()) {
        account = accountIterator.next();
        AdsManagerApp.select(account);

        report = AdsApp.report(
            "SELECT  segments.date, segments.hour, campaign.name,metrics.impressions,metrics.cost_micros,metrics.clicks,metrics.all_conversions " +
            "FROM campaign " +
            "WHERE segments.date BETWEEN '2021-12-27' AND '2021-12-27'");

        set_record(report)
    }
}

function set_record(report) {
    var spreadsheet = SpreadsheetApp.openById("スプレッドシートID")
    var temp_sheet = spreadsheet.getSheetByName('temp');
    const db_sheet = spreadsheet.getSheetByName('data');
    report.exportToSheet(temp_sheet);
    if (temp_sheet.getLastRow() > 1) {
        const values = temp_sheet.getRange(2, 1, temp_sheet.getLastRow() - 1, temp_sheet.getLastColumn()).getValues();
        const ranges = db_sheet.getRange(db_sheet.getLastRow() + 1, 1, values.length, values[0].length);
        ranges.setValues(values);
    }
}

各セクションの説明

MCCのアカウントリストを取得してループ処理する

var accountIterator = AdsManagerApp.accounts().get();
while (accountIterator.hasNext()) {
    account = accountIterator.next();
    AdsManagerApp.select(account);  // 処理するアカウントを切り替える
    // ...
}

レポートを取得する

report = AdsApp.report(
    "SELECT  segments.date, segments.hour, campaign.name,metrics.impressions,metrics.cost_micros,metrics.clicks,metrics.all_conversions " +
    "FROM campaign " +
    "WHERE segments.date BETWEEN '2021-12-01' AND '2021-12-31'");

上記の例は各キャンペーンの1時間毎のデータを取得するクエリです。クエリの詳細はこちらを参照してください。

スプレッドシートに出力する(別関数化がポイント)

function set_record(report) {
    var spreadsheet = SpreadsheetApp.openById("スプレッドシートID")
    var temp_sheet = spreadsheet.getSheetByName('temp');
    const db_sheet = spreadsheet.getSheetByName('data');
    // tempシートに一度出力(exportToSheetは上書き)
    report.exportToSheet(temp_sheet);
    if (temp_sheet.getLastRow() > 1) {
        const values = temp_sheet.getRange(2, 1, temp_sheet.getLastRow() - 1, temp_sheet.getLastColumn()).getValues();
        // dataシートに追記
        const ranges = db_sheet.getRange(db_sheet.getLastRow() + 1, 1, values.length, values[0].length);
        ranges.setValues(values);
    }
}

report.exportToSheet()はシートのデータを上書きします。そのため「temp」シートに一度出力したデータを保存用「data」シートにコピーする方式を採用しています。

スプレッドシートの準備

事前に出力先スプレッドシートにtempシートとdataシートを作成しておきます。tempシートは中間バッファとして使用するため、非表示にしても構いません。

取得できるデータの例

  • segments.date:日付
  • segments.hour:時間帯
  • campaign.name:キャンペーン名
  • metrics.impressions:インプレッション数
  • metrics.clicks:クリック数
  • metrics.cost_micros:費用(マイクロ単位、100万で割ると円)
  • metrics.all_conversions:コンバージョン数

GAS,広告運用

Posted by Next-k