はじめに

Google広告の管理画面、毎日見ていると「この数字、あとで自分で計算したいのにエクスポートが面倒だな」と思いませんか。

CSVを手でダウンロードして、Excelに貼って、先月分とつなげて……という作業は、最初の1回はいいのですが、毎日・毎週となると確実に破綻します。具体的には、こんな限界が出てきます。

  • 抜け漏れが起きる: ダウンロードを1日忘れると、その日のデータは取り戻しにくい
  • 加工が属人化する: 「あの集計、どうやって作ったんだっけ」が増える
  • GA4や他媒体とつなげにくい: 広告データがCSVのままだと、結局Excel内で完結してしまう

ここで登場するのが BigQuery Data Transfer Service(以下、DTS) です。DTSは、Google広告のレポートデータを BigQueryへ毎日自動で取り込んでくれる マネージドな仕組みです。一度設定してしまえば、あとは毎朝勝手にテーブルが更新されます。

DTSを使うと、こんなことが嬉しくなります。

手動エクスポートDTSでの自動連携
毎日手でダウンロード毎日自動で取り込み
CSVが散らばるBigQueryに1か所集約
過去分の補完が面倒バックフィルで過去分も取得可能
GA4と結合しづらいSQLで他データと自由に結合

広告データをBigQueryに溜められると、後段の分析が一気に楽になります。たとえば 結合してGA4のコンバージョンと突き合わせ、真のROASを計算する ところまで地続きで進められます。

この記事では、GCPの準備から転送の作成、確認SQLまで、手を動かせば連携が完成するところまでを通しで解説します。


事前準備

設定を始める前に、次の3つをそろえておきましょう。ここがそろっていないと、途中の画面で必ず止まります。

1. GCPプロジェクトと課金の有効化

BigQueryとDTSを使うには、課金が有効になったGCPプロジェクトが必要です。

  • GCPプロジェクトを作成(または既存のものを利用)
  • 課金(Billing)を有効化しておく(DTS自体の転送料金はかかりませんが、BigQueryのストレージ・クエリ料金は発生します)
  • BigQuery APIBigQuery Data Transfer API を有効化

💡 補足

DTSの「転送」そのものに追加料金はかかりません。コストが発生するのは、取り込まれたデータを保存するBigQueryストレージと、分析時に流すクエリです。とはいえ広告レポートのデータ量はそれほど大きくないので、最初から怖がる必要はありません。コスト管理のコツは BigQueryのコストを月1万円以下に抑える で詳しく触れています。

2. 必要な権限

設定する人(あなた)のアカウントに、対象プロジェクトで次の権限があるか確認してください。

  • bigquery.admin(または転送設定の作成・データセット書き込みができる権限)
  • DTSの転送設定を作成する権限
  • Google広告アカウントへの 閲覧アクセス

権限まわりは「自分は管理者だから大丈夫」と思っていても、組織アカウントだと細かく制限されていることがあります。設定中に権限エラーが出たら、まずここを疑ってください。

3. Google広告のアカウントIDとアクセス権

連携元となるGoogle広告の アカウントID(10桁、ハイフンなしの数字) を控えておきます。管理画面の右上などに 123-456-7890 の形式で表示されているものです。DTSにはハイフンを除いた 1234567890 を入力します。

MCC(マネージャーアカウント)配下の場合は、MCCのIDを指定すると配下アカウントをまとめて取り込める構成も選べます。まずは1アカウントから始めるのがおすすめです。

⚠️ 注意

連携には、転送を設定するGoogleアカウントが対象のGoogle広告アカウントを 閲覧できる 必要があります。広告アカウントへのアクセス権がないと、認証は通っても「データが取れない」状態になります。


設定手順

設定方法は大きく2つあります。最初は迷わず使える コンソール(GUI) がおすすめですが、再現性を残したい人向けに bq コマンド の例も載せておきます。

方法A:BigQueryコンソールから作成する

  1. BigQueryのコンソールを開く
  2. 左メニューから 「データ転送(Data transfers)」 を選択
  3. 「転送を作成(CREATE TRANSFER)」 をクリック
  4. ソースに 「Google Ads」 を選択
  5. 以下を設定する
設定項目内容
表示名後で見て分かる名前(例:google-ads-daily
スケジュール毎日(既定でOK。実行時刻も指定可能)
宛先データセット取り込み先のBigQueryデータセット(例:ads_raw
Customer IDGoogle広告のアカウントID(ハイフンなし10桁)
更新時間窓(Refresh window)過去何日分を毎回さかのぼって取り直すか(例:7日)
  1. 認証(対象の広告アカウントを閲覧できるGoogleアカウントで承認)
  2. 保存すると、初回の取り込みが始まります

💡 補足:更新時間窓(Refresh window)とは

Google広告のコンバージョンや費用は、計上が後から確定・修正されることがあります。更新時間窓を「7日」にしておくと、毎日の取り込みで過去7日分を上書きで取り直すので、後から確定した数値も反映されます。最初は7日程度にしておくと安心です。

宛先データセットは、転送を作る前に作成しておきましょう。データセットの ロケーション(リージョン) は後から変更できないので、他のデータと結合する予定があるならそろえておくのが無難です(例:asia-northeast1US)。

方法B:bq コマンドで作成する

CLIで作りたい場合は、まずデータセットを作ってから転送設定を作成します。

# 1. 宛先データセットを作成(例:東京リージョン)
bq --location=asia-northeast1 mk --dataset \
  myproject:ads_raw

# 2. Google Ads の転送設定を作成
bq mk --transfer_config \
  --project_id=myproject \
  --data_source=google_ads \
  --display_name="google-ads-daily" \
  --target_dataset=ads_raw \
  --params='{"customer_id":"1234567890","refresh_window_days":"7"}'

実行すると認証用のURLが表示されるので、対象のGoogle広告アカウントを閲覧できるGoogleアカウントで承認します。

⚠️ 注意

上記の data_source 名やパラメータのキーは、Googleのアップデートで変わることがあります。コマンドが通らない場合は、bq ls --transfer_config や最新の公式ドキュメント・コンソールのUIに従って項目名を確認してください。細かい仕様はコンソールから一度作ってみると、必要なパラメータが分かりやすいです。

スケジュールは既定で毎日実行になります。実行時刻を細かく指定したい場合は --schedule オプションで調整できます(指定しなければ自動で割り当てられます)。


生成されるテーブル群

転送が成功すると、宛先データセットの中にたくさんのテーブルが自動生成されます。慣れないうちは数の多さに驚きますが、ポイントを押さえれば怖くありません。

テーブルの命名ルール

Google AdsのDTSで作られるテーブルは、おおむね次のような特徴を持っています。

  • p_ で始まるテーブル: 日付でパーティション分割されたメインのテーブル群。普段の分析はこちらを使います(例:p_ads_Campaign_1234567890p_ads_CampaignBasicStats_1234567890
  • ads_ を含む末尾のアカウントID: どのGoogle広告アカウントのデータかを表します
  • 種類が分かれている: 「マスタ系(構造)」と「スタッツ系(実績数値)」に分かれているのが基本です

ざっくり分類すると、こんなイメージです。

種類中身
マスタ(構造)Campaign / AdGroup / Keywordキャンペーン名・状態などの属性
スタッツ(実績)CampaignBasicStats など各種 *Stats表示回数・クリック・費用などの数値

最初に見るべきテーブル

最初は全部を理解しようとせず、「キャンペーン構造」×「キャンペーン実績」 の2つから始めるのがおすすめです。

  • キャンペーンの名前や状態 → Campaign 系のテーブル
  • キャンペーンごとの費用・クリック・表示回数 → CampaignBasicStats 系のテーブル

この2つを campaign_id でつなぐだけで、「どのキャンペーンにいくら使ったか」がすぐ出せます。

💡 補足

費用(コスト)は、多くのスタッツテーブルで マイクロ単位(micros) で格納されています。つまり実際の金額の100万倍の整数です。円に直すときは / 1000000 してください。ここを忘れると「広告費が1億円になってる!」と一瞬びっくりします。


確認SQL:直近のキャンペーン別コスト

連携できているか確認するために、直近7日間のキャンペーン別コストを出してみましょう。テーブル名のアカウントID部分(1234567890)はご自身のものに置き換えてください。

SELECT
  c.campaign_name,
  SUM(s.metrics_cost_micros) / 1000000 AS cost_jpy,
  SUM(s.metrics_clicks)                AS clicks,
  SUM(s.metrics_impressions)           AS impressions
FROM
  `myproject.ads_raw.p_ads_CampaignBasicStats_1234567890` AS s
JOIN
  `myproject.ads_raw.p_ads_Campaign_1234567890` AS c
  ON s.campaign_id = c.campaign_id
  AND s._DATA_DATE = c._DATA_DATE
WHERE
  s._DATA_DATE BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)
                   AND CURRENT_DATE()
GROUP BY
  c.campaign_name
ORDER BY
  cost_jpy DESC

ポイントは3つです。

  • metrics_cost_micros/ 1000000 して円に直している
  • マスタとスタッツを campaign_id で結合している
  • _DATA_DATE(取り込み日付のパーティション列)で期間を絞っている

💡 補足

実際のカラム名は環境やDTSのバージョンで微妙に異なることがあります(campaign_namecampaign_descriptive_name か、など)。クエリが通らないときは、BigQueryコンソールでテーブルのスキーマ(カラム一覧)を一度開いて、実在するカラム名を確認してから調整してください。

このクエリが数字を返したら、連携は成功です。あとは毎朝、自動で最新データが積み上がっていきます。


よくあるエラーと対処

最初の設定では、だいたい同じところでつまずきます。先回りして潰しておきましょう。

⚠️ 注意:権限不足エラー

「Permission denied」「アクセス権がありません」系のエラーは、ほぼ権限の問題です。(1) 転送を設定する自分のGCP権限、(2) 承認したGoogleアカウントがそのGoogle広告アカウントを閲覧できるか、の2点を確認してください。とくに(2)は見落としがちです。

⚠️ 注意:データが空・日付がずれる(タイムゾーン)

「取り込みは成功しているのに今日のデータが入っていない」場合、タイムゾーンの差や、Google広告側のレポート確定タイミングが原因のことが多いです。当日のデータはまだ確定していない場合があるため、確認は前日以前のデータで行うのが確実です。データセットのロケーションと、レポートの基準タイムゾーンも合わせて確認しましょう。

⚠️ 注意:思ったよりコストがかかる

DTSの転送自体は無料ですが、テーブルが増えると SELECT * を投げたときのスキャン量が膨らみます。_DATA_DATE で期間を絞る、必要なカラムだけ選ぶ、を徹底するだけでコストは大きく変わります。詳しくは BigQueryのコストを抑えるコツ を参考にしてください。

⚠️ 注意:過去データが入っていない(バックフィル)

転送を作った時点より前のデータは自動では入りません。過去分が欲しい場合は、コンソールの転送設定の画面から バックフィル(過去日付の再実行) を手動で実行します。期間を指定して過去にさかのぼって取り込めますが、範囲が広いと時間がかかるので、必要な期間に絞って実行しましょう。


まとめ

ここまでで、Google広告のデータがBigQueryへ毎日自動で流れ込む状態ができました。振り返ると、やったことはシンプルです。

  1. GCPプロジェクト・課金・APIを準備する
  2. 宛先データセットを作る
  3. DTSの転送をコンソール(または bq)で作成する
  4. 生成されたテーブルを確認SQLでチェックする

一度組んでしまえば、あとは手作業ゼロでデータが積み上がっていきます。ここからが本番で、広告データ単体で見るよりも、GA4の成果データと結合してこそ価値が出ます。

次のステップとしては、まず GA4とGoogle広告を結合してキーワード単位の真のROASを計算する に進むのがおすすめです。広告費とコンバージョンを同じSQLの上で扱えるようになると、「どのキャンペーンが本当に効いているか」がはっきり見えてきます。複数媒体をまとめて眺めたい場合は Looker Studioのブレンディングで媒体横断ROASを可視化する も役立ちます。

まずは1アカウント・1データセットで、小さく連携を始めてみてください。