GoogleアナリティクスのAPIをNode.jsから触る


こんにちは、この記事は[岩手県立大学アドベントカレンダー](https://qiita.com/advent-calendar/2021/ipu)12日目の記事です。

先日Node-RED向けにGoogle Analyticsのノードを自作した記事を書きました。

https://qiita.com/n0bisuke/items/f5b3136e74d44ec2e4e1

この中で使ってる元の実装の紹介をしてみます。

## Google Analyticsのバージョン - GA4

[Google Analytics Data API (GA4)](https://developers.google.com/analytics/devguides/reporting/data/v1)のデモを触っていくのですが、Google Analyticsは従来のユニバーサルアナリティクス(UA)とGoogle アナリティクス 4(GA4)があります。

GA4の方が新しいバージョンって認識で問題なさそうな気がします。

## Google Analytics Data APIのサンプルを触る

### クレデンシャルとAPI利用の準備

こちらの[クイックスタート](https://developers.google.com/analytics/devguides/reporting/data/v1/quickstart-client-libraries)を進めます。

> ![スクリーンショット 2021-12-13 14.46.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/a269540d-e14d-846b-d663-e960dc7c375e.png "スクリーンショット 2021-12-13 14.46.20.png")

`Enable the Google Analytics Data API v1`を選択して進めるとJSONファイルをDLできるので、`credentials.json`という名前にします。

また、このjsonの中に`client_email`というフィールドの中に`quickstart@PROJECT-ID.iam.gserviceaccount.com`のようなメールアドレスが記載してあるので、そのメールアドレスをGoogle Analyticsの管理ユーザーに追加します。

追加の際にはアナリスト的なロールにします。

### サンプルの実装

```bash
npm i @google-analytics/data
```

これでSDKのインストールができます。

> https://www.npmjs.com/package/@google-analytics/data

以下のサンプルは、クイックスタートのコードを元にちょっと変えました。

`propertyId`の箇所にGA4プロパティのプロパティIDを入れます。

また、先ほどDLしてリネームした`credentials.json`はapp.jsなどの実行するファイルと同じ階層に設定しています。

> ![スクリーンショット 2021-12-13 14.55.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/4d4c97a8-56d6-c6d5-7b9f-4ba6e1999aa5.png "スクリーンショット 2021-12-13 14.55.04.png")


```app.js
  /**
   * TODO(developer): Uncomment this variable and replace with your
   *   Google Analytics 4 property ID before running the sample.
   */
  const propertyId = '000000000';

  process.env.GOOGLE_APPLICATION_CREDENTIALS = `./credentials.json`;

  // Imports the Google Analytics Data API client library.
  const {BetaAnalyticsDataClient} = require('@google-analytics/data');

  // Using a default constructor instructs the client to use the credentials
  // specified in GOOGLE_APPLICATION_CREDENTIALS environment variable.
  const analyticsDataClient = new BetaAnalyticsDataClient();

  // Runs a simple report.
  async function runReport() {
    const [response] = await analyticsDataClient.runReport({
      property: `properties/${propertyId}`,
      dateRanges: [
        {
          startDate: '2021-01-01',
          endDate: 'today',
        },
      ],
      dimensions: [
        {
          name: 'city',
        },
      ],
      metrics: [
        {
          name: 'activeUsers',
        },
      ],
    });

    console.log('Report result:');
    // console.log(response);
    response.rows.forEach(row => {
      console.log(row.dimensionValues[0], row.metricValues[0]);
    });
  }

  runReport();
```

実行してみます。

```bash
$ node app.js
Report result:
{ value: 'Osaka', oneValue: 'value' } { value: '433', oneValue: 'value' }
{ value: 'Yokohama', oneValue: 'value' } { value: '349', oneValue: 'value' }
{ value: 'Minato City', oneValue: 'value' } { value: '313', oneValue: 'value' }
{ value: 'Chiyoda City', oneValue: 'value' } { value: '281', oneValue: 'value' }
{ value: '(not set)', oneValue: 'value' } { value: '229', oneValue: 'value' }
{ value: 'Shinjuku City', oneValue: 'value' } { value: '225', oneValue: 'value' }
{ value: 'Setagaya City', oneValue: 'value' } { value: '147', oneValue: 'value' }
{ value: 'Nagoya', oneValue: 'value' } { value: '138', oneValue: 'value' }
{ value: 'Shibuya City', oneValue: 'value' } { value: '137', oneValue: 'value' }
{ value: 'Chuo City', oneValue: 'value' } { value: '136', oneValue: 'value' }

・
・
・
・

```

ということで **市町村ごとのアクセス数**が表示されました。

```json
      dimensions: [
        {
          name: 'city',
        },
      ],
```

この辺のcityの指定が効いてそうですね。

他の指定の仕方はいまいちGAの仕様を分かってないので調べてみたいと思います。

## 所感

クイックスタートを見ていくとクレデンシャルのファイルのパスを環境変数に指定する形になってます

```js
  process.env.GOOGLE_APPLICATION_CREDENTIALS = `./credentials.json`;
```

（クイックスタートだとexportしてましたね。）

Node-REDのノードを作るときなどはノードを利用する人にクレデンシャル情報をセットしてもらいたい気がするので

```json
process.env.CREDENTIALS = {
  "type": "service_account",
  "project_id": "xxxxxxxxxxxxxxxxxxxxxxxx",
  "private_key_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "private_key": "-----BEGIN PRIVATE KEY-----"
  省略
}
```

こういう指定とかで利用できるようにSDKの仕様が出来てると良い気もました。

もしかしたら使い方見つけられてない可能性も高いですが


Google AnalyticsのAPIはSDKがちゃんとしてるので使うことは簡単に出来そうな印象です。
ただGAの仕様を分かってないとちゃんとデータを抜き出すことが出来ない気もするのでGAの勉強も必要ですね。

それでは :)