目次
【GA4 × Google スプレッドシート】データ自動取得フローまとめ
🎯 実現できること
Google Analytics 4(GA4)のイベントデータを 毎日自動でスプレッドシートに出力 できます。
Apps Script と Google Cloud の「サービスアカウント」を使う構成で、手動実行なしで安定稼働するのが特徴です。
🧩 構成概要
- データ元:Google Analytics 4(GA4 Data API)
- 認証方式:サービスアカウント(JSONキー)
- 出力先:Google スプレッドシート
- 更新方法:Apps Script + トリガー(自動更新)
🪜 実装手順
STEP 1|Google Cloud Consoleでプロジェクト作成
- Google Cloud Console にアクセス
- 上部メニューから 「新しいプロジェクトを作成」(例:GA4 Data Export Project)
- 作成後、選択状態にしておきます
💡 よくある質問:どのアカウントで作ればいい?
結論:GA4のプロパティと同じアカウントでなくてもOK です。
ただし、以下の条件は守る必要があります。
| 項目 | 必要条件 |
|---|---|
| Google Cloud Console のアカウント | どのアカウントでもOK(GmailでもWorkspaceでも可) |
| GA4データへのアクセス権 | そのCloudプロジェクトからGA4のデータを読むには、GA4プロパティにそのアカウント(またはサービスアカウント)を追加する必要あり |
| APIキー/サービスアカウントの作成権限 | Cloudプロジェクトの オーナー または 編集者 権限が必要 |
STEP 2|GA4 Data API を有効化
- 左メニュー → 「APIとサービス」→「ライブラリ」
- 検索バーで 「Google Analytics Data API」 を検索
- 一覧からクリック → 「有効にする」ボタンを押下
STEP 3|サービスアカウントを作成
- 左メニュー → 「IAM と管理」→「サービスアカウント」
- + サービスアカウントを作成(名前:ga4-data-api-sa など任意)
- 権限設定は スキップ
STEP 4|サービスアカウントキーを発行
- 作成したアカウントを開く
- 「鍵」タブ → 「鍵を追加」→「新しい鍵を作成」
- 種類は JSON を選択
- ダウンロードされた
.jsonファイルを安全に保管
STEP 5|GA4にサービスアカウントを追加
- GA4を開く → 左下の ⚙️ [管理]
- 「プロパティのアクセス管理」→「+ユーザーを追加」
- JSON内の
client_emailをコピーして追加 - 権限は「閲覧者」または「アナリスト」でOK
STEP 6|Apps Scriptで設定
- スプレッドシートを開く → メニュー「拡張機能」→「Apps Script」
🔍 プロパティIDの確認方法
- GA4 にログイン → 左下の ⚙️[管理]
- 真ん中の「プロパティ」欄の一番上にある数字(例:
412345678)がプロパティID - またはURLが
https://analytics.google.com/analytics/web/#/p123456789/reportsの場合、pの後ろの数字がID
🧾 以下のコードを貼り付けて保存
function exportGA4Report_withSA() {
const propertyId = 'YOUR_GA4_PROPERTY_ID'; // ← プロパティIDを入力
const saJson = PropertiesService.getScriptProperties().getProperty('GA4_SERVICE_ACCOUNT_JSON');
const sa = JSON.parse(saJson);
const token = getServiceAccountToken(sa);
const url = 'https://analyticsdata.googleapis.com/v1beta/properties/' + propertyId + ':runReport';
const payload = {
dateRanges: [{ startDate: 'today', endDate: 'today' }],
metrics: [{ name: 'eventCount' }],
dimensions: [{ name: 'eventName' }]
};
const res = UrlFetchApp.fetch(url, {
method: 'post',
contentType: 'application/json',
headers: { Authorization: 'Bearer ' + token },
payload: JSON.stringify(payload),
muteHttpExceptions: true
});
const data = JSON.parse(res.getContentText());
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('ga4') || ss.insertSheet('ga4');
sheet.clear();
sheet.appendRow(['イベント名', 'イベント数']);
if (data.rows) {
data.rows.forEach((row) => {
const dims = row.dimensionValues.map((d) => d.value);
const mets = row.metricValues.map((m) => m.value);
sheet.appendRow(dims.concat(mets));
});
} else {
sheet.appendRow(['データなし', data.error ? data.error.message : '']);
}
}
function getServiceAccountToken(sa) {
const scope = 'https://www.googleapis.com/auth/analytics.readonly';
const now = Math.floor(Date.now() / 1000);
const header = { alg: 'RS256', typ: 'JWT' };
const claimSet = {
iss: sa.client_email,
scope: scope,
aud: 'https://oauth2.googleapis.com/token',
exp: now + 3600,
iat: now
};
const jwt = createJwt(header, claimSet, sa.private_key);
const tokenRes = UrlFetchApp.fetch('https://oauth2.googleapis.com/token', {
method: 'post',
payload: {
grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
assertion: jwt
},
muteHttpExceptions: true
});
const tokenInfo = JSON.parse(tokenRes.getContentText());
if (!tokenInfo.access_token) throw new Error('トークン取得失敗: ' + tokenRes.getContentText());
return tokenInfo.access_token;
}
function createJwt(header, claimSet, privateKey) {
const encHeader = Utilities.base64EncodeWebSafe(JSON.stringify(header));
const encClaim = Utilities.base64EncodeWebSafe(JSON.stringify(claimSet));
const toSign = encHeader + '.' + encClaim;
const signatureBytes = Utilities.computeRsaSha256Signature(toSign, privateKey);
const encSignature = Utilities.base64EncodeWebSafe(signatureBytes);
return toSign + '.' + encSignature;
}
STEP 7|スクリプトプロパティにJSONを登録
- Apps Scriptメニュー → ⚙️「プロジェクト設定」
- 「スクリプト プロパティ」→「+追加」
- キー名:
GA4_SERVICE_ACCOUNT_JSON - 値:ダウンロードしたJSONの中身(全体)を貼り付けて保存
STEP 8|実行テスト
- Apps Scriptの上部で関数:
exportGA4Report_withSAを選択 - 「▶実行」ボタンを押す
- スプレッドシート内に「ga4」シートが自動で作成され、イベント名とイベント数が出力されれば成功です。
既存の「ga4」シートがある場合は上書きされます。
STEP 9|自動化設定(トリガー)
- Apps Scriptメニュー → 「トリガー」
- 関数名:
exportGA4Report_withSA - イベントの種類:時間主導
- 頻度:日付ベース → 毎日1回
🧠 補足ポイント
| 項目 | 内容 |
|---|---|
| 費用 | Cloud Consoleは無料枠内で実質0円(API無料制限あり) |
| 安全性 | JSONはスクリプトプロパティに保存(コードに直書きしない) |
| トラブル時 | 403 → GA4への権限追加不足/invalid_grant → JSONの期限切れ |
✅ 出力例
| イベント名 | イベント数 |
|---|---|
| page_view | 1063 |
| view_item | 248 |
| view_cart | 102 |
| purchase | 30 |
📘 まとめ
- 認証切れなし
- GA4ダッシュボードを開かなくてもOK
- 毎日スプレッドシートが最新化
業務自動化やKPIモニタリングの第一歩としておすすめです。
