広告レポート自動化の3段階:手作業→GAS→BigQuery 自動化のレベル感を先に俯瞰しておきます。
Step1: 手作業
管理画面を開いて数字をコピー 費用: 0円(工数はかかる) 限界: 媒体が増えると破綻 Step2: GAS×スプレッドシート
UrlFetchAppで各媒体APIを直接呼ぶ 費用: 実質無料 限界: 実行6分/回・トリガー90分/日(無料) Step3: BigQuery / アドヨミAI
複数媒体を1つのDWHに集約 費用: ストレージ・クエリ課金のみ〜構築費 強み: 実行時間制限なし・保守を移譲 広告レポート自動化×スプレッドシートの3ステップ。GASは「今日から無料で試せる」入口だが、媒体・アカウントが増えると壁に当たる 今すぐ・追加費用ゼロで1媒体から試したい → GAS×スプレッドシート (この記事の本題) 複数媒体・複数アカウントを横断して分析したい、AIに考察させたい → BigQuery集約 保守そのものを手放したい → 構築サービス(アドヨミAIなど)に外注 多くの現場はGASから始めて、媒体が増えたタイミングでBigQueryか外注を検討する、という順番を辿ります。まずはGASでの基本の型を見ていきます。
GAS×スプレッドシート自動化の基本の型(5手順) どの媒体のAPIを叩く場合でも、GASでの自動化はほぼ同じ5手順に分解できます。
手順1: Apps Scriptエディタを開く まず、書き込み先になるスプレッドシートを用意するところからです。
ブラウザで https://docs.google.com/spreadsheets/ を開き、Googleアカウントでログインします 画面左上の「空白のスプレッドシート」(+の付いたタイル)をクリックして新規作成します 画面左上の「無題のスプレッドシート」という文字をクリックし、ファイル名を分かりやすい名前(例: 広告レポート自動化)に変更してEnterキーを押します メニューバー(「ファイル 編集 表示 挿入 表示形式…」と並んでいる行)の「拡張機能 」をクリックし、開いたメニューの「Apps Script 」をクリックします 新しいタブでスクリプトエディタが開き、中央に「コード.gs」(Code.gs)というファイルと function myFunction() {} という空の関数が表示されます エディタ画面左上の「無題のプロジェクト」をクリックし、プロジェクト名(例: ad-report-fetch)を入力して「名前を変更」をクリックします ここまでの確認 : ブラウザのタブ名が「(プロジェクト名) - プロジェクト エディタ」のような表示になり、コードエディタが開いていれば成功です。ここに自動化コードを書いていきます。
なお「Apps Script」メニューは2021年11月頃に旧「ツール」→「スクリプトエディタ」から名称・場所が変わっています。古い解説記事の手順をなぞって「ツールの中に見当たらない」と迷う人が今でも一定数いるので、現行の「拡張機能」→「Apps Script」を覚えておくと無駄がありません。
手順2: トリガーを設定する トリガーは「どの関数を・いつ自動実行するか」の設定です。設定時に実行対象の関数を選ぶ必要があるため、実際の作業順としては、手順5までのコードを書いて保存した後 にこの設定をしてください(ここでは型の全体像として先に説明します)。
スクリプトエディタの画面左端に縦に並んでいるアイコン列から、目覚まし時計の形のアイコン「トリガー」 をクリックします 開いた画面の右下にある青い「トリガーを追加 」ボタンをクリックします 表示されたダイアログを、上から順に次のとおり設定します「実行する関数を選択」→ 自動実行したい関数名(後述のコードなら fetchAdReportToSheet) 「実行するデプロイを選択」→ 「Head」のまま変更しない 「イベントのソースを選択」→ 「時間主導型 」 「時間ベースのトリガーのタイプを選択」→ 「日付ベースのタイマー 」(=毎日実行、という意味です) 「時刻を選択」→ 「午前6時〜7時」など、レポートを見たい時刻より前の時間帯 「エラー通知設定」→ 「今すぐ通知を受け取る」(実行失敗にすぐ気づけるようにしておくのがおすすめです) 「保存」をクリックします 初回は「アカウントの選択」画面が開きます。スプレッドシートを所有しているGoogleアカウントをクリックし、「このアプリは Google で確認されていません」という警告画面が出た場合は、左下の「詳細 」→「(プロジェクト名)(安全ではないページ)に移動 」をクリックし、権限の一覧が表示された画面で「許可 」をクリックします。自分で作ったスクリプトを自分のアカウントで承認しているだけなので、この警告は問題ありません。なお、推奨の作業順どおり先にコードの手動実行(後述)で承認を済ませている場合、この画面は表示されません。表示されなくても失敗ではありません ここまでの確認 : トリガー一覧の画面に戻り、表に今作ったトリガー(関数名・イベント「時間ベース」)が1行表示されていれば設定完了です。これで、UrlFetchAppで各媒体APIを呼ぶ関数が毎日自動で実行されるようになります。
※トリガーの実行時刻は、Apps Scriptプロジェクトのタイムゾーン設定に従います。画面左端の歯車アイコン「プロジェクトの設定 」を開き、「タイムゾーン」が「(GMT+09:00) 日本標準時 - 東京 」になっているか確認してください。ここが日本以外になっていると、意図しない時刻に実行されます。
※ダイアログの項目名・ボタンの表記は、UIのバージョンによって多少異なる場合があります。
シンプルトリガーと違い、インストール型トリガーは外部API呼び出しを含む「承認が必要なサービス」を利用できます。広告APIを叩く自動化では必ずこちらを使うことになります。ここで押さえておきたいのが実行時間の上限で、無料のGoogleアカウントは1日90分、Google Workspaceは1日6時間 までしかトリガーを実行できません。媒体を増やすたびにこの上限に近づいていく点は、後述する「GASの限界」で詳しく触れます。
手順3: 媒体側でOAuthクレデンシャルを発行する 各媒体側の管理画面・開発者ポータルでOAuth2.0のクライアントID・シークレットを発行し、リフレッシュトークンを取得します。ここでは例として、Google広告のクレデンシャル一式(クライアントID・クライアントシークレット・リフレッシュトークン・開発者トークン)を発行する手順 を最後まで通します。他媒体も「開発者ポータルでアプリ登録→キー発行→トークン取得」という骨格は同じです。
※Google CloudコンソールやGoogle広告管理画面の表記・メニュー位置はアップデートで変わることがあります。以下は2026年8月時点の一般的な表記です。
3-1. Google CloudコンソールでOAuthクライアントを作成する https://console.cloud.google.com/ を開き、Googleアカウントでログインします(初回は利用規約の同意画面が出るので、チェックを入れて「同意して続行」をクリックします)画面上部バーの左側、Google Cloudロゴの右隣にあるプロジェクト名のプルダウンをクリックし、開いたダイアログの右上の「新しいプロジェクト 」をクリックします 「プロジェクト名」に任意の名前(例: ads-report-gas)を入力し、「作成」をクリックします。作成が終わると画面右上のベルアイコン(通知)に完了が表示されるので、通知内の「プロジェクトを選択」をクリックします(上部バーのプロジェクト名が今作った名前になっていることを確認してください) 画面左上のナビゲーションメニュー(三本線「≡」のアイコン) →「APIとサービス 」→「OAuth 同意画面 」をクリックします(現在は「Google Auth Platform」という設定画面に案内されます) 「開始」をクリックし、次のとおり入力して進みます「アプリ名」→ 任意の名前(例: ads-report-gas) 「ユーザーサポートメール」→ 自分のメールアドレスを選択 「対象」(User Type)→ Google Workspace契約があり社内利用だけなら「内部 」、個人のGmailアカウントなら「外部 」を選択 「連絡先情報」→ 自分のメールアドレスを入力 ポリシーへの同意にチェックを入れて「作成」をクリックします 手順5で「外部」を選んだ場合は、左メニューの「対象」を開き、「テストユーザー」欄の「+ Add users 」をクリックして、この後の認可に使う自分のGoogleアカウント(広告アカウントにアクセスできるもの)を追加して「保存」します 左メニューの「クライアント 」→「+ クライアントを作成 」をクリックし、次のとおり設定します「アプリケーションの種類」→ 「ウェブ アプリケーション 」 「名前」→ 任意の名前(例: gas-oauth-client) 「承認済みのリダイレクト URI」→ 「+ URI を追加」をクリックし、https://developers.google.com/oauthplayground と入力します(次の3-2で使います。末尾にスラッシュを付けない でください) 「作成」をクリックすると、「クライアント ID」(〜.apps.googleusercontent.com という形式)と「クライアント シークレット」が表示されます。両方をこの場でコピーして、パスワード管理ツールなど安全な場所に控えます ナビゲーションメニュー「≡」→「APIとサービス」→「ライブラリ 」を開き、検索ボックスに Google Ads API と入力し、検索結果の「Google Ads API」をクリックして「有効にする 」をクリックします ここまでの確認 : 「APIとサービス」→「有効なAPIとサービス」の一覧に「Google Ads API」が表示されていれば成功です。
3-2. OAuth Playgroundでリフレッシュトークンを取得する https://developers.google.com/oauthplayground を開きます画面右上の歯車アイコン (OAuth 2.0 configuration)をクリックし、「Use your own OAuth credentials 」にチェックを入れて、「OAuth Client ID」「OAuth Client secret」に3-1の手順9で控えた値をそれぞれ貼り付けます 画面左の「Step 1 Select & authorize APIs 」の下部にある入力欄(Input your own scopes)に https://www.googleapis.com/auth/adwords と入力し、「Authorize APIs 」ボタンをクリックします Googleのアカウント選択画面が開くので、広告アカウントにアクセスできるGoogleアカウントを選択します(Google広告の場合は、次の3-3で使うMCCにもアクセスできるアカウントを選んでください)。「このアプリは Google で確認されていません」と出た場合は「詳細」→「(アプリ名)(安全ではないページ)に移動」をクリックし、最後に「許可 」(Continue)をクリックします Playgroundの画面に戻ると「Step 2 Exchange authorization code for tokens 」が開くので、「Exchange authorization code for tokens 」ボタンをクリックします 「Refresh token」欄に 1// で始まる文字列が表示されるので、コピーして控えます。これがリフレッシュトークンです ここまでの確認 : 「Refresh token」欄が空でなければ成功です。空のままの場合は、Googleアカウントのアクセス権管理 で該当アプリのアクセス権を一度削除してから、手順3からやり直してください。
注意: OAuth同意画面の公開ステータスが「テスト」のままだと、リフレッシュトークンは7日で失効 します。継続運用する場合は、Google Auth Platformの「対象」画面にある「アプリを公開」をクリックして本番ステータスにしておいてください。
3-3. Google広告の開発者トークンを取得する https://ads.google.com/ にMCC(クライアントセンター/管理アカウント) でログインします。MCCを持っていない場合は先に無料で作成してください。通常の広告アカウントからは開発者トークンを申請できませんデータを取りたい広告アカウントを、このMCCにリンクします 。開発者トークンで(後述の login-customer-id 経由で)アクセスできるのは、そのMCCにリンクされている広告アカウントだけです。MCCの左メニュー「アカウント」→「サブアカウント設定」(またはアカウント一覧右上の「+」)→「既存のアカウントをリンク 」で対象アカウントのお客様IDを入力してリンク申請し、広告アカウント側 の管理画面(「ツールと設定」→「アクセスと権限」→「管理者」タブ)で申請を承諾 してください。開発者トークン取得のために新規でMCCを作った場合、このリンクを忘れると後の実行が必ず PERMISSION_DENIED で失敗します。また、3-2で認可に使うGoogleアカウントは、広告アカウントだけでなくこのMCCにもアクセスできる 必要があります画面上部の「ツールと設定 」(スパナのアイコン)→「設定」列の「APIセンター 」をクリックします(新しいUIでは左メニューの「管理者 」→「APIセンター」にあります) 表示されたフォームにAPI利用の目的・会社情報などを入力して申請すると、開発者トークンが表示されるので控えます。用途欄は「自社アカウントの広告レポートを日次で取得し、スプレッドシートに保存する」のように対象・頻度・保存先を具体的に 書くのが審査を通すコツです 発行直後のトークンはテストアカウントに対してはすぐ使えますが、本番の広告アカウントに使うにはBasicアクセスの審査(数営業日〜1週間程度) を通す必要があります(審査期間を短縮する仕組みも段階的に導入されつつあるようなので、最新の所要時間はAPIセンターや申請画面の案内で確認してください) アクセスレベルごとの上限や審査の詳細はGoogle広告レポート自動化のやり方 にまとめています。
この手順3だけは、媒体ごとに画面も審査要否もまったく異なります。審査に数営業日〜数週間かかる媒体もあるため、先に申請だけ済ませておくのが効率的です。Google広告以外の媒体ごとの具体的な画面遷移は、この記事の後半で媒体別記事にリンクしています。
手順4: 認証情報をスクリプトプロパティに保存する 手順3で控えた値を、GASの「スクリプトプロパティ」(PropertiesService)に保存します。コードに直接書く(ハードコーディングする)と、コードを共有・コピーした瞬間に認証情報が漏れるため、必ずここに保存しておくのが定石です。
スクリプトエディタの画面左端のアイコン列から、歯車アイコン「プロジェクトの設定」 をクリックします 開いた画面を一番下までスクロールし、「スクリプト プロパティ 」欄の「スクリプト プロパティを追加 」ボタンをクリックします 「プロパティ」と「値」の入力欄が1行分表示されるので、下の表の1行目(キー名と値)を入力します。2行目以降は、もう一度「スクリプト プロパティを追加」をクリックして行を増やしながら、6行すべて入力します プロパティ(キー名) 値(Google広告の例) AD_CLIENT_ID3-1で控えたクライアントID(〜.apps.googleusercontent.com) AD_CLIENT_SECRET3-1で控えたクライアントシークレット AD_REFRESH_TOKEN3-2で控えたリフレッシュトークン(1// で始まる文字列) AD_DEVELOPER_TOKEN3-3で控えた開発者トークン AD_CUSTOMER_IDデータを取りたい広告アカウントのお客様ID。管理画面右上に「123-456-7890」の形式で表示されるものをハイフンなしの10桁 (例: 1234567890)で入力 AD_LOGIN_CUSTOMER_IDMCC(管理アカウント)のお客様ID。同じくハイフンなしの10桁 。3-3の手順2のとおり、このMCCに AD_CUSTOMER_ID のアカウントがリンクされていること が前提です
入力し終えたら「スクリプト プロパティを保存 」ボタンをクリックします ここまでの確認 : 保存後、「スクリプト プロパティ」欄に6行のキーと値が一覧表示されていれば成功です。
実行時はUrlFetchAppでOAuthトークンエンドポイントを叩いてアクセストークンを取得し、各媒体のレポートAPIにAuthorizationヘッダーを付けてリクエストする、という2段構えになります(コードは次のセクションで丸ごと示します)。
手順5: レスポンスをシートに書き込む 最後に、APIのレスポンスを書き込む先のシートを整えます。
手順1で作ったスプレッドシートのタブに戻り、画面下部のシート見出し「シート1」を右クリック(またはシート名右の「▼」をクリック)し、「名前を変更 」で レポート に変更してEnterキーを押します。コード内の getSheetByName('レポート') とシート名が一字一句一致している必要があります 1行目にヘッダーとして、A1から順に 日付 キャンペーン名 クリック数 費用 CV数 と入力しておきます コード側では SpreadsheetApp.getActiveSpreadsheet().getSheetByName('レポート') で書き込み先のシートを取得し、APIから返ってきたJSONレスポンスをパースして setValues() で2行目以降に書き込みます。ここまでで、手作業のコピペは自動化された状態になります。
注意したいのは、Amazon AdsやYahoo!広告のようにレポート取得が非同期方式の媒体です。この手順5の中でポーリングループが必要になり、GASの1回あたり6分という実行時間制限に引っかかりやすいポイントになります。詳しくは後述します。
実際に動くコード:UrlFetchAppで広告APIを叩く共通パターン 媒体ごとにエンドポイントやリクエスト形式は違いますが、GAS側のコードの骨格はどの媒体でもほぼ共通です。手順3・4で用意したGoogle広告のクレデンシャルを使って、過去30日のキャンペーン別・日別実績をシート「レポート」に書き込む完全なコード を示します。このままコピペで動きます。ただし本番の広告アカウントに対して動くのは、3-3のBasicアクセス承認が下りた後です。承認前に試す場合はテストアカウントで検証してください。
/**
* Google広告のキャンペーン別・日別レポート(過去30日)をシート「レポート」に書き込む
* 事前準備:
* - 手順3: クライアントID / シークレット / リフレッシュトークン / 開発者トークンを取得済み
* - 手順4: スクリプトプロパティに6つの値(AD_CLIENT_ID など)を保存済み
* - 手順5: スプレッドシートに「レポート」という名前のシートを用意済み
*/
function fetchAdReportToSheet () {
// ---- 認証情報をスクリプトプロパティから読み込む(手順4で保存した値)----
const props = PropertiesService. getScriptProperties ();
const clientId = props. getProperty ( 'AD_CLIENT_ID' );
const clientSecret = props. getProperty ( 'AD_CLIENT_SECRET' );
const refreshToken = props. getProperty ( 'AD_REFRESH_TOKEN' );
const developerToken = props. getProperty ( 'AD_DEVELOPER_TOKEN' );
const customerId = props. getProperty ( 'AD_CUSTOMER_ID' ); // ハイフンなし10桁
const loginCustomerId = props. getProperty ( 'AD_LOGIN_CUSTOMER_ID' ); // MCCのID(ハイフンなし)
// ---- 1. リフレッシュトークンからアクセストークンを取得 ----
const tokenRes = UrlFetchApp. fetch ( 'https://oauth2.googleapis.com/token' , {
method: 'post' ,
payload: {
client_id: clientId,
client_secret: clientSecret,
refresh_token: refreshToken,
grant_type: 'refresh_token' ,
},
muteHttpExceptions: true , // エラー時もレスポンス本文を読めるようにする
});
if (tokenRes. getResponseCode () !== 200 ) {
throw new Error ( 'アクセストークンの取得に失敗: ' + tokenRes. getContentText ());
}
const accessToken = JSON . parse (tokenRes. getContentText ()).access_token;
// ---- 2. Google Ads APIのレポートエンドポイント(searchStream)を呼ぶ ----
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' ;
const reportRes = UrlFetchApp. fetch (
'https://googleads.googleapis.com/v25/customers/' + customerId + '/googleAds:searchStream' ,
{
method: 'post' ,
contentType: 'application/json' ,
headers: {
Authorization: 'Bearer ' + accessToken,
'developer-token' : developerToken,
'login-customer-id' : loginCustomerId,
},
payload: JSON . stringify ({ query: query }),
muteHttpExceptions: true ,
}
);
if (reportRes. getResponseCode () !== 200 ) {
throw new Error ( 'レポート取得に失敗: ' + reportRes. getContentText ());
}
// ---- 3. レスポンスをパースして2次元配列にする ----
// searchStreamのレスポンスは [{ results: [...] }, ...] というバッチの配列で返る
const batches = JSON . parse (reportRes. getContentText ());
const values = [];
batches. forEach ( function ( batch ) {
(batch.results || []). forEach ( function ( row ) {
values. push ([
row.segments.date,
row.campaign.name,
Number (row.metrics.clicks || 0 ),
Number (row.metrics.costMicros || 0 ) / 1000000 , // 費用は100万分の1単位で返るため口座の通貨単位(日本円アカウントなら円)に換算
Number (row.metrics.conversions || 0 ),
]);
});
});
if (values. length === 0 ) {
Logger. log ( '対象期間のデータが0件でした' );
return ;
}
// ---- 4. シート「レポート」の2行目以降に書き込み ----
const sheet = SpreadsheetApp. getActiveSpreadsheet (). getSheetByName ( 'レポート' );
if ( ! sheet) {
throw new Error ( 'シート「レポート」が見つかりません。シート名を確認してください' );
}
sheet. getRange ( 2 , 1 , sheet. getMaxRows () - 1 , 5 ). clearContent (); // 前回の書き込みをクリア
sheet. getRange ( 2 , 1 , values. length , 5 ). setValues (values);
Logger. log (values. length + '行を書き込みました' );
} なお、エンドポイントURL内の v25 は執筆時点(2026年8月)の最新バージョンです。Google Ads APIのバージョンは約1年でサンセット(廃止)されるため、時間が経ってから実装する場合は公式リリースノート で現行バージョンを確認し、読み替えてください。
貼り付けから初回実行までの操作は次のとおりです。
スクリプトエディタで「コード.gs」に最初から入っている function myFunction() {} をすべて削除し、上のコードを丸ごと貼り付けます エディタ上部のフロッピーディスクアイコン「プロジェクトを保存 」をクリックします(Windowsは Ctrl+S、Macは Cmd+S でも保存できます) 上部ツールバーの「実行」ボタンの右にある関数名のプルダウンが「fetchAdReportToSheet 」になっていることを確認し、「実行 」をクリックします 初回は「承認が必要です」というダイアログが出るので、「権限を確認」→ アカウント選択 →(「このアプリは Google で確認されていません」が出たら「詳細」→「(プロジェクト名)(安全ではないページ)に移動」)→「許可 」の順にクリックします 画面下部に「実行ログ」パネルが開き、「◯行を書き込みました」というログの後に「実行完了」と表示されれば成功です。スプレッドシートの「レポート」シートの2行目以降に数字が入っているか確認してください エラーになった場合は、実行ログに出るメッセージで切り分けます。invalid_grant ならリフレッシュトークンの期限切れか値の貼り間違い(3-2をやり直し)、DEVELOPER_TOKEN_NOT_APPROVED を含むエラーなら開発者トークンが本番アカウント未承認(3-3の審査待ち)、PERMISSION_DENIED(USER_PERMISSION_DENIED を含む)なら、認可したGoogleアカウントに広告アカウント・MCCの閲覧権限がないか、AD_LOGIN_CUSTOMER_ID のMCCに対象アカウントがリンクされていない(3-3の手順2を確認)、が代表的な原因です。
動作が確認できたら、最後に手順2のとおりトリガーを設定すれば、毎朝自動でシートが更新される状態になります。
このコードのうち媒体ごとに書き換えるのは、(1) トークンエンドポイントのURL、(2) レポートAPIのURL・ヘッダー・リクエスト形式、(3) レスポンスのパース部分、の3か所だけです。媒体側の認証方式(OAuth2.0か、JWS署名かなど)とレスポンス構造は媒体ごとに差があるため、実際のエンドポイント名は各媒体の記事を参照してください。
媒体ごとの認証方式とAPI手順は媒体別記事へ 主要8媒体の認証方式とレポート取得の同期・非同期の別を一覧にしました。GASのUrlFetchAppでどう繋ぐかの具体的な手順は、それぞれの記事にまとめています。
表からも分かるとおり、Amazon AdsとYahoo!広告は「レポート作成リクエスト→ステータスポーリング→完了後ダウンロードURL取得」という非同期のジョブ方式です。GASでこの流れを扱うのが、次に説明する限界の中でもいちばん詰まりやすいポイントになります。
GASの限界:どこで詰まるか GASは無料で始められる反面、Googleが公式に定めているクォータの範囲でしか動きません。広告レポート自動化で実際に当たりやすい上限を並べます。
制限項目 上限 スクリプトの実行時間 6分/回(カスタム関数は30秒/回) トリガーの合計実行時間 無料アカウント90分/日、Google Workspace 6時間/日 トリガー数 20個/ユーザー/スクリプトまで 同時実行数 30/ユーザー、1,000/スクリプト URL Fetch呼び出し回数 無料アカウント20,000回/日、Workspace 100,000回/日 URL Fetch応答サイズ 50MB/回
※上限値は変更されることがあります。最新値は公式のクォータページ で確認してください。
数字だけ見ると余裕がありそうですが、実務でつまずくのは主に3つです。
1. 媒体×アカウントが増えると1本のスクリプトでは収まらなくなる 。実行時間6分とトリガー合計90分/日(無料)・6時間/日(Workspace)の上限があるため、複数媒体×複数アカウントの日次レポート取得を1つのスクリプトに詰め込むと、どこかで必ず詰まります。「毎朝7時のトリガーが、3媒体目の取得中に6分制限で落ちる」といった形で症状が出るのが典型です。トリガーを媒体・アカウントごとに分割し、実行時間をずらす設計がほぼ必須になります。
2. 非同期レポートAPIとの相性が悪い 。Amazon AdsやYahoo!広告のようにジョブ作成→ポーリング→ダウンロードという複数リクエストが必要な媒体は、GASの6分実行制限に収める工夫が必須になります。具体的には、Utilities.sleepで完了を待ち続けるのではなく、いったん処理を終えてトリガーで数分後に再開する「分割実行」に組み替えます。この工夫を怠ると「たまに処理が完走しない」という不安定さを抱え込みます。また、ポーリングのたびにリクエストが増えるため、URL Fetch呼び出し回数の上限(無料20,000回/日)にも影響します。
3. トークン管理が属人化しやすい 。各媒体のOAuthリフレッシュトークンやアクセストークンには、媒体によって数十日単位の有効期限があります。この管理をGAS単体・スクリプトプロパティだけで堅牢に運用するのは難しく、担当者しか仕組みを把握していない状態になりがちです。これがBigQueryや専用ツールへの移行を検討する動機になります。
GASで足りなくなったら:BigQuery / 構築サービスへ GASでの自動化は、1〜2媒体・数アカウント程度であれば十分に実用的です。限界が来るのは、たいてい媒体数が増えたタイミングです。
BigQueryに移行すれば、GASの実行時間・トリガー回数といった制約から解放され、複数媒体のデータを1つのDWHに集約して横断分析やAI分析にも繋げやすくなります。BigQueryのクエリ課金の考え方はBigQueryの料金体系とコスト削減|課金トラップと対策 で解説しています。また、レポート自動化を外注する場合の費用感は広告レポート自動化の費用は?ツール・代行の料金相場と選び方 、GAS以外の選択肢との比較は広告レポート自動化ツール比較|主要9ツールの料金・対応媒体・選び方 にまとめています。
私たちが提供しているアドヨミAI は、この「複数媒体×API連携×BigQuery集約」を肩代わりするサービスです。GASでの内製が属人化してきた、媒体が増えて保守の手が回らない、という段階で選択肢に入れていただければと思います。
まとめ:まず1媒体、GASで動かしてみる GASとスプレッドシートの組み合わせは、追加費用なしで広告レポート自動化を試せる入口 手順は「Apps Scriptを開く→トリガー設定→媒体側でOAuth発行→スクリプトプロパティに保存→シートに書き込み」の5段階でどの媒体でも共通 認証方式は媒体でバラバラ(Google・Meta・TikTok・Amazon・MicrosoftはOAuth2.0、LINEはJWS署名、Yahoo!は独自OAuth、Xは書き込み系がOAuth1.0a中心) Amazon AdsとYahoo!広告は非同期のジョブ方式で、GASの6分実行制限との相性に注意が要る 実行時間6分/回、トリガー合計90分/日(無料)、URL Fetch 20,000回/日(無料)が実務で当たりやすい上限 媒体・アカウントが増えて保守が属人化してきたら、BigQueryへの移行や構築サービスへの切り替えを検討するタイミング まずは1媒体、今日この手順でGASを動かしてみてください。そこから先で壁に当たったら、この記事の各リンク先に戻ってきてもらえれば大丈夫です。
複数媒体の広告レポート自動化はEvastへ 株式会社EvastのアドヨミAI は、Google・Meta・TikTokなど主要媒体の広告データをAPIで自動連携し、自社所有のBigQueryに集約する半スクラッチ型の広告レポート自動化・AI分析サービス です。
「GASでの自動化が媒体ごとに個別対応になっていて保守がつらい」 「非同期APIのポーリング処理がGASの実行時間制限で不安定」 「レポートだけでなく、AIでの分析や異常検知まで載せたい」 現状の運用の棚卸しからで構いません。1媒体・初期5万円・月額1.5万円〜(媒体数に応じた累進制)、最短2週間から始められます。
→ アドヨミAIの詳細・料金を見る → 無料相談を申し込む