【UA⇒GA4】GoogleAnalytics連携の代わりに、GASを使ってGoogle Analytics Data APIを叩いてみた

## はじめに

はじめまして、エンジニア歴半年のGopherくんLoverなペーペーエンジニアです。

今回はGoogle Analytics Data APIのお話です。
常々、GAのデータをスプシに落としてこねくり回しているのですが、Universal Analyticsの終了(2023年7月31日)に伴い、非常に便利であったスプレッドシートの拡張機能であるGoogle Analytics連携が使用できなくなる…とのことで…

このままだと数値共有ができなくなる…！
かといってGA4の使い方を一からレクチャーするのもしんどい…！

とあたふたしていたわけですが…

昨年からGA4のAPIがGASで簡単に叩けるようになったらしいので、それで数値を取得することにしてみました。

今回は、そこに関して実装した内容なんかを書き連ねていこうと思います。
なお、細かいGA4に関する内容などは説明を省略しますので、そこのところはご容赦ください。

#### ～本日の流れ～
>**⓪導入**
>**①基本的な取得**
>**②フィルタについて**
>**③まとめ**

## ⓪導入
#### 【Google Analytics Data APIの追加】

GoogleAppsScriptの画面を開いて、サービスの追加の部分から、``Google Analytics Data API``を選択します。
versionは``v1beta``、identifierは``AnalyticsData``と出ると思いますので、そのままで問題ないです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711450/45a1281c-390b-6e1a-6753-4eccea30b2f8.png" width="800">

## ①基本的な取得
#### i.【サンプルコードについて】
公式ドキュメントにサンプルコードがあるので、今回はそれをベースにします。

https://developers.google.com/apps-script/advanced/analyticsdata?hl=en

下記に一旦全文を記載します。
見やすさのために日本語化、適宜改行・コメントを入れています。
(※日本語訳は適当です。ご容赦ください。)

【サンプルコード】
```javascript
/**
 * GA4からレポートを取得し、新しいスプレッドシートとして出力。
 */
function runReport() {
  /**
   * TODO(開発者向け): サンプルを実行する前に、下記の変数を自身のGA4のプロパティIDに変更してください。
   */
  const propertyId = 'GA4のプロパティID';

  try {
    // 指標(Metrics)の設定(今回はアクティブユーザー数)
    const metric = AnalyticsData.newMetric();
    metric.name = 'activeUsers';

    // ディメンション(Dimensions)の設定(今回は都市)
    const dimension = AnalyticsData.newDimension();
    dimension.name = 'city';

    // データ範囲(日付)の設定(今回は2020/03/31から今日まで) ※執筆タイミングは2023/03/02
    const dateRange = AnalyticsData.newDateRange();
    dateRange.startDate = '2020-03-31';
    dateRange.endDate = 'today';

    // レポートに上記の条件を設定し、リクエストを作成
    const request = AnalyticsData.newRunReportRequest();
    request.dimensions = [dimension];
    request.metrics = [metric];
    request.dateRanges = dateRange;

    // レポートを実行
    const report = AnalyticsData.Properties.runReport(request,
        'properties/' + propertyId);
    if (!report.rows) {
      console.log('No rows returned.');
      return;
    }

    // スプレッドシートを新しく作成
    const spreadsheet = SpreadsheetApp.create('Google Analytics Report');
    const sheet = spreadsheet.getActiveSheet();

    // ヘッダーを取得
    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);

    // 結果を取得
    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);

    console.log('Report spreadsheet created: %s',
        spreadsheet.getUrl());
  } catch (e) {
    // TODO (開発者) - Exception処理を記述
    console.log('Failed with error: %s', e.error);
  }
}
```

では、各項目についてです。

#### ii.プロパティIDの設定
```javascript
  /**
   * TODO(開発者向け): サンプルを実行する前に、下記の変数を自身のGA4のプロパティIDに変更してください。
   */
  const propertyId = 'GA4のプロパティID';
```
ここの部分には取得したいGA4プロパティIDを設定します。
ものすごく分かりにくいですが、矢印のところです…（笑）
![コメント 2023-03-02 180135.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711450/1e2d702a-ef6f-1451-7f1e-8873c3f9091a.png)

#### iii.指標の設定

```javascript
  // 指標(Metrics)の設定(今回はアクティブユーザー数)
  const metric = AnalyticsData.newMetric();
  metric.name = 'activeUsers';
```
指標には取得したい数値などを設定します。(セッション数とかユーザー数とか…)
表記に関しては[こちら](https://developers.google.com/analytics/devguides/reporting/data/v1/api-schema?hl=en)を参照してください。

複数設定したい場合は、複数記載して配列として設定します。(※配列に関しては後述)

```javascript
  // 指標としてユーザー数とセッション数を設定
  const metric1 = AnalyticsData.newMetric();
  metric.name = 'activeUsers';
  
  const metric2 = AnalyticsData.newMetric();
  metric.name = 'sessions';
```

よく使いそうな指標は以下に記載しておきます。

| 指標 | 表記 |
|:-:|:-:|
| セッション数 | sessions |
| ページビュー数 | screenPageViews |
| ユーザー数 | activeUsers |
| イベント数 | eventCount |

#### iv.ディメンションの設定
```javascript
  // ディメンション(Dimensions)の設定(今回は都市)
  const dimension = AnalyticsData.newDimension();
  dimension.name = 'city';
```
ディメンションも指標と同様です。
表記に関しても指標と同様に[こちら](https://developers.google.com/analytics/devguides/reporting/data/v1/api-schema?hl=en)を参照してください。

複数設定する場合も指標と同様に配列にします。(※配列に関しては後述)
```javascript
  // ディメンションとして都市とページパスを設定
  const dimension = AnalyticsData.newDimension();
  dimension.name = 'city';

  const dimension = AnalyticsData.newDimension();
  dimension.name = 'pagePath';
```

よく使いそうなディメンションも以下に記載しておきます。

| 指標 | 表記 |
|:-:|:-:|
| ページパス | pagePath |
| 参照元/メディア | sessionSourceMedium |
| イベント ラベル | customEvent:event_label |
| キャンペーン | campaignName |
| デバイスカテゴリ | deviceCategory |

#### v.データ範囲の設定

```javascript
  // データ範囲(日付)の設定(今回は2020/03/31から今日まで) ※執筆タイミングは2023/03/02
  const dateRange = AnalyticsData.newDateRange();
  dateRange.startDate = '2020-03-31';
  dateRange.endDate = 'today';
```

データ範囲はお好きな期間を設定してください。
GASで実行する場合は、データが大きすぎると完了できなくなる可能性があります。

#### vi.レポートを実行(指標・ディメンションの配列について)

```javascript
  // レポートに上記の条件を設定し、リクエストを作成
  const request = AnalyticsData.newRunReportRequest();
  request.dimensions = [dimension];
  request.metrics = [metric];
  request.dateRanges = dateRange;

  // レポートを実行
  const report = AnalyticsData.Properties.runReport(request, 'properties/' + propertyId);
  if (!report.rows) {
    console.log('No rows returned.');
    return;
  }
```

設定が終わったら、それらを格納してレポートのリクエストを作成します。
指標・ディメンション共にここで配列として複数追加が可能なので、複数設定する場合は、

```javascript
  request.dimensions = [dimension1, dimension2];
  request.metrics = [metric1, metric2];
```

みたいにしてあげてください。
実行後は、スプシに書き出すだけになるので、今回は割愛します。

## ②フィルタについて

基本的に指標とディメンションを設定しただけで数値を取得することは少ないと思います。
ページパスで絞ったり、キャンペーンで絞ったりと…

そんな時に必要なのがフィルタですが、こちらも設定できます。

```javascript
  // フィルタ条件を配列で格納する変数を定義
  let dimensionfilter = AnalyticsData.newFilterExpression();
  dimensionfilter.andGroup =  AnalyticsData.newFilterExpressionList();
  dimensionfilter.andGroup.expressions = [];

  // フィルタを作成
  let filterExpression = AnalyticsData.newFilterExpression();
  filterExpression.filter = AnalyticsData.newFilter();

  // 作成したフィルタに条件として「ページパスに"/********/"が含まれる」を設定
  filterExpression.filter.fieldName = 'pagePath';
  filterExpression.filter.stringFilter = AnalyticsData.newStringFilter();
  filterExpression.filter.stringFilter.value = '/********/';
  filterExpression.filter.stringFilter.matchType = 'CONTAINS';
  dimensionfilter.andGroup.expressions.push(filterExpression);
```

ページパスを設定する例を記載してみました。
同じような形で様々なフィルターを設定することが可能です。
複数フィルタの場合も同じように追加できます。

今回はページパスだったので、``newStringFilter();``を使用しましたが、数値などの場合は``newNumericFilter();``を使用することが可能です。
例えば、セッション数が5000以上という条件の場合は以下のようになります。

```javascript
  // フィルタを作成
  let filterExpression = AnalyticsData.newFilterExpression();
  filterExpression.filter = AnalyticsData.newFilter();
    
  // 作成したフィルタに条件として「セッション数が5000以上」を設定
  filterExpression.filter.fieldName = 'sessions';
  filterExpression.filter.numericFilter = AnalyticsData.newNumericFilter();
  filterExpression.filter.numericFilter.operation = 'GREATER_THAN';
  let numericValue = AnalyticsData.newNumericValue();
  numericValue.doubleValue = 5000;
  filterExpression.filter.numericFilter.value = numericValue;
  metricfilter.andGroup.expressions.push(filterExpression);
```

フィルタの一致条件に関しては、こちらに記載があります。

https://cloud.google.com/ruby/docs/reference/google-analytics-data-v1beta/latest/Google-Analytics-Data-V1beta-Filter-StringFilter-MatchType

【例】
| 指標 | 表記 |
|:-:|:-:|
| EXACT | ～と完全一致 |
| BEGINS_WITH | ～で始まる |
| CONTAINS | ～が含まれる |
| FULL_REGEXP | 正規表現に一致 |

## ③まとめ

以上、「Google Analytics Data APIを叩いてみた」でした。
書き方に慣れてしまえば設定自体はそこまで難易度が高くなさそうなので、開発者でなくても触ることはできそうなイメージでした。

慣れないうちはGA4でレポートを作成してみてから見比べて書いていくの良さそうです。

英語ではありますが、公式ドキュメントも手厚いので、ぜひ見てみてください。

https://cloud.google.com/ruby/docs/reference/google-analytics-data-v1beta/latest/Google-Analytics-Data