はじめに
この記事は「Ateam LifeDesign Advent Calendar 2023」で完走賞を狙って25記事書いているうちの13日目の記事です。今年も完走目指して頑張るぞ!
Google Analytics Data API
今回はGoogle Analytics Data APIを利用してデータを取得し、取得した結果をスプレッドシートに記録していく方法についてみていきます。
作るもの
GA4からデータを取得し、メトリクス(eventCount
)とディメンション(pagePath
とeventName
)を前日の日付範囲で取得し、取得したデータをスプレッドシートに記録するスクリプトを作っていきます。
準備
Google Analytics Data APIのサービスを追加
まずはGASでGoogle Analytics Data APIを使うためにサービスの登録をしていきます。
ここの「サービス」をクリック。
サービスリストの中から「Google Analytics Data API」を選択して「追加」をクリック。この記事を書いている現時点おいてはがv1beta
が最新となっているためこのバージョンを選択していますが、今後新たなバージョンが出ることもあると思うので適切なバージョンを選択してください。
GA4のプロパティIDを取得
GA4の管理画面から「管理」をクリック。
「プロパティの詳細」をクリック。
ここにプロパティIDが出てくるのでGASのスクリプトプロパティに登録します。スクリプトプロパティへの登録の仕方はこちらの記事に詳しく記載しているので参考にしてください。今回はGA4_TEST_ID
という名前でキーを登録しました。
GASを書いていく
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('AnalyticsData'); // データを保存するシート名
もうおなじみになってきましたね。SpreadsheetApp
を使ってスクリプトが実行されているスプレッドシートを取得し、getSheetByName
メソッドを使って特定のシートAnalyticsData
を取得します。
const metrics = [{ name: 'eventCount' }];
const dimensions = [{ name: 'pagePath' }, { name: 'eventName' }];
GA4から取得したい指標metrics
やディメンションdimensions
を設定します。
const timezone = 'JST';
const today = new Date();
today.setDate(today.getDate() - 1); // 前日の日付をセット
const formattedEndDate = Utilities.formatDate(today, timezone, 'yyyy-MM-dd');
const dateRanges = [{ startDate: formattedEndDate, endDate: formattedEndDate }];
ここで、today.setDate(today.getDate() - 1)
をして前日の日付に変更しています。そして、formattedEndDate
にその日付を書き込んでいます。dateRanges
配列には、startDate
とendDate
を前日の日付に設定ます。これにより、前日のデータが取得できるようになります。
const request = {
dimensions: dimensions,
metrics: metrics,
dateRanges: dateRanges,
};
上記で定義した変数を用いて、Google Analyticsに送信するリクエストを設定します。他にも指定したいフィルタなどがあればここで指定します。
const PROPERTY_ID = PropertiesService.getScriptProperties().getProperty('GA4_TEST_ID');
try {
const response = AnalyticsData.Properties.runReport(request, 'properties/' + PROPERTY_ID);
// レポートの取得とエラーチェック
// ...
} catch (error) {
// エラーハンドリング
// ...
}
スクリプトプロパティに登録したGA4のIDをPropertiesService.getScriptProperties().getProperty()
をつかって取得します。そしてAnalyticsData.Properties.runReport()
を使ってGA4からデータを取得します。取得したデータが正常かどうかを確認し、エラーがあればエラーハンドリングを行っています。response
オブジェクトには、メトリクスやディメンションのデータが含まれています。
const data = response.rows.map(row => {
const dimensionValues = row.dimensionValues.map(dimension => dimension.value);
const metricValues = row.metricValues.map(metric => metric.value);
return dimensionValues.concat(metricValues);
});
const header = response.dimensionHeaders.map(header => header.name).concat(response.metricHeaders.map(header => header.name));
data.unshift(header);
sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
取得したresponse
をシートに書き込んでいきます。response.rows.map()
は、取得したデータの各行に対して処理を行います。行ごとのデータをループし、ディメンションとメトリックの値を取り出して新しい配列data
に格納し定期ます。
data.unshift(header)
は、取得したヘッダー情報をdata
配列の先頭に追加します。これはシートに書き込むデータの先頭にヘッダーを追加するためです。
sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
で、シート上の指定された範囲に取得したデータを書き込みます。setValues()
メソッドを使用して、配列data
のデータを一括して書き込むため1行ずつ書き込む場合に比べて処理速度が早くなります。
完成品がこちら
GASのコード
function writeDataFromGA4() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('AnalyticsData'); // データを保存するシート名
const metrics = [{ name: 'eventCount' }];
const dimensions = [{ name: 'pagePath' }, { name: 'eventName' }];
const timezone = 'JST';
const today = new Date();
today.setDate(today.getDate() - 1); // 前日の日付をセット
const formattedEndDate = Utilities.formatDate(today, timezone, 'yyyy-MM-dd');
const dateRanges = [{ startDate: formattedEndDate, endDate: formattedEndDate }];
const request = {
dimensions: dimensions,
metrics: metrics,
dateRanges: dateRanges,
};
const PROPERTY_ID = PropertiesService.getScriptProperties().getProperty('GA4_TEST_ID');
try {
const response = AnalyticsData.Properties.runReport(request, 'properties/' + PROPERTY_ID);
if (!response.hasOwnProperty('dimensionHeaders') || !response.hasOwnProperty('metricHeaders') || !response.hasOwnProperty('rows')) {
Logger.log('データが取得できませんでした。');
return;
}
const data = response.rows.map(row => {
const dimensionValues = row.dimensionValues.map(dimension => dimension.value);
const metricValues = row.metricValues.map(metric => metric.value);
return dimensionValues.concat(metricValues);
});
const header = response.dimensionHeaders.map(header => header.name).concat(response.metricHeaders.map(header => header.name));
data.unshift(header);
sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
} catch (error) {
Logger.log(`error!: ${error}`);
}
}
実行結果
このようにGA4から必要な値をとってきてスプレッドシートに記入することができました!
最後に
今回はGoogle Analytics Data APIを利用してデータを取得し、取得した結果をスプレッドシートに記録していく方法についてみていきました。
GA4の画面上で見れる数字でも定点的に見るものは自動的にシートに転記するようにしておいたり閾値を検知したらSlackに通知したい場合などはGASでスクリプトを組むことで業務が効率化出来るかもしれません!