Magicode logo
Magicode
4 min read

GAS でアクセス数集計(Google 広告編)

https://cdn.apollon.ai/media/notebox/53bacd28-7a3e-4318-9ee1-f8cc64b9fdce.jpeg
今回は Google 広告の集計についても Google Spreadsheet に入れたいと思います。

Google 広告について

以前は Google AdWords といわれていました。特に検索結果画面で広告を出す機能です。

Google 広告の集計

集計を行う場合、管理ツール上部のレポート機能を使っています。好きな書式でレポートを出し、ダウンロードボタンで出力します。 ダウンロードしたファイルを開き、コピー貼り付けまたはインポートで取り込み完了です。こちらもかなり手間なので、できれば Spreadsheet だけで完結したいです。

スクリプト環境の準備

  1. Google Spreadsheet シートの準備 結果を書き込むシートを用意します。
  2. MCC の利用申請(開発者トークン) 通常の Google 広告アカウントだと API が使えません。MCC アカウントを使用します。 最初はテストアカウントになっていますが、通常アカウントにするために申請が必要です。 通常アカウントになると、開発者トークンが取得できます。
  3. Google カスタマ ID 管理画面右上にある数字です。000-000-0000 の形式で、API で使うときにハイフンを除きます。
  4. Google Cloud Console で Google Ads API の利用設定 データ取得には API のエンドポイントにアクセスしますが、Google Cloud Console で利用設定が必要です。

スクリプト実装

上記のとおりですが、HTTP でエンドポイントにアクセスします。API を使うときはキーが必要なので、OAuth と開発用キーをヘッダに追加します。 データ取得には GAQL というクエリ構文を使用します。ここで気を遣うところとしては FROM で何を引っ張ってくるか、どのフィールドに有効な値が入っているかです。量がかなり膨大で、今回は landing_page_view で日付セグメントしたうえで、表示、クリック、コストを引っ張ってきました。デバッグに出しながら出力を確認しますが、文字型になっている場合があり、結果を集計するときに文字列連結されてしまったりします。1を掛け算するなりして数値型にします。また、コストについてはとても大きな値になるので、1000 * 1000 で割ります。項目中に ctr などの確率項目がありますが、集計した後でも充分出せる(clicks / impression)ので省きます。
function GET_ADWORDS(_customer, _developer) {
    // Google Ads API
    const url = 'https://googleads.googleapis.com/v11/customers/{customer_id}/googleAds:searchStream'.replace('{customer_id}', _customer);
    const prms = {
      muteHttpExceptions: true,
      method: 'POST',
      headers: {
        accept: 'application/json',
        // OAuth のアクセストークンを指定
        authorization: 'Bearer {access_token}'.replace('{access_token}', ScriptApp.getOAuthToken()),
        'content-type': 'application/json',
        // 開発者キーを指定
        'developer-token': _developer,
      },
      payload: JSON.stringify({
        query: [
          // GAQL を記述
          'SELECT',
          [
            'segments.date',
            'metrics.impressions',
            'metrics.clicks',
            'metrics.cost_micros',
          ].join(','),
          'FROM landing_page_view',
          'WHERE segments.date DURING LAST_7_DAYS',
          'ORDER BY segments.date',
        ].join(' ')
      })
    };
    //console.log(UrlFetchApp.getRequest(url, prms));
    const res = UrlFetchApp.fetch(url, prms);
    const sts = res.getResponseCode();
    console.log(['STATUS', sts]);
    console.log(res.getAllHeaders());
    const cnt = res.getContentText();
    if (sts !== 200) {
      console.error(cnt);
    } else {
      console.log(cnt);
    }
    var obj;
    try {
      obj = JSON.parse(cnt);
    } catch (_error) {
      console.error(_error);
    }
    return obj[0].results.map(function (_row) {
      // 結果が文字列で返ってくるので数値変換
      return [_row.segments.date, _row.metrics.clicks * 1, _row.metrics.impressions * 1, _row.metrics.costMicros / 1000000];
    });
  }

Discussion

コメントにはログインが必要です。