GA4とSearch Console APIをサービスアカウント認証で叩くための初期設定手順

公開日:
更新日:
目次

Google Analytics 4 (GA4) と Search Console のデータをスクリプトから取得したい場合、サービスアカウント認証が一番シンプルです。OAuth と違ってブラウザ操作もリフレッシュトークンの管理も不要で、CIや定期実行に向いています。この記事では、Google Cloud のプロジェクト作成から Python で動作確認するまでの最小手順をまとめます[1][2]

なお、サービスアカウントを GA4 や Search Console に追加する UI で詰まることが少なくありません(執筆者も詰まりました)。自分自身が GA4 と Search Console のオーナーである個人ブログ用途であれば、サービスアカウントよりもユーザーOAuthのほうが楽 です。ユーザーOAuth版の手順は別記事 個人ブログのGA4とSearch Console分析用にユーザーOAuthをセットアップする手順 にまとめました。

必要なもの

  • 計測対象のGA4プロパティとSearch Consoleプロパティ(既に登録済みの想定)
  • Googleアカウント(GA4管理者権限を持つもの)
  • Python 3.9以上
  • ターミナル

Google Cloud プロジェクトを用意する

最初にAPIを有効化するための器となるプロジェクトを用意します。

Google Cloud Console にログインして、新しいプロジェクトを作成します。プロジェクト名は何でも構いません(例: blog-analytics)。

すでに別用途のプロジェクトがあれば流用しても問題ありません。

必要なAPIを有効化する

プロジェクトに対して、データ取得に使うAPIを2つ有効化します。

プロジェクトの「APIとサービス」→「ライブラリ」から以下の2つを有効化します。

  • Google Analytics Data API[3](GA4 用)
  • Google Search Console API[4]

検索ボックスに API名を貼り付けて、表示された結果から「有効にする」を押すだけです。

サービスアカウントを作成してJSONキーを発行する

スクリプトから認証するためのサービスアカウントを作り、その鍵となるJSONをローカルに保存します。

「IAMと管理」→「サービスアカウント」→「サービスアカウントを作成」を選びます。

  • サービスアカウント名: blog-analytics-reader(任意)
  • ロール: ここでは付与しない(後で個別に付ける)

作成後、サービスアカウントの詳細画面で「キー」タブを開き、「鍵を追加」→「新しい鍵を作成」→ JSON 形式を選んでダウンロードします。

ダウンロードしたJSONはGitリポジトリに含めない場所に置きます。推奨は次の場所です。

mkdir -p ~/.config/gcp
mv ~/Downloads/blog-analytics-*.json ~/.config/gcp/blog-analytics.json
chmod 600 ~/.config/gcp/blog-analytics.json

サービスアカウントのメールアドレス(xxx@<project>.iam.gserviceaccount.com の形式)は次のステップで使います。

GA4とSearch Consoleにサービスアカウントを追加する

サービスアカウントは作成しただけでは何も読めません。GA4とSearch Consoleの双方に「ユーザー」として追加することで、ようやくAPIからデータが取れるようになります。

GA4 側

GA4の「管理」→「プロパティのアクセス管理」→「+」→「ユーザーを追加」を選び、サービスアカウントのメールアドレスを入力します。

ロールは「閲覧者」で十分です。「メールでこの新しいユーザーに通知する」のチェックは 必ず外してください。サービスアカウントは Gmail を持たないため、通知を有効にするとエラーになります。

それでも「このメールアドレスは Google アカウントと一致しません」というエラーが出てサービスアカウントを追加できない場合があります。その対処は別記事GA4『このメールアドレスはGoogleアカウントと一致しません』でサービスアカウントが追加できない時の対処にまとめました。

Search Console 側

Search Consoleの対象プロパティを開き、「設定」→「ユーザーと権限」→「ユーザーを追加」を選びます。同じくサービスアカウントのメールアドレスを入力します。

権限は「制限付き」(読み取り専用)で十分です。

Pythonで動作確認する

設定が正しくできているかを、最小のスクリプトで確認します。

仮想環境を作って必要なライブラリを入れます。

python3 -m venv ~/.venvs/blog-analytics
source ~/.venvs/blog-analytics/bin/activate
pip install google-analytics-data google-api-python-client google-auth

GA4 のPV取得を試すスクリプトを作ります。

# check_ga4.py
import os
from google.analytics.data_v1beta import BetaAnalyticsDataClient
from google.analytics.data_v1beta.types import RunReportRequest, DateRange, Dimension, Metric

os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = os.path.expanduser(
    "~/.config/gcp/blog-analytics.json"
)

PROPERTY_ID = "XXXXXXXXX"  # GA4のプロパティID(数字のみ、Gや-は含めない)

client = BetaAnalyticsDataClient()
request = RunReportRequest(
    property=f"properties/{PROPERTY_ID}",
    dimensions=[Dimension(name="pagePath")],
    metrics=[Metric(name="screenPageViews")],
    date_ranges=[DateRange(start_date="30daysAgo", end_date="today")],
    limit=10,
)

response = client.run_report(request)
for row in response.rows:
    page = row.dimension_values[0].value
    pv = row.metric_values[0].value
    print(f"{pv:>6}  {page}")

PROPERTY_ID はGA4の「管理」→「プロパティ設定」で確認できます。実行してPV上位10ページが表示されれば成功です。

python check_ga4.py

Search Console 側も同様に試せます。

# check_gsc.py
import os
from googleapiclient.discovery import build
from google.oauth2 import service_account

creds = service_account.Credentials.from_service_account_file(
    os.path.expanduser("~/.config/gcp/blog-analytics.json"),
    scopes=["https://www.googleapis.com/auth/webmasters.readonly"],
)

service = build("searchconsole", "v1", credentials=creds)

SITE_URL = "sc-domain:example.com"  # ドメインプロパティ。URLプレフィックスなら https://example.com/

response = service.searchanalytics().query(
    siteUrl=SITE_URL,
    body={
        "startDate": "2026-04-06",
        "endDate":   "2026-05-06",
        "dimensions": ["page"],
        "rowLimit": 10,
    },
).execute()

for row in response.get("rows", []):
    print(f"{row['clicks']:>6} clicks  pos={row['position']:.1f}  {row['keys'][0]}")

よくあるエラー

セットアップでつまずきやすい代表的なエラーと、その対処法を紹介します。

403 PERMISSION_DENIED

サービスアカウントがGA4 / Search Console 側に追加されていないか、権限が不足しています。「GA4とSearch Consoleにサービスアカウントを追加する」の手順をやり直してください。

Search Console 側で User does not have sufficient permission

ドメインプロパティとURLプレフィックスでサービスアカウントが別扱いになることがあります。SITE_URL の指定形式(sc-domain:https://...)と、Search Console 上で同じ形式のプロパティに追加されているかを確認します。

GOOGLE_APPLICATION_CREDENTIALS が読まれていない

スクリプト冒頭で os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = ...from google.~ import より 前に 書く必要があります。順序を逆にするとライブラリの初期化時にキーが見えません。

GA4のユーザー追加で「このメールアドレスは Google アカウントと一致しません」と出る

サービスアカウントは正しく作成されているのに、GA4 のプロパティのアクセス管理 UI で「Google アカウントと一致しません」と表示されて追加できないことがあります。詳しい切り分けと、API を直接叩いて UI をスキップする回避策を別記事 GA4『このメールアドレスはGoogleアカウントと一致しません』でサービスアカウントが追加できない時の対処 にまとめました。

まとめ

サービスアカウント認証の手順は「GCPでプロジェクト作成 → API有効化 → サービスアカウント作成 → GA4/Search Consoleにメールアドレス追加 → JSONキーで動作確認」の5ステップです。一度通せば、あとはスクリプトから自由にデータを取得できます。

参考文献

脚注
  1. Google Analytics API quickstart (2026-05-07 アクセス) ↩︎

  2. Quickstart: Run a Search Console App in Python (2026-05-07 アクセス) ↩︎

  3. Method: properties.runReport - Google Analytics Data API (2026-05-07 アクセス) ↩︎

  4. Search Analytics: query - Search Console API (2026-05-07 アクセス) ↩︎