7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

この記事は「Ateam LifeDesign Advent Calendar 2023」で完走賞を狙って25記事書いているうちの13日目の記事です。今年も完走目指して頑張るぞ!

Google Analytics Data API

今回はGoogle Analytics Data APIを利用してデータを取得し、取得した結果をスプレッドシートに記録していく方法についてみていきます。

作るもの

GA4からデータを取得し、メトリクス(eventCount)とディメンション(pagePatheventName)を前日の日付範囲で取得し、取得したデータをスプレッドシートに記録するスクリプトを作っていきます。

準備

Google Analytics Data APIのサービスを追加

まずはGASでGoogle Analytics Data APIを使うためにサービスの登録をしていきます。

スクリーンショット 2023-12-10 21.40.10.png

ここの「サービス」をクリック。

スクリーンショット 2023-12-10 21.41.21.png

サービスリストの中から「Google Analytics Data API」を選択して「追加」をクリック。この記事を書いている現時点おいてはがv1betaが最新となっているためこのバージョンを選択していますが、今後新たなバージョンが出ることもあると思うので適切なバージョンを選択してください。

GA4のプロパティIDを取得

スクリーンショット 2023-12-10 21.44.17.png

GA4の管理画面から「管理」をクリック。

スクリーンショット 2023-12-10 21.45.50.png

「プロパティの詳細」をクリック。

スクリーンショット 2023-12-10 21.47.01.png

ここにプロパティ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配列には、startDateendDateを前日の日付に設定ます。これにより、前日のデータが取得できるようになります。

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}`);
  }
}

実行結果

スクリーンショット 2023-12-10 22.38.11.png

このようにGA4から必要な値をとってきてスプレッドシートに記入することができました!

最後に

今回はGoogle Analytics Data APIを利用してデータを取得し、取得した結果をスプレッドシートに記録していく方法についてみていきました。
GA4の画面上で見れる数字でも定点的に見るものは自動的にシートに転記するようにしておいたり閾値を検知したらSlackに通知したい場合などはGASでスクリプトを組むことで業務が効率化出来るかもしれません!

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?