📝

GoogleAppsScriptを利用してGA4とGoogleSpreadsheetを連携する方法

に公開

はじめに

こんにちは、リハプラン/PLFチームの浅野です。
最近、他チームからの依頼でGoogleAnalyticsとGoogleSpreadsheetを連携し、特定のページのアクセス数を日次で自動取得する仕組みを作りました。
この記事では、その際に行った手順を簡潔に紹介します。

やったこと

  1. GoogleAnalyticsにカスタムディメンションとしてユーザー属性(例:ユーザー固有 ID)を送信
    設定方法は、弊社の真木さんの記事
    GoogleAnalyticsを活用してプロダクトの利用状況を可視化する方法」を参考にしました。
  2. 特定のURLパターンに対するユーザー属性ごとのアクセス数を日次で取得
  3. 取得したデータを日次でGoogleSpreadsheetへ自動出力
    本記事では2と3を中心に解説します。

前提

  • GA4 プロパティがすでに作成・計測中であること
  • 集計結果を書き込むGoogleSpreadsheetが用意されていること
  • GoogleAppsScriptプロジェクトで
    AnalyticsData API を有効化していること

GoogleAppsScriptのコード例

以下のサンプルは前々日のpage_view数をユーザーID単位で取得し、新しいシートへ書き込むスクリプトです。
コメントも併せて参考にしてください。

/** 
 * 自動実行用:前々日の日次集計(1つのURLパターン)
 * user_idごとのpage_view件数を取得し、
 * スプレッドシートの新規タブ(YYYYMMDD)に書き出す
 */
function exportDailyCounts() {
  const PROPERTY_ID = 'properties/XXXXXXX';        // ← GA4プロパティIDに置き換えてください
  const TZ          = Session.getScriptTimeZone(); // スクリプトのタイムゾーン

  // 集計対象のURL正規表現パターン(必要に応じて変更)
  const PAGE_PATTERN = '^.*\/your_page_path\/.*$';

  // 対象日は「前々日」に設定
  const today = new Date();
  const prev  = new Date(
    today.getFullYear(),
    today.getMonth(),
    today.getDate() - 2
  );
  const Y = prev.getFullYear();
  const M = ('0' + (prev.getMonth() + 1)).slice(-2);
  const D = ('0' + prev.getDate()).slice(-2);
  const tabName = `${Y}${M}${D}`;

  // 日付フォーマット
  const fmtDate = d => Utilities.formatDate(d, TZ, 'yyyy-MM-dd');
  const dateStr = fmtDate(prev);

  // GA4からデータを取得
  const request = {
    dateRanges: [{ startDate: dateStr, endDate: dateStr }],
    dimensions: [{ name: 'customUser:user_id' }],
    metrics:    [{ name: 'eventCount' }],
    dimensionFilter: {
      andGroup: {
        expressions: [
          { filter: { fieldName: 'eventName', stringFilter: { matchType: 'EXACT', value: 'page_view' } } },
          { filter: { fieldName: 'pageLocation', stringFilter: { matchType: 'FULL_REGEXP', value: PAGE_PATTERN } } }
        ]
      }
    }
  };
  const response = AnalyticsData.Properties.runReport(request, PROPERTY_ID);

  // レスポンスを2次元配列に変換
  const rows = (response.rows || []).map(r => [
    r.dimensionValues[0].value,  // user_id
    Number(r.metricValues[0].value)  // count
  ]);

  // スプレッドシートへ出力
  const ss    = SpreadsheetApp.getActiveSpreadsheet();
  const exist = ss.getSheetByName(tabName);
  if (exist) ss.deleteSheet(exist);
  const sheet = ss.insertSheet(tabName);

  // ヘッダーとデータをセット
  sheet.getRange(1, 1, 1, 2).setValues([['user_id', 'count']]);
  if (rows.length) sheet.getRange(2, 1, rows.length, 2).setValues(rows);
  sheet.autoResizeColumns(1, 2);
}

定期実行の設定

  1. スクリプトエディタで「トリガー」→「トリガーを追加」
  2. 以下の設定を行い保存
設定項目
実行する関数 exportDailyCounts
実行デプロイ Head(最新コード)
イベントのソース 時間主導型
時間ベースのタイプ 日付ベースのタイマー
時刻 例)午前 9:00–10:00

保存すると、毎朝自動で前々日のレポートがシートに追加されます。

おわりに

今回紹介したスクリプトは、GoogleAnalyticsから欲しいデータを自動取得できる小さな仕組みです。
現時点では必要最低限の集計のみですが、状況に応じてスコープを拡張していければと思っています!
この記事が同様の課題を持つ方のヒントになれば幸いです。

Rehab Tech Blog

Discussion