GASでGA4のデータを自動取得・蓄積する方法

GASでGA4のデータを自動取得・蓄積する方法

Google Apps Script(GAS)からBigQueryの連携が簡単に

最近、GASのライブラリに「Google Analytics Data API」というサービスが追加されました。

現在はベータ版の状態ではありますが、GA4のデータをGASを利用して取得することができるサービス連携となっており、以前まで構築が難しかったGA4レポートの自動更新を行えるものとなっています。

これにより、GA4移行への障害が一つ改善されるとは思いますが、GA4ではデータの最長保持期間が14ヶ月となっているため、取得したレポートを蓄積する先が必要となる場合が多いのではないかと思います。

本記事ではGASで取得したGA4のデータをGCPのサービスの一つであるBigQueryに蓄積する構築の手順をご紹介します。

システム構成・実行概要

1.取得データの指定
  今回新しく追加された「Google Analytics Data API」を利用して日別・ランディングページ別のユーザー数データを取得します。

2.結果を受信
  返却されたデータを整形します。

3.結果を貼り付け
  SpreadSheetへ書き込みます。

4.外部テーブル読み込み
  外部テーブルとして設定したSpreadSheetからデータを取得します。

5.蓄積
  テーブルから取得したデータを取得します。

作業手順

前提・準備

👉 SpreadSheet、GA4、BigQueryの3つを同じユーザーで参照できる状態とします。また、BigQueryとGA4についてはアカウントを取得し、一通りの設定は終わっているものとします。

1.取得データの指定 ~ 3.結果の貼り付け

スプレッドシートの準備

👉 シート名をGA4Dataとしたシートを用意します

👉 開かれたページでサービスの追加ボタンを押します。

👉 Analytics Data APIを追加します。

スクリプトの作成

Googleのリファレンスを参考に作成します。

👉 コード.jsを以下のコードに書き換えて、propertyIdをGA4のプロパティIDに変更します。

function runReport() {
  /**
   * TODO(developer): Uncomment this variable and replace with your
   *   Google Analytics 4 property ID before running the sample.
   */
  const propertyId = '**********';

  try {
    const metric = AnalyticsData.newMetric();
    metric.name = 'activeUsers';

    const dimension = AnalyticsData.newDimension();
    dimension.name = 'date';

    const dimension2 = AnalyticsData.newDimension();
    dimension2.name = 'landingPage';

    const dateRange = AnalyticsData.newDateRange();
    dateRange.startDate = '7daysAgo';
    dateRange.endDate = 'today';

    const request = AnalyticsData.newRunReportRequest();
    request.dimensions = [dimension,dimension2];
    request.metrics = [metric];
    request.dateRanges = dateRange;

    const report = AnalyticsData.Properties.runReport(request,
        'properties/' + propertyId);
    if (!report.rows) {
      Logger.log('No rows returned.');
      return;
    }

    const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("GA4Data");
    sheet.getRange(1,1,sheet.getLastRow(),sheet.getLastColumn()).clear();
    // Append the headers.
    const dimensionHeaders = report.dimensionHeaders.map(
        (dimensionHeader) => {
          return dimensionHeader.name;
        });

    const metricHeaders = report.metricHeaders.map(
        (metricHeader) => {
          return metricHeader.name;
        });
    const headers = [...dimensionHeaders, ...metricHeaders];

    sheet.appendRow(headers);

    // Append the results.
    const rows = report.rows.map((row) => {
      const dimensionValues = row.dimensionValues.map(
          (dimensionValue) => {
            return dimensionValue.value;
          });
      const metricValues = row.metricValues.map(
          (metricValues) => {
            return metricValues.value;
          });
      return [...dimensionValues, ...metricValues];
    });

    sheet.getRange(2, 1, report.rows.length, headers.length)
        .setValues(rows);

    Logger.log('Report spreadsheet created');
  } catch (e) {
    // TODO (Developer) - Handle exception
    Logger.log('Failed with error: %s', e.error);
  }
}

👉 GA4Dataのシートに過去7日間のデータが保管されます。

4.外部テーブル読み込み ~ 5.蓄積

まずは先ほどのスプレッドシートをBigQuery側から外部テーブルとして読み込めるように設定します。

👉 プロジェクトにデータ保管用のデータセットを作成します。

👉 データセット名はGA4_testとしています

👉 テーブルの作成元をドライブとして設定を進めると外部テーブルとして設定でき、SpreadSheetの内容をテーブルとして取り扱うことができます。

👉 外部テーブルになりました。

このままではスプレッドシートの中身が変わるたびにデータが変わってしまうのでデータを貯蓄するテーブルを作成します。
Accumulationの文字を取って接頭文字をAにしてA_GA4DATAとしましょう。
少し楽をするために外部テーブルとして作成したT_GA4DATAにスクリプトを実行することで新しいテーブルを作成してしまいましょう。

👉 新しいタブでクエリを開いてください

👉 SELECTとFROMの間に*(アスタリスク)を入れて、LIMIT句を削除します。

👉 展開⇒クエリの設定を押します。

👉 保存後に先ほどのSQLを実行することで新しくA_GA4DATAのテーブルが作成されました。

これから蓄積するためのスクリプトを設定するのですが、蓄積作業は蓄積用のテーブルであるA_GA4DATAを削除しながらSpreadSheetの内容を追加する方式とします。

このことにより最新の内容であるSpreadSheetの内容が反映されるのに加えて、スクリプトとしての冪等性を担保しやすくなります。(冪等性の重要性についてはまた記事にします。)

重複期間のデータを削除するので仮にT_GA4DATA側に何らかの間違いが発生しても、修正してスクリプトを再実行すれば問題ありません。

削除スクリプト(********はプロジェクト名に書き換えてください)

DELETE
FROM
  `********.GA4_test.A_GA4DATA` AS A
WHERE
  EXISTS (
  SELECT
    *
  FROM
    `********.GA4_test.T_GA4DATA` AS T
  WHERE
    T.date = A.date)

データ挿入スクリプト

INSERT INTO
  `********.GA4_test.A_GA4DATA`
SELECT
  *
FROM
  `********.GA4_test.T_GA4DATA`

上記の2スクリプトを実行すれば問題ありません。

スケジューリング

GASの実行

👉 トリガーを選択して

👉 トリガーを追加を押す。

👉 午前2時~3時の実行としました。

SQLの定期実行

👉 削除スクリプトに対してスケジュールボタンを押す。

👉 SpreadSheetの更新が3時までなのでこちらのスクリプトは4時に流すことにしました。

👉 データ挿入のスクリプトも同様にして4時半に設定しました。

エラー検知などまだまだやるべきことはありますが、一旦これでSpreadSheetもSQLも自動実行されてデータが蓄積されることになります。

おわりに

今回、追加されたGoogle Analytics Data APIによって、GA4移行への障害の一つであったレポートの自動更新の構築がしやすくなりました。GA4ではデータの最長保持期間が14ヶ月ですが、ここで紹介した方法でBigQueryにデータを蓄積することでその問題にも対応ができるので、ぜひ参考にしていただければと思います!

オーリーズではユニバーサルアナリティクスからGA4への移管のご依頼も受け付けております。ご検討の際は、ぜひお問い合わせ欄よりご連絡ください。

オーリーズは、クライアントの「ビジネス目標達成」に伴走するマーケティングエージェンシーです。

「代理店の担当者が自社の業界・戦略に対する理解が不足しており、芯を食った提案が出てこない」
「新規の広告出稿に関する提案が中心で、最終的なビジネスゴールに紐づく本質的な提案がもらえない」
「広告アカウントが開示されないため、情報が不透明で自社にノウハウやナレッジが蓄積しない」

既存の広告代理店に対してこのようなお悩みをお持ちの場合は、一度オーリーズにお問い合わせください。

オーリーズの広告運用支援では、①運用者の担当社数の上限を4社までに制限②担当者のKPIは出稿金額ではなくNPS(顧客満足度)③アカウントは広告主が保有することを推奨 しており、目先のコンバージョン増加にとどまらず、深い事業理解を基にしたマーケティング戦略の立案や実行支援が可能です。

オーリーズのサービス資料をダウンロードする(無料)
オーリーズのコーポレートサイト
支援事例(クライアントの声)
オーリーズブログ

オーリーズへ問い合わせる

この記事を書いた人

株式会社オーリーズ

アシスタント・マネージャー

北原 直明

保険代理店向けの営業管理パッケージシステムの導入・開発に従事。開発責任者として開発基盤の刷新やAmazon Web Services基盤への移行プロジェクトのPMに従事。その後、自分のエンジニアリングスキルをマーケティング領域で活用すべくオーリーズに入社。広告運用を通じ、各種広告チャネルとマーケティングツールを基盤データ連携できるストラテジストとして邁進中。

最近書いた記事