Googleアナリティクス4(GA4)のデータをBigQueryに書き出していれば、その表をデータポータル(Looker Studio)につないでグラフにできます。GA4のコネクタでは出せない数字、たとえばカスタムディメンションに登録し忘れたパラメータでの集計や、しきい値のかからない件数を、毎月の1枚に載せられます。その代わり、BigQueryはグラフを表示するたびにクエリが走り、読んだ量に応じて料金がかかる仕組みです。この記事では、サンプル料理教室の代表が毎月見る1枚に「どのボタンから申し込まれたか」の表を足す例で、つなぎ方と料金の抑え方を最後まで書きます。前提は、GA4からBigQueryへの毎日の書き出しが動いていて、Google Cloudのプロジェクト sample-cooking-ga4 にデータセット analytics_123456789 ができていることです。書き出しの設定そのものは「GA4のデータをBigQueryに書き出す:無料枠と、小さな会社で使う場面」に書いています。
先に決めること
BigQueryは、つなぎ方を間違えると「動くけれど毎回たくさん読む」レポートになります。グラフを置く前に次の4つを決めます。
BigQueryをつなぐ必要があるか
毎月の申込数・チャネル別・ランディング ページ別は、GA4のコネクタで出ます。BigQueryのコネクタを使うのは、GA4のコネクタでは出せないものだけにします。
| 載せたいもの | 使うコネクタ | 理由 |
|---|---|---|
| 先月の申込数・前年同月比・チャネル別 | GA4 | GA4の標準レポートと同じ数字がそのまま出る |
| 検索の表示回数とクリック数 | Search Console | BigQueryに入っていない |
カスタムディメンションに登録していないパラメータ(例: button_location)での件数 | BigQuery | GA4のコネクタは登録したものしか出せない |
| 14か月より前の明細を使った比較 | BigQuery | GA4の探索の保持期間を超えている |
| GA4の割り当てのエラーが続くグラフ | BigQuery | GA4のデータAPIの割り当てを使わない |
サンプル料理教室では、電話タップ tel_click とLINE追加 line_click に button_location(header・footer・lesson など)を付けて送っていますが、GA4のカスタムディメンションには登録していません。この内訳だけをBigQueryから出し、ほかのグラフはGA4のコネクタのままにします。
料金をどのプロジェクトに付けるか
データポータルからBigQueryに投げたクエリの料金は、データソースで選んだ課金プロジェクトに付きます。サンプル料理教室ではデータも課金も sample-cooking-ga4 の1つにまとめ、請求先アカウントもそこにつないでいます。プロジェクトを分けると、どのレポートでいくら使ったかが追いにくくなります。
誰の認証情報で読むか
BigQueryのデータソースも、GA4と同じく「データの認証情報」を選べます。
- オーナーの認証情報(初期値): データソースを作った人の権限で読みます。BigQueryの権限が要るのはその人だけで、見る人には要りません
- 閲覧者の認証情報: 見る人それぞれの権限で読みます。代表にも講師にもBigQueryの権限を配る必要があります
- サービス アカウントの認証情報: Google Cloudのサービス アカウントの権限で読みます。個人のアカウントに頼らずに済みますが、設定の手間が増えます
サンプル料理教室は、GA4のデータソースと同じ共用アカウント web@sample-cooking.example で作り、オーナーの認証情報にします。
書き出しの表を直接読むか、集計した表を読むか
ここがいちばん料金と速さに効く判断です。GA4の書き出しの表は、1イベント1行の明細が日付ごとのテーブルに入っています。データポータルからこれを直接読むと、グラフを開くたびに明細を数え直します。毎日1回、日別の件数だけを入れた小さな表を作っておき、データポータルはそちらを読むようにすると、読む量がほぼ一定の小さな値になります。サンプル料理教室では集計した表を読む形にしています。手順では両方を書きます。
料金のかかり方
BigQueryの料金は、データを置いておく料金(ストレージ)と、クエリで読む料金の2つです。データポータルが増やすのは、クエリで読む料金のほうです。値は2026年10月時点の公式の料金ページのもので、単価は既定で表示されるアイオワ(us-central1)の値です。
| 何に | 料金 | 注意 |
|---|---|---|
| クエリ(オンデマンド) | 毎月1TiBまで無料、超えた分は1TiBあたり $6.25 | 無料枠は請求先アカウントごと |
| 最小の処理量 | クエリが参照するテーブルあたり10MB、クエリあたり10MB | 小さな表でも10MBとして数える |
| キャッシュから返った結果 | 無料 | エラーになったクエリも無料 |
LIMIT を付けたクエリ | 読んだ列の量で課金 | LIMIT では減らない |
| BI Engine | 予約した容量1GiB・1時間あたり $0.0416 | 予約している間ずっとかかる |
東京(asia-northeast1)の単価は、料金ページで地域を切り替えて確かめます。ストレージの料金と無料枠は「GA4のデータをBigQueryに書き出す:無料枠と、小さな会社で使う場面」の表のとおりです。
データポータルで何をするとクエリが走るか
データポータルは、グラフ1つごとにBigQueryへクエリを投げます。期間を変える、フィルタを変える、ページを移る、といった操作でも、新しい条件のクエリが走ります。
それを抑えるのが、データポータル側のキャッシュです。データソースの「データの更新頻度」で決めた時間のあいだは、同じ条件の結果をメモリから返し、BigQueryにはクエリを投げないことが多くなります(メモリから返る保証はありません)。BigQueryのデータソースの初期値は12時間で、1〜50分、または1〜12時間から選べます。逆に、編集者がメニューの「データを更新」を押したときや、キャッシュの時間が切れたあとに開いたときは、普通にクエリが走って料金の対象になります。
BigQuery側にもクエリ結果のキャッシュ(約24時間)がありますが、events_* のようにワイルドカードで複数のテーブルを読むクエリには使われません。GA4の書き出しの表を直接読むと、データポータルのキャッシュが切れるたびに毎回読み直しになります。
サンプル料理教室での目安
サンプル料理教室の書き出しは、1か月分で数十MBです。それでも、公式の料金ページには「クエリが参照するテーブルあたりのデータ最小処理容量は10MB」とあり、GA4の書き出しは1日1テーブルなので、1か月分を読むクエリは30テーブルを参照します。見積もりは少なくとも1回300MB、13か月の推移なら約400テーブルで1回4GB前後として立てます。
書き出しの表を直接読むグラフを6つ置き、キャッシュが1日2回切れる計算にすると、1か月分のグラフだけで6×2×30×300MBで約108GBです。13か月の推移を1つ足すと、さらに月に約240GB増えます。無料枠1TiBには収まりますが、見る人が増えたり期間を何度も変えたりすると届きます。集計した小さな表を読むなら、1回は最小の10MBで済み、同じ使い方で月に数GBです。
読みすぎを止める
予算のアラートは通知だけで、クエリは止まりません。止めるのは、プロジェクトの「割り当てとシステム上限」で 「Query usage per day」(英語の割り当て名のまま出ます。1日に読める量)を小さくする設定です。手順は「GA4のデータをBigQueryに書き出す:無料枠と、小さな会社で使う場面」に書いています。上限に達すると、データポータルのグラフも、割り当てが補充されるまでエラーになります。
つなぎ方の一覧
BigQueryのデータをデータポータルに出す方法は5つあります。
| つなぎ方 | 読むもの | 1回に読む量 | 向く場面 |
|---|---|---|---|
| 書き出しの表を直接 | events_ の日付ごとのテーブル | 期間の日数×最低10MB以上 | 一度だけ中身を眺める |
| カスタムクエリ | SQLの結果 | SQLが読む量 | 期間を見る人が変えるグラフ |
| 集計した表 | スケジュールされたクエリで作った小さな表 | ほぼ10MB | 毎月の1枚(おすすめ) |
| ビュー | BigQueryに保存したSQL | ビューの元の表を読む量 | SQLを社内で使い回す |
| データの抽出 | データポータルに保存した写し | 抽出するときだけ | 数字が変わらない過去の期間 |
つなぐ手順
1. BigQueryの権限を確かめる
データソースを作る人(オーナーの認証情報なら、その人だけ)に、次の2つのロールが要ります。
- BigQuery データ閲覧者: データセットの中身を読む
- BigQuery ジョブユーザー: 課金プロジェクトでクエリを実行する
- Google Cloudコンソールで
sample-cooking-ga4を選ぶ - メニューから「IAMと管理」→「IAM」を開く
- 「アクセス権を付与」を押す
- 「新しいプリンシパル」に
web@sample-cooking.exampleを入れる - 「ロールを選択」で「BigQuery データ閲覧者」を選ぶ
- 「別のロールを追加」で「BigQuery ジョブユーザー」を選ぶ
- 「保存」を押す

プロジェクトのオーナーなら、どちらも最初から持っています。データ閲覧者は、analytics_123456789 と、あとで作る report のデータセットだけに付けてもかまいません。ジョブユーザーはデータセットには付けられず、プロジェクトに付けます。
2. BigQueryのデータソースを作る
- 共用アカウントでデータポータルを開く
- 左上の「作成」をクリックし、「データソース」を選ぶ
- コネクタの一覧から「BigQuery」を選ぶ
- 許可を求められたら「承認」をクリックする
- 左の列で「マイ プロジェクト」を選ぶ
- プロジェクトの列で
sample-cooking-ga4を選ぶ(一覧に無ければプロジェクトIDを入力する) - データセットの列で
report(集計した表を読む場合)かanalytics_123456789(直接読む場合)を選ぶ - 表の列で読む表を選ぶ
- 右上の「接続」をクリックする

レポートの編集中に「データを追加」から作ると、そのレポートだけの埋め込みデータソースになります。毎月の1枚以外でも使うなら、ホームの「作成」から作ります。
左の列の「共有プロジェクト」は、データのあるプロジェクトと料金を付けるプロジェクトを分けるときに使います。「最近のプロジェクト」は、Google Cloudコンソールで最近開いたプロジェクトの一覧で、選んだプロジェクトがデータと課金の両方に使われます。
接続すると、フィールドの一覧が出ます。どのBigQueryのデータソースにも「Record Count」という指標が自動で付きます。指標の集計方法はBigQuery側で決まり、データポータルで変えられるのは型と説明です。
- 左上の名前を「BQ_申込ボタン別」のように分かる名前に変える
- 上部の「データの認証情報」が「オーナーの認証情報」になっていることを確かめる
- 「データの更新頻度」を開き、12時間のままにする
3. 書き出しの表を直接つなぐと何が起きるか
手順2で analytics_123456789 を選ぶと、表の列には events_ が1つだけ出ます。events_20261001 のような名前の後ろに8桁の日付が付いたテーブルは、データポータルでは名前の前の部分ごとに1つにまとめて表示されます。ストリーミングを使っていれば events_intraday_ も別に出ます。
直接つないだときは、次の3つに気をつけます。
- 期間: グラフを作ると、直近28日分のテーブルだけが読まれます。先月にするには、グラフの「設定」タブの期間か、レポートの期間を変えます
- 入れ子: パラメータは
event_paramsという入れ子の列に、名前と値の組で何行も入っています。実際に運用していると、event_paramsの中の項目をディメンションに入れた途端、1つのイベントがパラメータの数だけ行に分かれ、「Record Count」が何倍にも膨らむことがよく起きます。直接つないだ表では、入れ子の中の項目をグラフに使いません - 自動の計算フィールド: GA4の書き出しの表をつなぐと、よく使う指標の多くが計算フィールドとして自動で作られます。GA4の画面とは数え方が違うので、ユーザー数やセッション数はGA4のコネクタの数字と同じにはなりません

まとめると、直接つなぐのは「どんな列があるか一度眺める」ときだけにし、毎月の1枚には次のカスタムクエリか集計した表を使います。
4. カスタムクエリで期間を受け取る
期間設定のコントロールで代表が期間を変えても、読む日数だけを読むようにするには、カスタムクエリで期間のパラメータを使います。
- 手順2の5で「マイ プロジェクト」ではなく「カスタムクエリ」を選ぶ
- 課金プロジェクトに
sample-cooking-ga4を選ぶ - 次のSQLを入れる
- 「パラメータ」の欄で、期間のパラメータを有効にする
- 「接続」をクリックする
SELECT
PARSE_DATE('%Y%m%d', event_date) AS day,
event_name,
IFNULL(
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'button_location'),
'(未設定)'
) AS button_location,
COUNT(*) AS events
FROM `sample-cooking-ga4.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN @DS_START_DATE AND @DS_END_DATE
AND event_name IN ('generate_lead', 'tel_click', 'line_click')
GROUP BY day, event_name, button_location

@DS_START_DATE と @DS_END_DATE には、レポートの期間の開始日と終了日が 20261001 のような8桁の文字で入ります。パラメータの値はすべて文字として渡るので、日付として比べるときは PARSE_DATE('%Y%m%d', @DS_START_DATE) のように変換します。_TABLE_SUFFIX は events_* の * に当たる部分(日付)なので、そのまま比べられ、期間の日のテーブルしか読みません。BETWEEN で上と下を書いておくと、events_intraday_ で始まるテーブルも混ざりません。
event_params から値を1つだけ取り出す (SELECT ... FROM UNNEST(event_params) WHERE key = ...) の形なら、1イベントは1行のまま数えられます。手順3の「行が膨らむ」問題は、この形で避けます。
カスタムクエリには決まりが3つあります。
- 1つの
SELECT文でなければならない。途中の計算が要るときはWITH句にまとめる - 構文は標準SQL。古い書き方を使うときだけ「レガシー SQL を使用する」をオンにする
- 別のプロジェクトのデータを読むときは、
FROMにプロジェクトID.データセット.テーブルの形で書く
SQLは、先にBigQueryの画面で実行して、右上に出る処理量を確かめてから貼ります。
5. 集計した表を毎日作り、それをつなぐ
毎月の1枚では、期間を変えるたびに明細を数え直す必要はありません。BigQueryの「スケジュールされたクエリ」で、日別の件数だけを入れた表を毎日作り直します。
- BigQueryの画面で、エクスプローラの
sample-cooking-ga4の「アクションを表示」から「データセットを作成」を選ぶ - データセットIDを
reportにし、ロケーションをanalytics_123456789と同じ(例: 東京asia-northeast1)にして作成する - 新しいクエリのタブを開き、次のSQLを貼る
- 「実行」を押し、
reportにdaily_leadsができたことを確かめる - エディタの上の「スケジュール」から、スケジュールされたクエリを新しく作る
- 名前を「申込ボタン別_毎日」にし、繰り返しを毎日、時刻を日本時間の朝にして保存する
CREATE OR REPLACE TABLE `sample-cooking-ga4.report.daily_leads`
PARTITION BY day AS
SELECT
PARSE_DATE('%Y%m%d', event_date) AS day,
event_name,
IFNULL(
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'button_location'),
'(未設定)'
) AS button_location,
COUNT(*) AS events,
COUNT(DISTINCT CONCAT(
user_pseudo_id, '-',
CAST((SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS STRING)
)) AS sessions_with_event
FROM `sample-cooking-ga4.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN
FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE('Asia/Tokyo'), INTERVAL 400 DAY))
AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE('Asia/Tokyo'), INTERVAL 1 DAY))
AND event_name IN ('generate_lead', 'tel_click', 'line_click')
GROUP BY day, event_name, button_location

直近400日分を毎日作り直すので、13か月の推移と前年同月比にも使えます。この作り直しは1回あたり約400テーブルを読み、1か月で100GB余りの処理になります。サンプル料理教室では無料枠に収まる量です。気になるなら繰り返しを週1回にしても、毎月の1枚には足ります。sessions_with_event は、そのイベントが起きたセッションの数です。電話タップを「セッションごとに1回」で数えているなら、こちらがGA4の画面のキーイベント(旧コンバージョン)に近い数字になります。
スケジュールされたクエリはBigQuery Data Transfer Serviceの機能なので、サンドボックスのプロジェクトでは使えません。
できた表をデータポータルにつなぎます。
- 手順2のとおりにBigQueryのデータソースを作り、データセット
report、表daily_leadsを選ぶ - 「設定」の列に出る「day を期間ディメンションとして使用」にチェックを入れる
- 「接続」をクリックする
日付で分割した表は、チェックを入れると期間の分だけを読みます。

6. 毎月の1枚に表を足す
- 毎月の1枚のレポートを開き、「データを追加」から「BQ_申込ボタン別」を追加する
- 「グラフを追加」から「表」を選び、データソースを「BQ_申込ボタン別」にする
- ディメンションに
event_nameとbutton_locationを入れる - 指標に
eventsとsessions_with_eventを入れ、集計を「合計」にする - 並べ替えを
eventsの降順にする
期間はレポートの設定(先月)をそのまま引き継ぎます。GA4のグラフとBigQueryのグラフが同じページにあっても、期間設定のコントロールは両方に効きます。イベント名を日本語にするには、計算フィールドの CASE 文で置き換えます。

応用
どのグラフがどれだけ読んだかを見る
データソースがオーナーの認証情報で、BigQueryのプロジェクトのオーナー権限を持っている人には、BigQueryのコネクタを使うグラフの右上にBigQueryのアイコンが出ます。押すと「Powered by BigQuery」の画面が開き、そのグラフのSQL、かかった時間、請求の対象になったバイト数が見えます。

データポータルからBigQueryに送られるクエリには、すべて requestor:looker_studio というラベルが付きます。Google Cloudの請求レポートをこのラベルで絞ると、データポータル経由で使った量だけが分かります。
過去の期間はデータの抽出で固定する
前年の数字のように、もう変わらない期間を何度も見るなら、データポータルの「データの抽出」で写しを作ります。抽出したデータは静的な写しで、上限は100MB・75万行です。
- ホームの「作成」→「データソース」で「データの抽出」を選ぶ
- 元のデータソースに「BQ_申込ボタン別」を選ぶ
- 使うディメンションと指標だけを追加する
- 期間を指定する
- 必要なら右下の「自動更新」をオンにして更新の予定を決める
- 右下の「保存して抽出」をクリックする
グラフは抽出した写しを読むので、開くたびにBigQueryを読むことがなくなります。
BI Engineは小さな会社では使わない
BI Engineは、BigQueryのデータをメモリに置いてグラフの表示を1秒未満にする仕組みです。容量を予約しているあいだ料金がかかり、ワイルドカードで読むクエリは速くなりません。代表が月に1回開く1枚に必要なものではありません。表示が遅いと感じたら、先に集計した表を読む形にします。
BigQueryの結果を一度だけグラフにする
BigQueryの画面でクエリを実行し、結果の上の「次で開く」から「Looker Studio」を選ぶと、その結果をすぐグラフにできます。グラフで見られるのは最大5,000行です。これは確認用の一時的な画面で、毎月の1枚の代わりにはしません。
できないことと、その代わり
| できないこと | 代わりの手 |
|---|---|
| GA4の画面と同じユーザー数・セッション数を出す | 件数(イベント数)で比べる。ユーザー数とセッション数はGA4のコネクタで出す |
| 当日の数字を見る(毎日の書き出しだけの場合) | 当日はGA4のリアルタイム レポートで見る。ストリーミングは追加料金がかかる(BigQuery側で1GBあたり0.05ドル) |
| リンクより前の期間を出す | GA4のコネクタで出す。BigQueryには書き出しを始めた日以降しか無い |
| 1つのデータソースで複数の表を読む | カスタムクエリかビューで1つの結果にまとめる |
| カスタムクエリで複数の文を実行する | WITH 句で1つの SELECT にまとめる |
| ワイルドカードの表をBI Engineで速くする | 集計した表を作り、そちらを読む |
| 1つのグラフで200万行より多く返す | 期間を絞るか、BigQuery側で集計してから返す |
BigQueryの TIME 型をそのまま時刻として扱う | SQLで日付と組み合わせて DATETIME にする |
| 顧客管理の暗号鍵(CMEK)を使ったデータを読む | Googleの管理の鍵のデータセットに置く |
SQLを書く人がいない会社では、BigQueryをつなぐより、GA4でカスタムディメンションを登録してGA4のコネクタで出すほうが続きます。登録した日から先の数字しか出ませんが、毎月の1枚にはそれで足ります。
よく詰まるところ
| 症状 | 原因 | 直し方 |
|---|---|---|
| プロジェクトやデータセットが一覧に出ない | データポータルとGoogle Cloudで別のアカウントにログインしている。データ閲覧者のロールが無い | 同じアカウントでログインし直す。ロールを付ける。プロジェクトIDを直接入力する |
| 接続すると権限のエラーが出る | 課金プロジェクトでBigQuery ジョブユーザーのロールが無い | プロジェクトにジョブユーザーを付ける |
events_ をつないだら28日分しか出ない | 日付ごとのテーブルは、既定で直近28日分だけ読まれる | グラフかレポートの期間を変える |
| 件数がGA4の画面の何倍にもなる | event_params の中の項目をディメンションに入れ、1イベントが何行にも分かれた | カスタムクエリで (SELECT ... FROM UNNEST(event_params) WHERE key = ...) の形にして取り出す |
| 期間を変えても数字が変わらない | カスタムクエリで期間のパラメータを有効にしていない、または WHERE に書いていない | 「パラメータ」の欄で有効にし、_TABLE_SUFFIX BETWEEN @DS_START_DATE AND @DS_END_DATE を入れる |
| カスタムクエリが構文エラーになる | 文を2つ以上書いている | WITH 句で1つの SELECT にまとめる |
Field is ambiguous と出る | JOIN した表に同じ名前の列がある | AS で列名を付け替えるか、EXCEPT で外す |
| 日付がテキストになり、期間グラフに使えない | event_date は 20261001 の文字の列 | SQLで PARSE_DATE('%Y%m%d', event_date) にする。データソースで型を日付に変えてもよい |
| 当日分を含めると件数が倍になる | events_intraday_ も読んでいる | _TABLE_SUFFIX を BETWEEN で上と下まで書く |
| 思ったより処理量が多い | ワイルドカードの表はBigQueryのキャッシュが使われず、テーブルごとに最低10MBで数える | 集計した表を読む形にする。「データの更新頻度」を12時間にする |
グラフが HTTP 504 Gateway timeout になる | クエリに3〜5分以上かかった | 集計した表かビューにして、データポータルからは軽いクエリだけを投げる |
| スケジュールされたクエリが失敗する | 書き込み先のデータセットと書き出しのデータセットのロケーションが違う | report を同じロケーションで作り直す |
| 代表が開くとグラフがエラーになる | 閲覧者の認証情報で、代表にBigQueryの権限が無い | データソースをオーナーの認証情報にする |
| ある日から全部のグラフが止まった | 割り当ての Query usage per day に達した。またはプロジェクトの課金が止まった | しばらくすると補充されるので待つか、上限そのものを見直す。請求先アカウントの状態を確かめる |
次にやること
BigQueryのグラフとGA4のグラフで数字がずれるときは、「GA4とデータポータル(Looker Studio)の数字が合わない理由:しきい値・割り当て・組み合わせられない項目」で、どちらの数え方が違うのかを切り分けます。グラフの表示が遅い、エラーが出るといったときは「データポータル(Looker Studio)が遅い・エラーが出るとき:データの抽出・キャッシュ・割り当ての点検」が続きです。書き出しの設定やSQLの基本、ストレージの料金は「GA4のデータをBigQueryに書き出す:無料枠と、小さな会社で使う場面」に戻ります。毎月の1枚そのものの作り方は「データポータル(Looker Studio)でGA4のレポートを作る:毎月の数字を1枚にまとめる」に書いています。