【2025年版】GA4×Pythonで高度なセグメント分析と自動レポート生成|Colab対応全コード公開

GA4のレポートを毎月、自動で抽出して整理したい──そんなニーズに応えるのが、この記事で紹介するPythonスクリプトです。
特定のチャネルやランディングパスを絞り込んで、Googleスプレッドシートに自動転記する処理を、Colab(Google Drive連携)で実行可能なかたちで解説します。

以下のような条件を満たすセッションデータのみを対象とし、自動で取得・出力します:

  • チャネル:Organic Search(自然検索) のみ
  • ランディングパス:/movie/ を含むページ
  • セッション数:10以上(少数アクセスの除外)
  • 対象期間:前月の1日〜末日(自動計算)

Pythonでの実装は、ログ記録や条件の分岐出力なども柔軟に扱えるため、カスタマイズ性の高い集計処理が可能です。


このスクリプトでできること

  • GA4のAPIを使って、前月の特定条件付きデータを取得
  • landingPagePlusQueryStringsessionDefaultChannelGroup を指定
  • sessions >= 10 のフィルタを適用
  • Googleスプレッドシートにヘッダー付きで出力
  • 必要に応じてログ出力やシート分割にも拡張可能

実行環境とセットアップ

このスクリプトは、Google Colab(コラボ)+Google Drive連携での実行を前提にしています。ローカル環境にPythonをインストールせずに、クラウド上で実行できます。

事前準備(3ステップ)

  1. Google Cloud ConsoleでGA4 APIを有効化
    • プロジェクトを作成し、「APIとサービス」→「ライブラリ」から Google Analytics Data API を有効化します。
  2. サービスアカウントを作成し、JSONファイルを取得
    • 「認証情報」→「サービスアカウント」→「鍵の作成(JSON)」を選択
    • GA4のプロパティ設定画面で、JSONに記載されている “client_email” のメールアドレスに「閲覧者」権限を付与してください
  3. Googleスプレッドシートを用意
    • 出力先となるスプレッドシートを作成し、IDとシート名を控えておきます
      例:https://docs.google.com/spreadsheets/d/【ここがID】/edit
    • Googleスプレッドシートには、JSONに記載されている “client_email” のメールアドレスに「編集者」の権限を付与してください

使用時の注意点(Drive保存版)

  • JSONファイルは Googleドライブ内の任意のフォルダに保存しておいてください
  • スクリプト実行時に、初回のみGoogleアカウントとのDrive連携認証が求められます(スクリプト内で自動実行)
  • SERVICE_ACCOUNT_FILE のパスや SHEET_NAME の入力ミス(スペル・全角半角)に注意してください
  • スプレッドシートのシート名が存在しない場合は自動で作成されます(スクリプト内に処理を含みます)
  • Google Sheets API も別途有効化が必要です(以下URLから対象プロジェクトで有効化)
    https://console.developers.google.com/apis/api/sheets.googleapis.com/

スクリプト全文(2025年対応・Colab+Drive版)

こちらがスクリプトの全文になります。
PROPERTY_ID」SERVICE_ACCOUNT_FILE」「SPREADSHEET_ID」の箇所はそれぞれご自身の環境に合わせて書き換えてください。

# ▼ 必須ライブラリをインストール(Colab初回のみ)
!pip install --upgrade google-analytics-data
!pip install --upgrade gspread oauth2client

# ▼ Driveマウント
from google.colab import drive
import os

drive.mount('/content/drive')

# ▼ スクリプト本体
from google.analytics.data_v1beta import BetaAnalyticsDataClient
from google.analytics.data_v1beta.types import RunReportRequest, DateRange, Dimension, Metric, FilterExpression, Filter
from google.oauth2 import service_account
import gspread
from datetime import datetime, timedelta

# ▼ 設定項目
PROPERTY_ID = '123456789'  # GA4のプロパティID
SCOPES = ['https://www.googleapis.com/auth/analytics.readonly', 'https://www.googleapis.com/auth/spreadsheets']
SERVICE_ACCOUNT_FILE = '/content/drive/MyDrive/your-folder/your-service-account.json'  # Drive上のパスに変更
SPREADSHEET_ID = 'YOUR_SPREADSHEET_ID'
SHEET_NAME = 'GA4データ出力'

# ▼ 前月の1日と末日を取得(1月のバグ対策あり)
today = datetime.today()
if today.month == 1:
    first_day = datetime(today.year - 1, 12, 1)
else:
    first_day = datetime(today.year, today.month - 1, 1)
last_day = datetime(today.year, today.month, 1) - timedelta(days=1)
date_range = DateRange(start_date=first_day.strftime('%Y-%m-%d'), end_date=last_day.strftime('%Y-%m-%d'))

# ▼ APIリクエスト定義
request = RunReportRequest(
    property=f"properties/{PROPERTY_ID}",
    date_ranges=[date_range],
    dimensions=[
        Dimension(name="landingPagePlusQueryString"),
        Dimension(name="sessionDefaultChannelGroup")
    ],
    metrics=[
        Metric(name="sessions"),
        Metric(name="engagementRate")
    ],
    dimension_filter=FilterExpression(
        and_group={
            "expressions": [
                FilterExpression(
                    filter=Filter(
                        field_name="sessionDefaultChannelGroup",
                        string_filter={"value": "Organic Search"}
                    )
                ),
                FilterExpression(
                    filter=Filter(
                        field_name="landingPagePlusQueryString",
                        string_filter={"value": "/movie/", "match_type": "CONTAINS"}
                    )
                )
            ]
        }
    ),
    metric_filter=FilterExpression(
        filter=Filter(
            field_name="sessions",
            numeric_filter={"operation": "GREATER_THAN_OR_EQUAL", "value": {"int64_value": 10}}
        )
    )
)

# ▼ 認証とデータ取得
credentials = service_account.Credentials.from_service_account_file(
    SERVICE_ACCOUNT_FILE, scopes=SCOPES)
client = BetaAnalyticsDataClient(credentials=credentials)
response = client.run_report(request)

# ▼ gspreadでスプレッドシートへ出力
gc = gspread.service_account(filename=SERVICE_ACCOUNT_FILE)
sh = gc.open_by_key(SPREADSHEET_ID)

# シートが存在しない場合は作成
try:
    worksheet = sh.worksheet(SHEET_NAME)
except gspread.exceptions.WorksheetNotFound:
    worksheet = sh.add_worksheet(title=SHEET_NAME, rows="1000", cols="20")

worksheet.clear()
headers = [header.name for header in list(response.dimension_headers) + list(response.metric_headers)]
worksheet.append_row(headers)

for row in response.rows:
    dims = [d.value for d in row.dimension_values]
    metrics = [m.value for m in row.metric_values]
    worksheet.append_row(dims + metrics)

GAS版との違いは?

GASでも複数のフィルタを使った「セグメント風抽出」は可能ですが、Pythonを使うと以下のような柔軟性が得られます:

  • 条件分岐や日付の自動制御など、細かなロジックが書きやすい
  • pandasなどを併用すれば、統計処理・集計・整形も自在
  • 複数条件の一括実行や、ログ出力・通知などの実装もしやすい
  • 実行環境をColabにすれば、共有や実行履歴もクラウド上で完結

まとめ

GA4から、特定条件にマッチするランディングページ別のデータを取得し、Googleスプレッドシートに自動出力するPythonスクリプトをご紹介しました。

フィルタ設定や拡張性の高い処理を求める場合は、GASよりもPythonの方が適している場面も多くありますが、一方で「ハードルが高い」という方もおられると思います。

「まずは試してみたい」という方は、下記のGAS版スクリプトから導入してみるのもおすすめです。
こちらもスクリプト全文掲載していますので、ご興味のある方はお試しください。

👉GAS版はこちら:https://saito-online.com/gas-ga4-api-spread_sheet/