📝
GoogleAppsScriptを利用してGA4とGoogleSpreadsheetを連携する方法
はじめに
こんにちは、リハプラン/PLFチームの浅野です。
最近、他チームからの依頼でGoogleAnalyticsとGoogleSpreadsheetを連携し、特定のページのアクセス数を日次で自動取得する仕組みを作りました。
この記事では、その際に行った手順を簡潔に紹介します。
やったこと
- GoogleAnalyticsにカスタムディメンションとしてユーザー属性(例:ユーザー固有 ID)を送信
設定方法は、弊社の真木さんの記事
「GoogleAnalyticsを活用してプロダクトの利用状況を可視化する方法」を参考にしました。 - 特定のURLパターンに対するユーザー属性ごとのアクセス数を日次で取得
- 取得したデータを日次で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);
}
定期実行の設定
- スクリプトエディタで「トリガー」→「トリガーを追加」
- 以下の設定を行い保存
設定項目 | 値 |
---|---|
実行する関数 | exportDailyCounts |
実行デプロイ | Head(最新コード) |
イベントのソース | 時間主導型 |
時間ベースのタイプ | 日付ベースのタイマー |
時刻 | 例)午前 9:00–10:00 |
保存すると、毎朝自動で前々日のレポートがシートに追加されます。
おわりに
今回紹介したスクリプトは、GoogleAnalyticsから欲しいデータを自動取得できる小さな仕組みです。
現時点では必要最低限の集計のみですが、状況に応じてスコープを拡張していければと思っています!
この記事が同様の課題を持つ方のヒントになれば幸いです。
Discussion