Ruby で Google Analytics 4 (GA4) のデータを API で取得する方法

前提

2023年3月17日(金)現在の話です。

API の公式ドキュメント

developers.google.com

結論

どの gem を使うか?

google/analytics/data/v1beta です。

API の認証はどうするか?

GCP のサービスアカウントを作成し、認証用の JSON ファイルである credentials.json を準備しておいてください*1。下記のような形式のものです。

{
    "type": "service_account",
    "project_id": "foobar-project",
    "private_key_id": "12345abcdef",
    "private_key": "-----BEGIN PRIVATE KEY-----\nabcdefg=\n-----END PRIVATE KEY-----\n",
    "client_email": "hoge@fuga.iam.gserviceaccount.com",
    "client_id": "12345",
    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
    "token_uri": "https://oauth2.googleapis.com/token",
    "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
    "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/hoge%40fuga.iam.gserviceaccount.com"
  }

GA4 へのアクセス権の設定はどうするか?

GA4 の設定画面の「プロパティ」の列から、「プロパティのアクセス管理」を選びます。

出てきたアカウント一覧画面にて、上記の「GCP のサービスアカウント」のメールアドレス*2を「閲覧者」として登録します。

他に準備すべきことは?

  • 取得したい GA4 のプロパティの「プロパティID」を準備しておきます
  • GCP の「API とサービス」から「Google Analytics Data API」を有効にしておきます

具体的なコードは?

  • 以下のサンプルコードで最低限の動作(レスポンスの取得)ができます
  • 認証は環境変数 ANALYTICS_DATA_CREDENTIALS*3 に JSON ファイル の場所を指定するだけで行なえます
    • サンプルコード内では ENV に直接指定するという荒業を行っていますが、dotenvdirenv を使いましょう
  • 取得したい GA4 の「プロパティID」を所定の場所に埋め込みます
  • 「ディメンション」や「指標(メトリクス)」、「日付範囲」については本題ではないので省略します。
    • ディメンションと指標に関するドキュメントは こちら
require 'google/analytics/data/v1beta'

ENV['ANALYTICS_DATA_CREDENTIALS'] = 'credentials.json'
client = Google::Analytics::Data::V1beta::AnalyticsData::Client.new

property = 'properties/プロパティID'
dimensions = [
  Google::Analytics::Data::V1beta::Dimension.new(name: 'pagePathPlusQueryString'),
]
# 戻り値の配列は以下で指定した順番になる
metrics = [
  Google::Analytics::Data::V1beta::Metric.new(name: 'screenPageViews'),
  Google::Analytics::Data::V1beta::Metric.new(name: 'screenPageViewsPerSession'),
]
yesterday = (Date.today - 1).strftime('%Y-%m-%d')
date_ranges = [
  Google::Analytics::Data::V1beta::DateRange.new(start_date: yesterday, end_date: yesterday),
]
order_bys = [
  Google::Analytics::Data::V1beta::OrderBy.new(
    desc: true,
    metric: Google::Analytics::Data::V1beta::OrderBy::MetricOrderBy.new(
      metric_name: 'screenPageViews'
    )
  ),
]

request = Google::Analytics::Data::V1beta::RunReportRequest.new(
  property: property ,
  dimensions: dimensions,
  metrics: metrics,
  order_bys: order_bys,
  date_ranges: date_ranges
)

response = client.run_report(request)

# 得られた response に対しての操作:
# response.rows で結果の「行」の集合が配列で得られる
# その配列の個々の要素である row に対し、row.metric_values と row.dimension_values で具体値の配列を取得する
# row.metric_values や row.dimension_values の要素に対し value メソッドを実行することで値が取得できる
# つまり、たとえば、以下のようにして 1行目 の screenPageViewsPerSession の値を取得できる
# response.rows[0].metric_values[1].value

補足

  • google-analytics-data-v1alpha のときには Google::Analytics::Data::V1beta::RunReportRequest.new のキーワード引数に entity: というものがあり、それにより GA4 の プロパティID を指定していましたが、beta になって property: に変わっています
    • v1alpha 時代の解説記事を v1beta で動かそうとすると、この部分でエラーになることがあります
  • 現時点でも beta なので、今後も変更の可能性が十分に考えられ、UA が停止になって一定の期間が経過するまでは変更は覚悟しておいた方はよいと考えてます
  • Ruby のドキュメント はきちんと整備されており、また、そもそも複雑なことをやってはいないので、半日ぐらいかけて手を動かしながらがっつり一度習得すれば、多少の変更があっても今後ずっと使っていけるのではないかと思います

*1:ファイル名やファイルを置く場所は任意ですが、後述のサンプルコードで用いるために credentials.json と仮定しています

*2:hoge@fuga.iam.gserviceaccount.com

*3:予約語

Powered by はてなブログ