MENU

スプレッドシートとGA4の連携方法

目次

【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でプロジェクト作成

  1. Google Cloud Console にアクセス
  2. 上部メニューから 「新しいプロジェクトを作成」(例:GA4 Data Export Project)
  3. 作成後、選択状態にしておきます

💡 よくある質問:どのアカウントで作ればいい?

結論:GA4のプロパティと同じアカウントでなくてもOK です。
ただし、以下の条件は守る必要があります。

項目必要条件
Google Cloud Console のアカウントどのアカウントでもOK(GmailでもWorkspaceでも可)
GA4データへのアクセス権そのCloudプロジェクトからGA4のデータを読むには、GA4プロパティにそのアカウント(またはサービスアカウント)を追加する必要あり
APIキー/サービスアカウントの作成権限Cloudプロジェクトの オーナー または 編集者 権限が必要

STEP 2|GA4 Data API を有効化

  1. 左メニュー → 「APIとサービス」→「ライブラリ」
  2. 検索バーで 「Google Analytics Data API」 を検索
  3. 一覧からクリック → 「有効にする」ボタンを押下

STEP 3|サービスアカウントを作成

  1. 左メニュー → 「IAM と管理」→「サービスアカウント」
  2. + サービスアカウントを作成(名前:ga4-data-api-sa など任意)
  3. 権限設定は スキップ

STEP 4|サービスアカウントキーを発行

  1. 作成したアカウントを開く
  2. 「鍵」タブ → 「鍵を追加」→「新しい鍵を作成」
  3. 種類は JSON を選択
  4. ダウンロードされた .json ファイルを安全に保管

STEP 5|GA4にサービスアカウントを追加

  1. GA4を開く → 左下の ⚙️ [管理]
  2. 「プロパティのアクセス管理」→「+ユーザーを追加」
  3. JSON内の client_email をコピーして追加
  4. 権限は「閲覧者」または「アナリスト」でOK

STEP 6|Apps Scriptで設定

  1. スプレッドシートを開く → メニュー「拡張機能」→「Apps Script」

🔍 プロパティIDの確認方法

  1. GA4 にログイン → 左下の ⚙️[管理]
  2. 真ん中の「プロパティ」欄の一番上にある数字(例:412345678)がプロパティID
  3. または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を登録

  1. Apps Scriptメニュー → ⚙️「プロジェクト設定」
  2. 「スクリプト プロパティ」→「+追加」
  3. キー名:GA4_SERVICE_ACCOUNT_JSON
  4. 値:ダウンロードしたJSONの中身(全体)を貼り付けて保存

STEP 8|実行テスト

  1. Apps Scriptの上部で関数:exportGA4Report_withSA を選択
  2. 「▶実行」ボタンを押す
  3. スプレッドシート内に「ga4」シートが自動で作成され、イベント名とイベント数が出力されれば成功です。

    既存の「ga4」シートがある場合は上書きされます。

STEP 9|自動化設定(トリガー)

  1. Apps Scriptメニュー → 「トリガー」
  2. 関数名:exportGA4Report_withSA
  3. イベントの種類:時間主導
  4. 頻度:日付ベース → 毎日1回

🧠 補足ポイント

項目内容
費用Cloud Consoleは無料枠内で実質0円(API無料制限あり)
安全性JSONはスクリプトプロパティに保存(コードに直書きしない)
トラブル時403 → GA4への権限追加不足/invalid_grant → JSONの期限切れ

✅ 出力例

イベント名イベント数
page_view1063
view_item248
view_cart102
purchase30

📘 まとめ

  • 認証切れなし
  • GA4ダッシュボードを開かなくてもOK
  • 毎日スプレッドシートが最新化

業務自動化やKPIモニタリングの第一歩としておすすめです。

この記事を書いた人

目次