Node.jsでGoogle Analytics Data APIをローカルで実行してレポートデータをCSV化する方法

Google Analytics Data API について

Google Analytics Data API はGoogle Analytics v4 (GA4)のレポートデータにプログラムでアクセスしてさまざまなデータの取得が可能です。

今回は日毎のページビュー数とユニークユーザー数を取得して、CSVファイルに保存する処理を行うプログラムをNode.jsで作成しました。

作成するプログラムについて

  • Google Analyticsの指定したプロパティから日毎のページビュー数とユニークユーザー数を取得
  • 取得するのは1週間前から前日まで
  • すでに取得済みの日付はCSVには書き込まない
  • CSVファイルは初回は新規作成を行い、2回目以降は追記を行う
  • CSVファイルの最終行は空行にしない

Google Analytics Data API の準備

こちらのページを参考にして Google Analytics Data API の有効化、プライベートキー情報JSONの取得し、JSONファイルに記述のあるメールアドレスをサービス アカウントGoogle アナリティクス 4 プロパティにユーザーを追加します。(ステップ1〜ステップ3)

ただし、サービスアカウントの認証情報の環境変数への設定は.envファイルで行うため、この時点では行いません。

Node.js の準備

Node.js のインストールに関してはここでは詳しく記述しません。必要な方は以下を参照してください。


標準以外で追加で導入する必要のあるモジュールはdotenvとGoogle Analytics Clientライブラリになります。インストールは以下のコマンドになります。
				
					npm install dotenv
npm install @google-analytics/data
				
			
サービスアカウントの認証情報はプログラムと同じディレクトリに「.env」というファイルを作成してそこにプライベートキー情報JSONファイルのパスを記述します。
				
					GOOGLE_APPLICATION_CREDENTIALS=./Quickstart-xxxxxxxxxx.json
				
			

プログラム

app.js として作成しました。
				
					
require('dotenv').config(); // .envファイルを環境変数として読み込み
const fs = require('fs');

// 保存ファイル名
const fileName = 'report.csv';
// レポートのプロパティID
const propertyId = '000000000';

// Google Analytics Data API client library 読み込み
const {BetaAnalyticsDataClient} = require('@google-analytics/data');

// AnalyticsDataClientの初期化
const analyticsDataClient = new BetaAnalyticsDataClient();

// レポートの実行
async function runReport() {
  const [response] = await analyticsDataClient.runReport({
    property: `properties/${propertyId}`,
    dateRanges: [
      {
        startDate: '7daysAgo', // 念の為1週間前から取得する
        endDate: 'yesterday', // 前日まで取得
      },
    ],
    dimensions: [ // ディメンジョンの指定
      {
        name: 'date',
      },
    ],
    metrics: [ // メトリックスの指定
      {
        name: 'activeUsers', // ユニークユーザー
      },
      {
        name: 'screenPageViews', // 全体のページビュー
      }
    ],
  });

  // レポートデータの抽出
  let reportData = [];
  for (const row of response.rows) {
    reportData.push([row.dimensionValues[0].value].concat(row.metricValues.map(value => value.value)));
  }
  // 順番が順不同になっているので日付順に並べ替え
  reportData = reportData.sort((a, b) => a[0] - b[0]);

  // 保存済みのファイルがあれば読み込む
  const text = fs.existsSync(fileName) ? fs.readFileSync(fileName).toString() : '';
  // 保存済みの最新日の取得
  let lastDate = '0';
  if (text) {
    const lastLine = text.split('\r\n').pop();
    lastDate = lastLine.split(',')[0].replaceAll('-', '');
    if (isNaN(lastDate)) {
      lastDate = '0';
    }
  }
  if (!text) {
    // 保存済みファイルがない場合はヘッダーを書き込み
    const header = [response.dimensionHeaders[0].name].concat(response.metricHeaders.map(header => header.name)).join(',');
    fs.writeFileSync(fileName, header);
  }
  // 書き込み用データ
  const appendLines = [''];
  for (const data of reportData) {
    const dateValue = data[0];
    // 保存済みの最新日より新しい日付のみ追記する
    if (dateValue > lastDate) {
      data[0] = formatDate(dateValue);;
      appendLines.push(data.join(','));
    }
  }
  const appendText = appendLines.join('\r\n');
  if (appendText) {
    fs.appendFileSync(fileName, appendText);
  }
}

// 日付を"XXXX-XX-XX"形式に変換
function formatDate(value) {
  return [value.substring(0, 4), value.substring(4, 6), value.substring(6)].join('-');
}

runReport();

				
			

ファイル構成

				
					.env
Quickstart-xxxxxxxxxx.json
app.js
				
			

プログラム実行

				
					node app.js
				
			

生成されたcsvファイルの例

				
					date,activeUsers,screenPageViews
2024-07-11,248,391
2024-07-12,164,224
2024-07-13,421,715
2024-07-14,66,123
2024-07-15,84,104
2024-07-16,100,224
2024-07-17,320,509
				
			

最後に

QuickStartをベースに簡単なプログラムを作成しまてみました。

もっと複雑なディメンジョンやメトリックスの組み合わせをプログラムを使用して解析することや別のツールなどと連携することも可能です。

紹介したプログラムが何かの参考になれば幸いです。


ご興味がありましたらお問い合わせください
 
この記事をシェアする :