GASでGoogle Analytics Data APIを使う方法

# はじめに
この記事は「[Ateam LifeDesign Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ateam-life-design)」で完走賞を狙って25記事書いているうちの13日目の記事です。今年も完走目指して頑張るぞ！

# Google Analytics Data API
今回は[Google Analytics Data API](https://developers.google.com/analytics/devguides/reporting/data/v1?hl=ja)を利用してデータを取得し、取得した結果をスプレッドシートに記録していく方法についてみていきます。

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

# 準備

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

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

![スクリーンショット 2023-12-10 21.40.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/345c7fef-b009-8854-b26d-17a1e3107896.png)

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

![スクリーンショット 2023-12-10 21.41.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/2abc1fd3-fd19-4c9d-b551-ca478c9bbf3c.png)

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

## GA4のプロパティIDを取得

![スクリーンショット 2023-12-10 21.44.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/c77873c3-2c1e-30ef-fd15-b3e8bf692751.png)

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

![スクリーンショット 2023-12-10 21.45.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/7858544d-4ed6-cf1f-cfda-a49e8081b11f.png)

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

![スクリーンショット 2023-12-10 21.47.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/8f1b3b07-9ec9-0af1-f554-0cfad874c3dc.png)

ここにプロパティIDが出てくるのでGASのスクリプトプロパティに登録します。スクリプトプロパティへの登録の仕方は[こちら](https://qiita.com/kakakaori830/items/f3c1a1539b875d933b7a#webhook-url%E3%82%92%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%81%AB%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B)の記事に詳しく記載しているので参考にしてください。今回は`GA4_TEST_ID`という名前でキーを登録しました。


# GASを書いていく

```javascript
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('AnalyticsData'); // データを保存するシート名
  ```
もうおなじみになってきましたね。`SpreadsheetApp`を使ってスクリプトが実行されているスプレッドシートを取得し、`getSheetByName`メソッドを使って特定のシート`AnalyticsData`を取得します。  

```javascript
const metrics = [{ name: 'eventCount' }];
const dimensions = [{ name: 'pagePath' }, { name: 'eventName' }];
```

GA4から取得したい指標`metrics`やディメンション`dimensions`を設定します。

```javascript
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`を前日の日付に設定ます。これにより、前日のデータが取得できるようになります。

```javascript
const request = {
  dimensions: dimensions,
  metrics: metrics,
  dateRanges: dateRanges,
};
```
上記で定義した変数を用いて、Google Analyticsに送信するリクエストを設定します。他にも指定したいフィルタなどがあればここで指定します。

```javascript
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`オブジェクトには、メトリクスやディメンションのデータが含まれています。

```javascript
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のコード
```javascript
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/522dc9e1-c932-17cf-e135-d899b926d56b.png)

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

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