目次
GA4 のプロパティのアクセス管理から、サービスアカウントのメールアドレス(*.iam.gserviceaccount.com)を追加しようとして「このメールアドレスは Google アカウントと一致しません」というエラーが出るケースがあります。サービスアカウントは正しく作っているのに弾かれるという、なかなか原因が分かりにくいケースです。これは GA4 のユーザー追加 UI 側の制約が原因で、Google Analytics Admin API を直接叩いて登録する ことで回避できます。この記事では切り分けと、API 経由での登録手順をまとめます。
このエラーが出る状況
サービスアカウントは Google Cloud で正しく作成済み、JSON キーも手元にある、GA4 プロパティの管理者権限も自分が持っている、それなのにプロパティのアクセス管理 UI でメールアドレスを入力すると弾かれる、という状態です。
私の場合、切り分けで次が確認できました。
- メールアドレスは JSON キーの
client_emailと1文字違わず完全一致 - サービスアカウント自体は別途叩いた GA4 Data API でメタ情報取得まで成功(つまり認証としては正常に動作)
- 普通の Gmail アドレスを試しに追加すると、エラーなく通る
つまり サービスアカウント形式 (*.iam.gserviceaccount.com) のメールアドレスだけが UI で弾かれている、という症状です。
試したけどダメだったこと
定番の対処法をひととおり試しました。今回のケースではこれらでは解消しませんでした。
「メールでこのユーザーに通知する」のチェックを外す
サービスアカウントは Gmail を持たないため、通知を有効にしておくと弾かれるという報告があります。ただし今回はチェックを外してもエラーは出続けました。
Cloud Resource Manager API の有効化
GA4 が裏でこの API を呼んでサービスアカウントの実在を検証する、という事例があります。GCP のライブラリから有効化して10分以上置いても、UI 側のエラーは変わりませんでした。
シークレットウィンドウ・別ブラウザで試す
ブラウザの拡張機能や Cookie が干渉している場合があるので、まず試す価値はあります。今回はシークレットでも別ブラウザでも同じエラーが出ました。
解決策: GA4 Admin API で直接登録する
GA4 のユーザー管理は API 経由でも操作できます。UI が弾く相手でも、API なら通ります[1]。手順は次のとおりです。
- OAuth Playground で必要なスコープのアクセストークンを取得する
- 自分の GA4 プロパティ ID を確認する
- 取得したトークンとプロパティ ID で API に POST する
- サービスアカウントから実際にデータを取って動作確認する
アクセストークンを取得する
OAuth Playground を開きます。これは Google が提供する OAuth 認証の動作確認ツールで、ブラウザ上で短時間有効なアクセストークンを発行できます[2]。
左カラム「Step 1 - Select & authorize APIs」の最下部に「Input your own scopes」という入力欄があります。ここに次のスコープを貼り付けます。
https://www.googleapis.com/auth/analytics.manage.users
「Authorize APIs」を押し、GA4 の管理者権限を持つ Google アカウントでログインして許可します。次の Step 2 で「Exchange authorization code for tokens」を押すと、Access token 欄に ya29.… で始まる文字列が表示されます。これを控えます。
プロパティIDを確認する
GA4 のレポート画面を開いた状態で、ブラウザのアドレスバーを見ます。
https://analytics.google.com/analytics/web/?authuser=0#/a148580905p413714906/...
↑アカウント↑プロパティ
p の直後の9〜10桁の数字がプロパティIDです。上の例では 413714906。GA4 → 管理(歯車)→ 右カラムの「プロパティ設定」を開いても、画面上部に「プロパティID」として表示されています。
APIに POST してサービスアカウントを登録する
ターミナルで次のコマンドを実行します。<TOKEN> と <PROPERTY_ID> と <SA_EMAIL> を自分の値に置き換えてください。
TOKEN="ya29.…取得したアクセストークン…"
PROPERTY_ID="413714906"
SA_EMAIL="[email protected]"
curl -X POST \
"https://analyticsadmin.googleapis.com/v1alpha/properties/$PROPERTY_ID/accessBindings" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"user\": \"$SA_EMAIL\",
\"roles\": [\"predefinedRoles/viewer\"]
}"
成功すると次のようなレスポンスが返ります。
{
"name": "properties/413714906/accessBindings/AYVX2…",
"user": "[email protected]",
"roles": ["predefinedRoles/viewer"]
}
注意点として、APIは v1beta ではなく v1alpha を使う ことです。accessBindings リソースは v1beta にはまだ存在せず、v1beta で叩くと 404 を返します(執筆時点)。
サービスアカウントからデータが取れるか確認する
登録できたら、サービスアカウントの JSON キーから実際にレポートを取って動作確認します。
import os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "/path/to/your-service-account.json"
from google.analytics.data_v1beta import BetaAnalyticsDataClient
from google.analytics.data_v1beta.types import RunReportRequest, DateRange, Dimension, Metric
client = BetaAnalyticsDataClient()
req = RunReportRequest(
property="properties/413714906",
dimensions=[Dimension(name="pagePath")],
metrics=[Metric(name="screenPageViews")],
date_ranges=[DateRange(start_date="30daysAgo", end_date="today")],
limit=10,
)
res = client.run_report(req)
for row in res.rows:
print(row.metric_values[0].value, row.dimension_values[0].value)
PV上位10ページが表示されれば、サービスアカウントから正常にデータが取れている状態です。
後始末
OAuth Playground で取得した「リフレッシュトークン」(Refresh token 欄)は、アクセストークンと違って長期有効です。第三者に流出すると、ログインなしでアカウントの操作に使われる恐れがあります。用が済んだら明示的に取り消しておきます。
Google アカウントの「サードパーティのアプリとサービス」管理画面 にアクセスし、「Google OAuth 2.0 Playground」のアクセスを削除します。
まとめ
GA4 のサービスアカウント追加 UI が *.iam.gserviceaccount.com 形式を弾くケースは、定番の対処(通知チェックを外す・シークレットウィンドウで試す・Cloud Resource Manager API を有効化する)で解決しないことがあります。その場合は、GA4 Admin API(v1alpha)の accessBindings.create を直接叩くことで UI をスキップして登録できます。サービスアカウントの実体に問題がない限り、API 経由ならまず通ります。
参考文献
Method: properties.accessBindings.create - Google Analytics Admin API (2026-05-10 アクセス) ↩︎
OAuth 2.0 Playground - Google Identity (2026-05-10 アクセス) ↩︎
