
GA4のレポートを毎月、自動で抽出して整理したい──そんなニーズに応えるのが、この記事で紹介するPythonスクリプトです。
特定のチャネルやランディングパスを絞り込んで、Googleスプレッドシートに自動転記する処理を、Colab(Google Drive連携)で実行可能なかたちで解説します。
以下のような条件を満たすセッションデータのみを対象とし、自動で取得・出力します:
- チャネル:Organic Search(自然検索) のみ
- ランディングパス:
/movie/
を含むページ - セッション数:10以上(少数アクセスの除外)
- 対象期間:前月の1日〜末日(自動計算)
Pythonでの実装は、ログ記録や条件の分岐出力なども柔軟に扱えるため、カスタマイズ性の高い集計処理が可能です。
このスクリプトでできること
- GA4のAPIを使って、前月の特定条件付きデータを取得
landingPagePlusQueryString
とsessionDefaultChannelGroup
を指定sessions >= 10
のフィルタを適用- Googleスプレッドシートにヘッダー付きで出力
- 必要に応じてログ出力やシート分割にも拡張可能
実行環境とセットアップ
このスクリプトは、Google Colab(コラボ)+Google Drive連携での実行を前提にしています。ローカル環境にPythonをインストールせずに、クラウド上で実行できます。
事前準備(3ステップ)
- Google Cloud ConsoleでGA4 APIを有効化
- プロジェクトを作成し、「APIとサービス」→「ライブラリ」から
Google Analytics Data API
を有効化します。
- プロジェクトを作成し、「APIとサービス」→「ライブラリ」から
- サービスアカウントを作成し、JSONファイルを取得
- 「認証情報」→「サービスアカウント」→「鍵の作成(JSON)」を選択
- GA4のプロパティ設定画面で、JSONに記載されている “client_email” のメールアドレスに「閲覧者」権限を付与してください
- Googleスプレッドシートを用意
- 出力先となるスプレッドシートを作成し、IDとシート名を控えておきます
例:https://docs.google.com/spreadsheets/d/【ここがID】/edit
- Googleスプレッドシートには、JSONに記載されている “client_email” のメールアドレスに「編集者」の権限を付与してください
- 出力先となるスプレッドシートを作成し、IDとシート名を控えておきます
使用時の注意点(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/