どのやり方で自動化するか(30秒で選ぶ) 先に結論です。Google公式の手段は4つあり、選び方は用途で決まります。
Looker Studio コネクタ
難易度: ★☆☆(画面操作のみ) 出力先: ダッシュボード 費用: 無料 弱点: 生データを加工しにくい Google Ads スクリプト
難易度: ★★☆(JS少し) 出力先: スプレッドシート 費用: 無料 弱点: 1アカウントずつ・30分制限 BigQuery Data Transfer
難易度: ★★☆(SQLは必要) 出力先: BigQuery 費用: 転送は無料(保存・クエリ課金のみ) 弱点: テーブル構造の理解が要る Ads API 直連携
難易度: ★★★(開発者トークン+実装) 出力先: 自由(スプシ/DB/BI) 費用: API自体は無料 弱点: 審査・認証・保守の手間 Google広告レポート自動化の4つのやり方。コストはいずれも無料〜低額で、違いは「どこに出すか」と「書くコードの量」 図のとおり、どのやり方も費用はほぼかかりません。違いが出るのは、出力先と書くコードの量です。
ダッシュボードで見られれば十分 → やり方1(Looker Studio) スプレッドシートに欲しい → やり方2(Google Adsスクリプト) AI分析や他媒体・自社データとの組み合わせまでやりたい → やり方3(BigQuery転送) 社内システムや独自ツールに組み込みたい → やり方4(Ads API直連携) 順に設定手順を見ていきます。
やり方1: Looker Studioで無料ダッシュボードにする いちばん簡単な方法です。Looker Studio(旧データポータル)にはGoogle広告のネイティブコネクタが組み込まれており、画面操作だけでつながります。以下、コピペで完走できる手順です。
(本記事のUI表記は2026年7月時点のものです。Looker Studio・Google広告・Google CloudコンソールいずれもUIは頻繁に更新されるため、以降の各手順でも同様の前提で読んでください。)
手順1: Looker Studioで新規レポートを作る ブラウザで https://lookerstudio.google.com/ を開き、Google広告アカウントの閲覧権限を持つGoogleアカウントでログインします(初回は利用規約の同意画面が出るので、国と会社名を入力し、チェックを入れて「続行」をクリックします) 画面左上の「+ 作成 」(カラフルな+アイコン)をクリックし、開いたメニューの「レポート 」をクリックします 「レポートにデータを追加」というダイアログが自動で開きます。Google Connectorsの一覧から「Google 広告 」タイル(黄緑色のアイコン)をクリックします 手順2: Google広告アカウントを接続する 「承認」ボタンが表示されるので「承認 」をクリックし、開いたGoogleアカウントの選択画面で、対象のGoogle広告アカウントにアクセスできるアカウントを選択し、権限確認画面で「許可 」をクリックします 画面が戻ると、右側に自分がアクセスできるGoogle広告アカウントの一覧が表示されます。「アカウント 」欄で対象アカウント(MCCの場合は配下の広告アカウント名)をクリックして選択します MCCで一括表示したい場合は、上部の「アカウント」列でMCCを選ぶと配下アカウントが表示されます。ここでは対象の広告アカウントを1つ選び、右下の「追加 」ボタンをクリックします 「このレポートにデータを追加しようとしています」という確認ダイアログが出るので「レポートに追加 」をクリックします 手順3: 表・グラフを配置して確認する 空のレポートキャンバスと、右側に「データ」パネル(ディメンションと指標の一覧)が表示された状態になります 画面上部メニューの「挿入 」→「表 」(先頭の表アイコン)をクリックし、キャンバス上の好きな位置をクリックすると表が配置されます 右パネルの「ディメンション」欄に「日付」「キャンペーン」、「指標」欄に「インプレッション」「クリック数」「費用」「コンバージョン」をドラッグ&ドロップします 画面右上の「表示 」ボタン(目のアイコン)をクリックすると、実際のデータが入った状態でプレビューできます ここまでの確認 : 表に日別・キャンペーン別の実績数値が入っていれば成功です。左上のレポート名をクリックして分かりやすい名前(例: Google広告 日次レポート)に変更し、右上の「共有 」ボタン横のフォルダアイコンで保存先を指定して保存すれば、以降は同じURLを開くだけで最新の数字が見られる状態になります。
難点は、データの更新間隔がおおむね12時間ごとに寄り、リアルタイムの数字は追えないこと。加えて生データを加工しにくく、「手数料を上乗せした請求ベースの金額で見たい」「別集計の売上と突き合わせたい」といった要件が出てきた時点で手狭になります。
無料ダッシュボードとしての位置づけや他ツールとの比較は広告レポート自動化ツール比較|主要9ツールの料金・対応媒体・選び方 で整理しました。
やり方2: Google Adsスクリプトでスプレッドシートに自動出力する 「レポートはスプレッドシートで欲しい」なら、この方法です。Google Adsスクリプトは広告アカウントに内蔵されたJavaScript実行環境で、開発者トークンもOAuth設定も要りません。以下、書き込み先スプレッドシート作成からスケジュール実行までコピペで完走できる手順です。
手順1: 書き込み先のスプレッドシートを用意する ブラウザで https://docs.google.com/spreadsheets/ を開き、広告アカウントの閲覧権限を持つGoogleアカウントでログインします 画面左上の「空白のスプレッドシート 」(+の付いたタイル)をクリックして新規作成します 画面左上の「無題のスプレッドシート」という文字をクリックし、ファイル名を分かりやすい名前(例: Google広告 日次レポート)に変更してEnterキーを押します ブラウザのアドレスバーに表示されているURL(https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/edit#gid=0)を丸ごとコピーして、メモ帳などに控えます。後述のコード中の スプレッドシートのURL に貼り付けます 手順2: Google広告の「スクリプト」画面を開く ブラウザで https://ads.google.com/ を開き、レポートを取りたい広告アカウント(またはMCC)でログインします 画面上部右側の「ツールと設定 」(スパナのアイコン)をクリックします 開いたメガメニューの「一括操作 」列にある「スクリプト 」をクリックします(新しいUIでは左メニューの「管理者」→「一括アクション」→「スクリプト」にある場合もあります) 「スクリプト」画面が開くので、青い「+ 」ボタン(新規スクリプトの作成)をクリックします スクリプトエディタが開きます(初期状態はサンプルコードやコメント入りのテンプレートが入っていることが多いですが、次の手順で全削除するので実害はありません) 手順3: コードを貼り付けて認可する エディタの既存コードを全選択(Ctrl+A / Cmd+A)して削除し、以下のコードを丸ごと貼り付けます。スプレッドシートのURL の部分は、手順1でコピーしたURLに置き換えてください (前後のクォートは残す) /**
* Google広告のキャンペーン別・日別レポート(過去30日)を
* 指定スプレッドシートのアクティブシートに書き込む
*/
function main () {
const query =
'SELECT segments.date, campaign.name, metrics.clicks, ' +
'metrics.cost_micros, metrics.conversions ' +
'FROM campaign WHERE segments.date DURING LAST_30_DAYS ' +
'ORDER BY segments.date' ;
// ↓「スプレッドシートのURL」を手順1で控えたURLに置き換える
const sheet = SpreadsheetApp. openByUrl ( 'スプレッドシートのURL' ). getActiveSheet ();
sheet. clear (); // 前回の書き込みを消してから最新データを流し込む
AdsApp. report (query). exportToSheet (sheet);
} 画面上部の左上にある「無題のスクリプト」という文字をクリックし、スクリプト名を分かりやすい名前(例: daily-report-fetch)に変更します 右上の「保存 」をクリックします 「実行 」ボタン(右上、または画面下部)をクリックすると、初回は「認可が必要です」というダイアログが出ます。「認可を確認 」→ アカウント選択画面で対象Googleアカウントを選択 →「このアプリは Google で確認されていません」と出た場合は「詳細」→「(スクリプト名)(安全ではないページ)に移動」→ 最後に「許可 」の順にクリックします 画面下部にログが表示され、エラーなく完了すれば、手順1のスプレッドシートに segments.date / campaign.name / metrics.clicks / metrics.cost_micros / metrics.conversions の列と、過去30日分のデータが書き込まれているはずです ここまでの確認 : スプレッドシートを開き直して、日別・キャンペーン別の行が入っていれば成功です。エラーになった場合は画面下部の実行ログに詳細が出るので、URLの貼り間違い(docs.google.com/spreadsheets/d/... の形式か)を最初に確認してください。
手順4: 毎日自動実行するスケジュールを設定する スクリプト一覧画面に戻り、作ったスクリプト行の左端にあるオンオフのトグルスイッチをONにします 同じ行の「頻度 」列に表示されている「なし」のリンク(または鉛筆アイコン)をクリックすると、スケジュール設定ダイアログが開きます 「頻度」プルダウンで「毎日 」を選択し、実行時刻をレポートを見たい時刻より前(例: 「午前 6:00〜7:00 」)に指定します 「保存 」をクリックします スクリプト一覧の対象行の「頻度」列が「毎日 6時〜7時」のようになっていれば設定完了です 翌朝、指定した時刻帯の後にスプレッドシートを開いて、最新日付までのデータが入っていれば自動化が動いています。実行ログはスクリプト一覧の「ログ 」列(アイコン)から確認できます。
MCC(管理アカウント)のスクリプトなら複数アカウントの横断も可能です。
難点は1実行あたり最大30分という壁と、出力先が実質スプレッドシートに限られることの2点。アカウント数が多い代理店や、大量の検索語句データを扱う場合は、実行時間の上限に当たります。GASでスプレッドシートに書き込む一般的な設計は広告レポートをスプレッドシート×GASで自動化する方法 で扱っています。
やり方3: BigQuery Data Transferで毎日自動蓄積する(転送無料) 複数の切り口で分析したい、AIに分析させたい、他のデータと組み合わせたい。そうなったときの本命がこれです。BigQuery Data Transfer Service(DTS)のGoogle Ads転送を設定すると、広告アカウントの全レポートデータが毎日BigQueryに自動で溜まります。
Google広告アカウント/MCC
→
Data Transfer毎日自動転送(無料)
→
BigQuery生データを蓄積
→
SQL/dbt集計・整形
→
レポートLooker Studio/スプシ
Meta・Yahoo!など他媒体も同じBigQueryに集約すれば、媒体横断レポートまで自動化できる
Google広告データをBigQueryに集約する構成。転送さえ設定すれば、毎日の取り込みは全自動で回る 設定は画面操作だけで、開発者トークンも不要です。以下、コピペで完走できる手順です。
手順1: Google Cloudプロジェクトを用意する ブラウザで https://console.cloud.google.com/ を開き、広告アカウントにアクセスできるGoogleアカウントでログインします(初回は利用規約の同意画面が出るので、国とチェックを入れて「同意して続行」をクリックします) 画面上部バー左側の、Google Cloudロゴの右隣にあるプロジェクト名のプルダウンをクリックし、開いたダイアログ右上の「新しいプロジェクト 」をクリックします(既存プロジェクトを使う場合はこの手順をスキップし、対象プロジェクトを選択します) 「プロジェクト名」に任意の名前(例: ads-bq-transfer)を入力し、「作成」をクリックします。数十秒後、右上ベルアイコン(通知)に完了通知が出るので、通知内の「プロジェクトを選択」をクリックします(上部バーのプロジェクト名が今作った名前になっていることを確認) 請求先アカウントの紐付けが必須 です。画面左上のナビゲーションメニュー(三本線「≡」アイコン)→「お支払い 」をクリックし、請求先アカウントがなければ「請求先アカウントをリンク 」から作成・紐付けを行います(クレジットカード登録が必要ですが、無料枠内なら課金は発生しません)手順2: BigQuery APIとData Transfer APIを有効化する 画面左上のナビゲーションメニュー「≡」→「APIとサービス 」→「ライブラリ 」をクリックします 検索ボックスに BigQuery API と入力し、検索結果の「BigQuery API」をクリックして「有効にする 」をクリックします(すでに有効の場合は「管理」ボタンが表示されます) 同じくライブラリで BigQuery Data Transfer API を検索し、「有効にする」をクリックします ここまでの確認 : 「APIとサービス」→「有効なAPIとサービス」の一覧に「BigQuery API」と「BigQuery Data Transfer API」の両方が表示されていれば成功です。
手順3: BigQueryで転送先データセットを作る 画面左上のナビゲーションメニュー「≡」→「BigQuery 」をクリックします(初回はエディタの初期化に少し時間がかかります) 画面左のエクスプローラーで、上部バーのプロジェクト名の右にある「⋮ 」(縦三点)をクリックし、「データセットを作成 」を選択します 表示された右パネルに次のとおり入力します「データセット ID」→ 任意の名前(例: google_ads。半角英数と _ のみ使用可) 「ロケーション タイプ」→ 「リージョン」を選択し、プルダウンから「asia-northeast1(東京) 」を選択(後で変更できないため慎重に) 他の項目はデフォルトのまま 右下の「データセットを作成 」ボタンをクリックします 左のエクスプローラーでプロジェクトの下に、今作ったデータセット(例: google_ads)が表示されていれば準備OKです。
手順4: Data Transfer(転送)を作成する 画面左のナビゲーション(BigQueryセクション内)で「データ転送 」をクリックします。API有効化直後はメニューが反映されるまで数分かかることがあるので、見つからない場合はページを再読み込みするか、少し待ってから開き直してください。上部の検索ボックスに「Data Transfer」と入力しても到達できます 初回アクセス時にロケーション選択ダイアログが出たら、手順3で作ったデータセットと同じ「asia-northeast1(東京) 」を選択します 画面上部の「+ 転送を作成 」ボタンをクリックします 表示されたフォームを次のとおり入力します「ソースタイプ」→ 「Google Ads 」を選択 「表示名」→ 任意の名前(例: Google Ads Daily Transfer) 「スケジュールのオプション」→ 「繰り返しの頻度」= 「日次」、「開始時刻」= 実行したい時刻(例: 08:00 JST) 「宛先の設定」→ 「データセット」欄で手順3で作ったデータセット(例: google_ads)を選択 「データソースの詳細」→ 「Customer ID」に、データを取りたい広告アカウントのお客様ID (管理画面右上に 123-456-7890 の形式で表示されるものを、ハイフンなしの10桁 、例: 1234567890 で入力)。MCCのIDを指定すれば配下アカウントを一括転送できます 「更新枠(日数)」→ デフォルトの 7 のまま(過去7日分を毎回洗い替えでコンバージョン遅延を補正) 「保存 」をクリックします 「Google Ads を承認」ダイアログが開くので、対象の広告アカウント(またはMCC)にアクセスできるGoogleアカウントを選択し、権限確認画面で「許可 」をクリックします。認可に使うGoogleアカウントは、対象広告アカウントの管理者権限を持っている必要があります(閲覧権限だけだと転送作成自体は通ってもデータが同期されず、手順5の実行履歴が成功にならない原因になります) 手順5: 転送を手動で実行して確認する 「データ転送」画面の一覧から、今作った転送(例: Google Ads Daily Transfer)をクリックします 詳細画面上部の「転送を今すぐ実行 」→「転送実行を開始 」をクリックすると、初回転送が開始されます(数分〜数十分で完了) ページ内「実行履歴」で最新行が「成功 」(緑チェック)になれば成功です 左のエクスプローラーで手順3のデータセットを展開し、ads_Campaign_<customer_id>(キャンペーン属性)や ads_CampaignBasicStats_<customer_id>(インプレッション・クリック・費用などの指標)といったテーブルが並んでいれば、正常にデータが入っています ここまでの確認 : エディタで以下のSQLを実行して、行が返ってくれば成功です。<customer_id> は手順4で入れたIDに置き換えてください。
SELECT
s . _DATA_DATE AS date ,
c . campaign_name ,
SUM ( s . metrics_impressions ) AS impressions,
SUM ( s . metrics_clicks ) AS clicks,
SUM ( s . metrics_cost_micros ) / 1000000 AS cost_jpy,
SUM ( s . metrics_conversions ) AS conversions
FROM `プロジェクトID.google_ads.ads_CampaignBasicStats_<customer_id>` AS s
JOIN `プロジェクトID.google_ads.ads_Campaign_<customer_id>` AS c
ON s . campaign_id = c . campaign_id
AND c . _DATA_DATE = s . _DATA_DATE
WHERE s . _DATA_DATE = DATE_SUB(CURRENT_DATE( 'Asia/Tokyo' ), INTERVAL 1 DAY )
GROUP BY date , c . campaign_name
ORDER BY cost_jpy DESC ; 属性テーブルと指標テーブルを campaign_id でJOINして使うのが基本構造です。翌日以降は、手順4で設定した時刻に自動で転送が走り、テーブルが日次で更新されます。
費用面が優秀で、Google Ads転送そのものは無料。かかるのはBigQueryのストレージとクエリ料金だけで、月10GiBの保存・1TiBのクエリまでの無料枠(2026年7月時点)に広告レポート程度のデータ量は収まることが多く、実質0円で回せます。転送はデフォルトで過去7日分を毎回洗い替えるため、コンバージョンの計上遅れも勝手に補正されます。
実務で気をつけるのは、指標テーブルに CampaignStats ではなく CampaignBasicStats を使うこと。Stats系はクリック種別などで行が分かれており、素朴にSUMすると数字が合わなくなります。加えてSQLを書ける人がチームに要ります。クエリの書き方次第でスキャン課金が変わる点は、BigQueryのコスト設計に踏み込むBigQueryの料金体系とコスト削減|課金トラップと対策 に譲ります。
やり方4: Ads APIで自由に取得する 社内システムへの組み込み、独自ツールの開発、リアルタイムに近い取得。ここまで来るとAds API直連携です。いちばん自由ですが、いちばん段取りが要ります。順を追って、コピペで完走できる粒度で説明します。
事前に必要なもの やり方4は前提物が多く、途中で足りないことに気づくと詰まります。着手前に以下が揃っているか確認してください。
MCC(管理アカウント)と、対象広告アカウントの管理者権限(1-2でMCCにリンクするため) Google Cloudプロジェクトを作成できる権限と、請求先アカウント(=クレジットカード登録済みのGoogleアカウント) OAuth同意画面を公開ステータスに切り替えられる権限(=プロジェクトの編集者以上) Python 3.9以上が動くローカル環境 レポートの取得先となるサーバー・PC(後述のスクリプトを実行する場所) 手順1: 開発者トークン(Developer Token)を取得する Ads APIを呼ぶには開発者トークンが必須で、取得にはMCC(管理アカウント)が必要 です。通常の広告アカウントからは申請できないため、持っていなければ先にMCCを無料で作成します。
1-1. MCC(管理アカウント)を用意する すでにMCCがある場合はこの手順をスキップします。ない場合はブラウザで https://ads.google.com/home/tools/manager-accounts/ を開き、「利用を開始 」(Create a manager account)をクリックします Googleアカウントでログインし、「アカウント名」に任意の名前(例: 自社MCC)を入力、「このアカウントの用途」で「自社の広告を管理する 」を選択、「請求先の国」と「タイムゾーン」((GMT+09:00) 東京)、通貨(日本円 JPY)を選択して「送信 」をクリックします MCCが作成され、10桁のお客様ID(123-456-7890 の形式で右上に表示)が発行されます。これをMCCのお客様ID として控えます 1-2. 対象の広告アカウントをMCCにリンクする 開発者トークンでアクセスできるのは、そのトークンを発行したMCCにリンクされている広告アカウントだけです。 忘れると後の実行が必ず PERMISSION_DENIED で失敗します。
MCCにログインした状態で、左メニューの「アカウント 」→「サブアカウント設定 」(またはアカウント一覧右上の「+」)→「既存のアカウントをリンク 」をクリックします データを取りたい広告アカウントのお客様ID (10桁、123-456-7890 形式)を入力し、「送信 」をクリックします 対象の広告アカウント側にログインし、「ツールと設定 」(スパナ)→「設定」列の「アクセスと権限 」→ 上部タブ「管理者 」を開き、届いているリンク申請を「承認 」します MCCの「アカウント」一覧に、リンクした広告アカウントが表示されれば成功です 1-3. APIセンターで開発者トークンを申請する MCCにログインした状態で、画面右上の「ツールと設定 」(スパナのアイコン)をクリックします 開いたメガメニューの「設定 」列の「APIセンター 」をクリックします(新しいUIでは左メニューの「管理者 」→「APIセンター」にある場合があります) 表示されたフォームに次の内容を入力します「会社名」→ 貴社の正式名称 「会社のウェブサイト」→ 自社サイトURL 「連絡先メールアドレス」→ 通知が届くアドレス 「API利用の目的」→ 「自社アカウントのレポートを日次で取得し、BigQueryに保存する 」のように、対象・頻度・保存先 を具体的に書く(曖昧だと却下されやすい) 「主に使う機能」→ 「Reporting」等、レポート取得目的なら該当項目にチェック 「利用規約に同意する」にチェックを入れて「送信 」をクリックします 画面上部に Developer token の欄が現れ、ABCdefGHIjklMNOpqrsTUV のような22文字前後の文字列 が発行されます。これを開発者トークン として控えます ここまでの確認 : APIセンター画面に「開発者トークン」の値と、現在のアクセスレベル(初期は「テストアカウントのみ」)が表示されていれば発行成功です。この時点ではテストアカウントに対してのみAPI呼び出しが可能で、本番アカウントに対してはBasicアクセスの承認後に使えるようになります。
したがって、発行直後の検証パスは次のいずれかです。
本番のレポート取得が目的 なら、次の1-4を読んでBasicアクセスを申請し、承認後に手順2以降へ進むとりあえず動作確認したい なら、MCCから「テストアカウント」を1つ作成し(公式手順 )、以降の手順で使う customer_id をそのテストアカウントのIDに置き換えて先に進むこの使い分けを飛ばして、承認前の本番アカウントIDでいきなり手順3のスクリプトを走らせると、確実に DEVELOPER_TOKEN_NOT_APPROVED で落ちます。
1-4. アクセスレベルを理解する トークンには4つのアクセスレベルがあります(2026年7月時点)。
アクセスレベル 使える相手 操作数の上限 取得 テスト テストアカウントのみ 15,000/日 即時 Explorer 本番アカウント可 2,880/日 発行時に自動付与 Basic 本番・テスト 15,000/日 申請後、公式目安は約2営業日(遅延時で1週間前後) Standard 本番・テスト ほぼ無制限 Basic取得後に申請、実務体感で1〜2週間程度
(テスト列の15,000/日は「テストアカウント環境での上限」を指します。Explorerでもテストアカウントに対しては15,000/日まで叩けます。)
重要なのは、レポート取得の search/searchStream は1リクエスト=1オペレーション として数えられることです。何万行返ってきても1回は1回。日次レポートを取るだけならBasicの15,000/日で余裕があり、Standardまで必要になるのは外部提供ツールを作るケースがほとんどです。
BasicアクセスへのアップグレードはAPIセンター画面の「アクセスレベル 」欄の「適用 」(Apply)ボタンから申請できます。表示された追加フォームで、より詳細な利用目的とリクエスト数見込みを記入して送信します。
手順2: OAuth 2.0認証を通してリフレッシュトークンを取得する 開発者トークンとは別に、OAuth 2.0のクレデンシャル(クライアントID・クライアントシークレット・リフレッシュトークン)が要ります。以下、Google CloudコンソールでOAuthクライアントを作り、OAuth Playgroundでリフレッシュトークンを取るところまで通します。
2-1. Google CloudでOAuthクライアントを作成する ブラウザで https://console.cloud.google.com/ を開き、Googleアカウントでログインします(初回は利用規約に同意) 画面上部バー左側、Google Cloudロゴの右隣にあるプロジェクト名のプルダウンをクリックし、開いたダイアログの右上の「新しいプロジェクト 」をクリックします(既存プロジェクトを使う場合はスキップ) 「プロジェクト名」に任意の名前(例: ads-api-report)を入力し、「作成 」をクリックします。作成完了後、通知内の「プロジェクトを選択」で切り替えます 画面左上のナビゲーションメニュー(三本線「≡」アイコン)→「APIとサービス 」→「OAuth 同意画面 」をクリックします(現在は「Google Auth Platform」の設定画面に案内されます) 「開始 」をクリックし、次のとおり入力して進みます「アプリ名」→ 任意の名前(例: ads-api-report) 「ユーザーサポートメール」→ 自分のメールアドレスを選択 「対象」(User Type)→ Google Workspace契約があり社内利用だけなら「内部 」、個人のGmailアカウントなら「外部 」 「連絡先情報」→ 自分のメールアドレスを入力 ポリシー同意にチェックを入れて「作成 」をクリックします 手順5で「外部」を選んだ場合は、左メニューの「対象 」を開き、「テストユーザー」欄の「+ Add users 」で、この後の認可に使う自分のGoogleアカウント(対象広告アカウントとMCCにアクセスできるもの)を追加し「保存 」します 左メニューの「クライアント 」→「+ クライアントを作成 」をクリックし、次のとおり設定します「アプリケーションの種類」→ 「ウェブ アプリケーション 」 「名前」→ 任意の名前(例: ads-api-oauth-client) 「承認済みのリダイレクト URI」→ 「+ URI を追加」をクリックし、https://developers.google.com/oauthplayground と入力(末尾スラッシュなしが基本。もしOAuth Playground側で redirect_uri_mismatch が出た場合は、末尾スラッシュ付きの https://developers.google.com/oauthplayground/ も追加登録してから再試行してください) 「作成 」をクリックすると、「クライアント ID 」(〜.apps.googleusercontent.com という形式)と「クライアント シークレット 」がダイアログに表示されます。この画面を閉じるとシークレットは再表示できないため、必ず両方をこの場でコピーしてパスワード管理ツールなどに保存してください (再発行は可能ですが手間がかかります) ナビゲーションメニュー「≡」→「APIとサービス」→「ライブラリ 」を開き、検索ボックスに Google Ads API と入力し、検索結果の「Google Ads API 」をクリックして「有効にする 」をクリックします 「APIとサービス」→「有効なAPIとサービス」の一覧に「Google Ads API」が表示され、「クライアント」画面に作成したOAuthクライアントの行があれば準備完了です。
2-2. OAuth Playgroundでリフレッシュトークンを取得する ブラウザで https://developers.google.com/oauthplayground を開きます 画面右上の歯車アイコン (OAuth 2.0 configuration)をクリックし、「Use your own OAuth credentials 」にチェックを入れます 「OAuth Client ID」と「OAuth Client secret」に、2-1手順9で控えた値をそれぞれ貼り付けます(コピペ時に前後スペースが入らないよう注意) 画面左の「Step 1 Select & authorize APIs 」の下部にある入力欄「Input your own scopes 」に以下を入力します https://www.googleapis.com/auth/adwords 「Authorize APIs 」ボタンをクリックします Googleのアカウント選択画面が開くので、対象広告アカウントとMCCの両方にアクセスできるGoogleアカウント を選択します。「このアプリは Google で確認されていません」と出た場合は「詳細」→「(アプリ名)(安全ではないページ)に移動」をクリックし、権限一覧で「許可 」(Continue)をクリックします Playground画面に戻ると「Step 2 Exchange authorization code for tokens 」が開くので、「Exchange authorization code for tokens 」ボタンをクリックします 「Refresh token 」欄に 1// で始まる長い文字列が表示されるので、これをコピーして控えます。これがリフレッシュトークンです ここまでの確認 : 「Refresh token」欄が 1// で始まる文字列で埋まっていれば成功です。空のままの場合は、Googleアカウントのアクセス権管理 で該当アプリのアクセス権を一度削除してから、手順6からやり直してください。
注意: OAuth同意画面の公開ステータスが「テスト」のままだと、リフレッシュトークンは7日で失効 します。継続運用する場合は、Google Auth Platformの「対象」画面にある「アプリを公開 」をクリックして本番ステータスにしておいてください。
2-3. (代替案)サービスアカウントで認証する 自社アカウントのバッチ処理を定期実行するなら、本来はサービスアカウント一択です。リフレッシュトークンの失効管理が不要になり、サーバー運用がぐっと楽になります。ただし、サービスアカウントのメールアドレスはメール受信ができないため、Google広告UIから通常ユーザーと同じ「招待→受諾」フローで追加することはできません。多くの場合、MCC経由でのリンク付けや、事前に承認された連携経路を用意する必要があります。設定パターンは環境(自社MCCの有無、既存のGCPユーザー連携、対象アカウント数)によって変わるため、公式ドキュメント を必ず参照してください(1つのサービスアカウントに直接紐付けられるのは20アカウントまで。それ以上はMCC経由でカバーします)。
以降のコード例は、記事として一気通貫で試しやすい2-2のリフレッシュトークン方式で書いています。本番の定期実行に載せるときは、google-ads.yaml を公式ドキュメントのサービスアカウント形式に置き換えて動かしてください。
手順3: Pythonクライアントで実際にレポートを取得する ここまでで揃うのは以下の値です。手元にコピーしてから次に進んでください。
開発者トークン (1-3)クライアントID (2-1)クライアントシークレット (2-1)リフレッシュトークン (2-2)login-customer-id (1-1のMCCのお客様ID、ハイフンなし10桁)customer_id (データを取りたい広告アカウントのお客様ID、ハイフンなし10桁)3-1. 実行環境を用意する Python 3.9以上がインストールされていることを確認します(ターミナルで python3 --version を実行) 作業用ディレクトリを作り、仮想環境を作成・有効化します mkdir ads-api-report && cd ads-api-report
python3 -m venv .venv
source .venv/bin/activate # Windowsは .venv\Scripts\activate 公式クライアントライブラリをインストールします。ライブラリのバージョンによって対応するAPIバージョンが変わるため、範囲を固定するのがおすすめです(例では2026年7月時点で現行のv25系に対応する27系を指定) pip install "google-ads>=27,<28" 原則として、ライブラリの最新版がその時点のAPIの最新versionに対応します。バージョン範囲を切っておくと、意図せず後方非互換のライブラリに上がって import 時点で壊れる、といった事故を避けられます。
3-2. 認証情報ファイル google-ads.yaml を作る 作業ディレクトリ直下に google-ads.yaml というファイルを新規作成し、以下を貼り付けます。5か所のプレースホルダを、手順3冒頭で控えた値に置き換えてください (前後の引用符は残す) # google-ads.yaml — 認証情報ファイル(このファイルはGitにコミットしない)
developer_token : 'ここに開発者トークン(手順1-3で控えた22文字前後の文字列)'
client_id : 'ここにクライアントID(〜.apps.googleusercontent.com)'
client_secret : 'ここにクライアントシークレット'
refresh_token : 'ここにリフレッシュトークン(1// で始まる文字列)'
login_customer_id : '1234567890' # MCCのお客様ID(ハイフンなし10桁)
use_proto_plus : True なお、明示的にAPIバージョンを固定したい場合は、上記に加えて api_version: v25 のような1行を追加してください。指定がなければ、インストールしているライブラリが対応する最新versionが使われます。
このファイルはGitにコミットしないでください 。.gitignore に google-ads.yaml を追加しておくのが安全ですecho "google-ads.yaml" >> .gitignore 3-3. レポート取得スクリプトを作って実行する 作業ディレクトリ直下に fetch_report.py というファイルを作り、以下を貼り付けます。customer_id = "1234567890" の10桁を、データを取りたい広告アカウントのお客様IDに置き換えてください """
Google広告のキャンペーン別・日別レポート(過去30日)を取得して標準出力に表示する。
実行前準備:
- 手順1〜2で開発者トークン・OAuthクレデンシャルを取得済み
- 手順3-2で google-ads.yaml を作成済み
- pip install google-ads 済み
実行: python fetch_report.py
"""
from google.ads.googleads.client import GoogleAdsClient
from google.ads.googleads.errors import GoogleAdsException
def main ():
# google-ads.yaml を読み込む(カレントディレクトリのファイルを指定)
client = GoogleAdsClient.load_from_storage( path = "./google-ads.yaml" )
# サービス取得時にAPIバージョンを明示できる(執筆時点で現行のv25。約1年でサンセット)。
# yaml側に api_version を書いた場合は version 引数は省略可。
ga_service = client.get_service( "GoogleAdsService" , version = "v25" )
query = """
SELECT
segments.date,
campaign.id,
campaign.name,
metrics.impressions,
metrics.clicks,
metrics.cost_micros,
metrics.conversions
FROM campaign
WHERE segments.date DURING LAST_30_DAYS
ORDER BY segments.date
"""
# ↓ データを取りたい広告アカウントのお客様ID(ハイフンなし10桁)に書き換える
customer_id = "1234567890"
try :
stream = ga_service.search_stream( customer_id = customer_id, query = query)
print ( "date \t campaign_name \t clicks \t cost_jpy \t conversions" )
for batch in stream:
for row in batch.results:
cost_jpy = row.metrics.cost_micros / 1_000_000 # 100万分の1単位を通貨単位へ
print (
f " { row.segments.date }\t{ row.campaign.name }\t "
f " { row.metrics.clicks }\t{ cost_jpy :.0f }\t{ row.metrics.conversions } "
)
except GoogleAdsException as ex:
# よくあるエラー:
# DEVELOPER_TOKEN_NOT_APPROVED → 本番未承認(テストアカウントで検証)
# USER_PERMISSION_DENIED → MCCに広告アカウント未リンク or 認可アカウントに権限なし
# invalid_grant → リフレッシュトークン期限切れ(2-2をやり直し)
print ( f "エラー: request_id= { ex.request_id } " )
for error in ex.failure.errors:
print ( f " { error.error_code } : { error.message } " )
raise
if __name__ == "__main__" :
main() ターミナルで以下を実行します python fetch_report.py 「日付・キャンペーン名・クリック数・費用(円)・コンバージョン数」のヘッダーに続いて、過去30日の日別×キャンペーン別の行がタブ区切りで表示されれば成功です ここまでの確認 : 標準出力に行が流れれば成功。何も出ない場合はデータ0件(テストアカウントや配信停止中)、GoogleAdsException が出た場合はメッセージで切り分けます。DEVELOPER_TOKEN_NOT_APPROVED は1-3の本番承認待ち(テストアカウントで検証)、USER_PERMISSION_DENIED は1-2のMCCリンクか2-2の認可アカウント権限を確認、invalid_grant は2-2のリフレッシュトークンをやり直します。
期間は DURING LAST_30_DAYS のほか BETWEEN '2026-07-01' AND '2026-07-31' のような指定もできます。GAQL(Google Ads Query Language)で使えるフィールドやセグメントの一覧は公式リファレンス で参照できます。
これをCloud FunctionsやCloud Runに載せてスケジュール実行し、結果をBigQueryやスプレッドシートに書き込めば、完全に自社仕様のレポートパイプラインになります。
なお、Apps Script(GAS)からもREST版の searchStream を UrlFetchApp で呼べますが、やり方2のGoogle Adsスクリプトとは別物です。アカウント内蔵のAdsスクリプトは開発者トークン不要、外部から叩くGASはトークン必須。GASから直接Ads APIを叩く実コードは、別記事の広告レポートをスプレッドシート×GASで自動化する方法 を参照してください。スプレッドシートに出すだけならやり方2で足ります。
集めたデータをAIにつなぐ:考察まで自動化する ここまでで「数字が自動で集まる」状態はできました。もう一歩踏み込んで、レポートの考察をAIに書かせるところまでが2026年時点の自動化の射程です。段階別に3つの形があります。
まず試す:スプレッドシートをAIに読ませる いちばん手軽なのは、やり方2で作ったスプレッドシートやCSVを、ChatGPT・Gemini・Claudeに渡して分析させることです。プロンプトは、欲しいアウトプットを列挙する形が安定します。
添付はGoogle広告のキャンペーン別・日別実績(過去30日)です。
1. CPAが悪化しているキャンペーンと、その要因の仮説
2. 予算の再配分案(増額すべき・減額すべきキャンペーン)
3. 今週チェックすべきポイント3つ
を、根拠となる数字を引用しながら簡潔にまとめてください。 これだけで、週次ミーティングの「所感」レベルの下書きは出てきます。始める前に、機密データの扱いと「入力を学習に使わせない設定」だけ社内ルールを確認しておいてください。
自動化する:BigQuery×生成AIで日次サマリを配信する やり方3でBigQueryにデータが溜まっていれば、「SQLで前日実績を集計 → 生成AIのAPIに渡して考察を生成 → Slackやメールに配信」という日次パイプラインが組めます。以下、GASで動かすまでの手順を通します。
事前準備: Gemini APIキーとSlack Webhookを用意する Gemini APIキー を https://aistudio.google.com/apikey で発行します。画面右上「Create API key 」→ 手順3-1で作ったGoogle Cloudプロジェクトを選択 → 表示されたキー(AIza〜 で始まる文字列)をコピーして控えますSlack Incoming Webhook を https://api.slack.com/apps で作成します。「Create New App 」→「From scratch」→ アプリ名(例: ads-daily-summary)と投稿先ワークスペースを選択 → 左メニュー「Incoming Webhooks 」→ 上部トグルを「On」→「Add New Webhook to Workspace 」→ 投稿先チャンネル(例: #広告運用)を選択して「許可する」→ 生成された https://hooks.slack.com/services/T.../B.../... の形式のURLをコピーして控えますGASプロジェクトを作ってスクリプトプロパティに保存する ブラウザで https://script.google.com/ を開き、「新しいプロジェクト 」をクリックします 左端の歯車アイコン「プロジェクトの設定 」→ 一番下までスクロール →「スクリプト プロパティを追加 」で以下の3つを保存しますGEMINI_API_KEY → 上記で控えたGemini APIキーSLACK_WEBHOOK_URL → 上記で控えたSlack Webhook URLGCP_PROJECT_ID → 手順3-1で作ったGoogle CloudプロジェクトのID。上部バーのプロジェクト名プルダウンを開き、ダイアログ内の「ID 」列に表示される英数字文字列(例: ads-bq-transfer-123456)を使います(表示名ではなくIDを使う点に注意。名前を入れると「Not found」で落ちます) 左メニュー「サービス 」→「+」→「BigQuery API 」を選択して「追加」(GASからBigQueryを叩けるようにするための拡張サービス有効化) 同じくプロジェクト設定画面の「Google Cloud Platform (GCP) プロジェクト 」欄で、「プロジェクトを変更」から手順3-1のGCPプロジェクト番号を入力してリンクします。標準GCPプロジェクトのままだと、BigQuery API課金枠を有効化できず実行時にエラーになる場合があります。プロジェクト番号は、GCPコンソール上部バーのプロジェクト名プルダウン → ダイアログ内の「プロジェクト番号 」(12桁前後の数字)で確認できます スクリプト本体を貼り付ける コード.gs の中身を全削除し、以下を貼り付けます。手順3の google_ads データセット名と ads_CampaignBasicStats_<customer_id> / ads_Campaign_<customer_id> の <customer_id> を、自分のIDに置き換えてください /**
* BigQueryから前日実績を集計 → GeminiでサマリをつくってSlackに投稿する日次バッチ
* トリガー: 時間主導型 → 日付ベースのタイマー → 午前7〜8時
*/
function dailyAiSummary () {
const props = PropertiesService. getScriptProperties ();
const projectId = props. getProperty ( 'GCP_PROJECT_ID' );
const geminiKey = props. getProperty ( 'GEMINI_API_KEY' );
const slackUrl = props. getProperty ( 'SLACK_WEBHOOK_URL' );
// ---- 1. BigQueryで前日実績をキャンペーン単位に集計 ----
// ↓ <customer_id> を自分の広告アカウントIDに置き換える(ハイフンなし10桁)
const sql = `
SELECT
c.campaign_name,
SUM(s.metrics_impressions) AS impressions,
SUM(s.metrics_clicks) AS clicks,
SUM(s.metrics_cost_micros) / 1000000 AS cost_jpy,
SUM(s.metrics_conversions) AS conversions,
SAFE_DIVIDE(SUM(s.metrics_cost_micros) / 1000000, SUM(s.metrics_conversions)) AS cpa
FROM \` ${ projectId }.google_ads.ads_CampaignBasicStats_<customer_id> \` AS s
JOIN \` ${ projectId }.google_ads.ads_Campaign_<customer_id> \` AS c
ON s.campaign_id = c.campaign_id AND c._DATA_DATE = s._DATA_DATE
WHERE s._DATA_DATE = DATE_SUB(CURRENT_DATE('Asia/Tokyo'), INTERVAL 1 DAY)
GROUP BY c.campaign_name
ORDER BY cost_jpy DESC
` ;
const request = { query: sql, useLegacySql: false };
let queryResults = BigQuery.Jobs. query (request, projectId);
const jobId = queryResults.jobReference.jobId;
// 完了待ち(通常数秒)
while ( ! queryResults.jobComplete) {
Utilities. sleep ( 500 );
queryResults = BigQuery.Jobs. getQueryResults (projectId, jobId);
}
const rows = (queryResults.rows || []). map ( function ( r ) {
return r.f
. map ( function ( c ) {
return c.v;
})
. join ( ' \t ' );
});
if (rows. length === 0 ) {
Logger. log ( '前日のデータが0件でした' );
return ;
}
const header = 'campaign_name \t impressions \t clicks \t cost_jpy \t conversions \t cpa' ;
const numbers = [header]. concat (rows). join ( ' \n ' );
// ---- 2. Gemini APIで考察を生成 ----
const prompt =
'あなたはGoogle広告運用のプロです。以下の前日(タイムゾーンはJST)のキャンペーン別実績から、 \n ' +
'(1) CPAが悪化していそうなキャンペーンとその仮説、 \n ' +
'(2) 今日の運用で確認すべきポイントを3点、 \n ' +
'日本語で簡潔にまとめてください。根拠となる数字は必ず本文中に引用すること。 \n\n ' +
'=== 前日実績 === \n ' +
numbers;
// モデル名は執筆時点(2026年7月)の現行版。世代・エイリアスは適宜差し替え。
const geminiRes = UrlFetchApp. fetch (
'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent' ,
{
method: 'post' ,
contentType: 'application/json' ,
headers: { 'x-goog-api-key' : geminiKey },
payload: JSON . stringify ({ contents: [{ parts: [{ text: prompt }] }] }),
muteHttpExceptions: true ,
}
);
if (geminiRes. getResponseCode () !== 200 ) {
throw new Error ( 'Gemini API失敗: ' + geminiRes. getContentText ());
}
const summary = JSON . parse (geminiRes. getContentText ()).candidates[ 0 ].content.parts[ 0 ].text;
// ---- 3. Slackに投稿 ----
const slackRes = UrlFetchApp. fetch (slackUrl, {
method: 'post' ,
contentType: 'application/json' ,
payload: JSON . stringify ({ text: '*Google広告 前日サマリ* \n ' + summary }),
muteHttpExceptions: true ,
});
if (slackRes. getResponseCode () !== 200 ) {
throw new Error ( 'Slack投稿失敗: ' + slackRes. getContentText ());
}
Logger. log ( 'Slackに投稿しました' );
} フロッピーディスクアイコン「プロジェクトを保存 」で保存し、上部のプルダウンで dailyAiSummary を選択して「実行 」をクリックします 初回は「承認が必要です」ダイアログが出るので、「権限を確認」→ アカウント選択 →「詳細」→「(プロジェクト名)(安全ではないページ)に移動」→「許可 」の順にクリックします Slackの投稿先チャンネルに「Google広告 前日サマリ」というメッセージが届けば成功です 毎朝自動で走らせる 左端の目覚まし時計アイコン「トリガー 」→ 右下「トリガーを追加 」をクリック ダイアログを次のとおり設定します「実行する関数を選択」→ dailyAiSummary 「イベントのソースを選択」→ 「時間主導型 」 「時間ベースのトリガーのタイプを選択」→ 「日付ベースのタイマー 」 「時刻を選択」→ 「午前7時〜8時 」(BigQuery転送が終わってから走らせる) 「エラー通知設定」→ 「今すぐ通知を受け取る 」 「保存」をクリック。翌朝、Slackにサマリが届いていれば自動化完了です ポイントは1つだけで、生データを丸投げしないこと。何万行の生ログを渡すより、上記のSQLでキャンペーン別・日別に集計した数十行を渡すほうが、考察の精度もAPI費用も桁違いに良くなります。この考え方はなぜAI時代にこそデータ基盤が必要か|生成AIが失敗する理由 で詳しく扱っています。
補足として、BigQueryにはSQLから直接Geminiを呼び出す生成AI関数(BigQuery ML)もあり、GASを挟まずGCP内で完結させたい場合はそちらの構成が選べます。ただし本記事のようにSlackへの通知や別サービス連携まで含めるなら、GASを間に挟む本構成のほうが素直です。
対話で深掘る:AIからBigQueryに直接つなぐ ChatGPTやClaudeのコネクタ・MCP(AIから外部ツールに接続する仕組み)でBigQueryをつなぐと、「先月からCPAが悪化した要因を分解して」のような対話での深掘り分析ができます。定型は自動配信、非定型は対話。この分担で回すのが手堅い運用パターンです。
ここまでのAI分析・異常検知を既製で載せたい場合は、私たちのアドヨミAI のように、広告データのBigQuery集約とAI考察をセットで提供するサービスという選択肢もあります。
運用してから気づくこと ここからは、実際に運用して初めて気づきやすいポイントです。Evastでも広告データ基盤の構築で繰り返し踏んできた石を並べます。
まず筆頭は、リフレッシュトークンが7日で失効する件。OAuth同意画面が「テスト」ステータスのままだと、リフレッシュトークンは7日で切れます。開発中に「先週動いていたのに認証エラーになった」となる原因の代表格で、対処は同意画面を本番ステータスに公開することです。あわせて、6か月使われないトークンも失効します。
次に、cost_micros の割り忘れ。費用は cost_micros という100万分の1単位で返ってきます。1,230円なら 1230000000。1,000,000で割らずにレポートに載せて、桁違いの請求額に青ざめるのは通過儀礼です。
GAQL側の落とし穴として、セグメントを足すほど行が細かく分割され、組み合わせによっては互換性エラーになります。また segments.date をSELECTに入れると、WHEREでの期間指定が必須になります。2026年6月からは細かいセグメントに37か月のさかのぼり上限も入りました。まず最小のクエリで動かし、セグメントは1つずつ足すのが安全です。
日付の扱いにも一癖あります。レポートの日付は広告アカウントに設定されたタイムゾーンで区切られ、クエリ側では変えられません。海外アカウントを扱う場合、自社の集計基準とずれる前提で設計する必要があります。
そしていちばん厄介なのが、APIバージョンの寿命。Ads APIは約3か月ごとに新バージョンが出て、メジャー版の寿命はおよそ1年です(直近ではv21が2026年8月に廃止)。コードに埋めたバージョン番号は、年1〜2回の載せ替え作業が発生する前提で保守計画に入れておく必要があります。
どこまで自分でやるか:内製の限界ライン ここまでのやり方は、Google広告1媒体なら十分に内製できる範囲です。実際、やり方1〜3は無料で、半日もあれば動き始めます。
内製の限界が来るのは、たいてい媒体が増えたときです。Yahoo!広告、Meta、TikTokと増えるたびに、認証方式もAPIの仕様も更新頻度も違う連携を1本ずつ作り、仕様変更のたびに直し続けることになります。Yahoo!広告側の手順と仕様の違いは、別記事のYahoo!広告レポート自動化のやり方|広告APIの使い方とAI分析 を参照してください。レポート自動化の費用対効果が崩れるのは、だいたいこの局面。外注した場合の相場感については広告レポート自動化の費用は?ツール・代行の料金相場と選び方 に別途まとめています。
私たちが提供しているアドヨミAI は、まさにこの「複数媒体×BigQuery集約」を肩代わりするサービスです。Google・Meta・TikTokなどの広告データをAPIで自動連携して自社所有のBigQueryに集め、前処理からAI分析・異常検知まで載せて、初期5万円・月額1.5万円〜(媒体数に応じた累進制、例: 4媒体で月5.5万円)で運用できます。この記事のやり方3・4とAI分析を全媒体分まとめて外注する、と考えていただくと位置づけが近いです。
まとめ:無料のやり方で始めて、考察はAIに任せる Google広告1媒体のレポート自動化は、公式手段だけで実質0円から始められます。ダッシュボードで見るならLooker Studio、スプレッドシートに落とすならGoogle Adsスクリプトが最短。分析まで踏み込むならBigQuery Data Transferが本命で、Ads API直連携は自由度と保守負担が最大です。
集めたデータをAIに渡すコツは、生ログを丸投げせず集計してから渡すこと。落とし穴で最も踏みやすいのは、リフレッシュトークン7日失効と cost_micros の単位ミスの2つです。ここが越えられれば、あとは媒体を増やしていく段階に入ります。
明日の朝のコピペ作業を1つ消すところからでも、効果は体感できます。まずはやり方1か2を今日設定してみてください。
複数媒体の広告レポート自動化はEvastへ 株式会社EvastのアドヨミAI は、Google・Meta・TikTokなど主要媒体の広告データをAPIで自動連携し、自社所有のBigQueryに集約する半スクラッチ型の広告レポート自動化・AI分析サービス です。
「Google広告は自動化できたが、他媒体との統合で手が止まっている」 「APIの保守を社内で持ち続けたくない」 「レポートだけでなく、AIでの分析や異常検知まで載せたい」 現状の運用の棚卸しからで構いません。1媒体・最短2週間から始められます。
→ アドヨミAIの詳細・料金を見る → 無料相談を申し込む