GAS(Google Apps Script)で広告レポートを自動化すると、毎朝の更新は問題なく動くのに、過去1年分を取り込もうとした最初の1回で止まる、ということが起きます。この記事を読むと、媒体ごとにGASから取れるかどうかの区別と、1回6分の上限に収まるかを書き始める前に計算する方法、収まらないときの区切り方がわかります。
GASの広告レポートが最初につまずく理由は、媒体ごとの取り方の違い
GASからそのまま取りに行けるかどうかは、媒体によって違います。申請なしで取れるものもあれば、媒体の管理画面の中で動く別のスクリプトに任せたほうが早いものもあります。
- GA4:Apps Scriptのエディタで「Google Analytics Data API」のサービスを追加すれば、申請なしでレポートを取得できます
- Meta広告:Graph APIのインサイトを、GASの
UrlFetchAppで取りに行きます。期限切れしにくいシステムユーザーのトークンを使うのが前提です - Google広告:GASから広告のAPIを直接呼ぶには開発者トークンの申請が要ります。Google広告の管理画面で動くGoogle広告スクリプトから、スプレッドシートへ書き出すほうが近道です
- LINEヤフー広告:管理画面で動くLINEヤフー広告スクリプトで、スプレッドシートへ毎日書き出す形が近道です
- X広告:Ads APIのアクセス申請と承認、リクエストごとの署名が要り、GASで組む手数は最も多くなります
つまり「GASで広告レポート」といっても、実際にGASが取りに行くのはGA4とMeta広告くらいで、Google広告とLINEヤフー広告は媒体側のスクリプトが書き出した表をGASが読む形になりがちです。この区別を先に決めておかないと、Google広告の取得を書き始めた段階で申請待ちになり、手が止まります。
GASに計算まで持たせるとコードが壊れやすくなる理由
GASの役割は、媒体から取ってきた数字を生データ用のシートに書き込むところまでに絞ります。日付・媒体・キャンペーン名・費用・表示回数・クリック・コンバージョンの7列を縦に積み、合計やCPA、前週比は集計用のシートの関数で計算させます。
計算までGASに持たせると、レポートの見た目を変えるたびにコードを直すことになります。関数で計算していれば、列を足したり期間を変えたりするのはシートの側だけで済みます。CPAは日別のCPAを平均せず、期間の費用の合計をコンバージョンの合計で割る、といった計算の決まりも、関数のほうが誰にでも確かめられます。
GASで広告レポートを毎朝動かす手順
手順は次の5つです。
- 生データ用と集計用のシートを用意する(計算は集計用のシートの関数に任せるため)
- 認証情報をスクリプト プロパティに入れる(シートやコードに書くと、共有した相手に見えてしまうため)
- 媒体ごとに、取得して書き込む関数を分けて書く(1媒体が止まっても他の媒体の更新を続けるため)
- 時間主導型のトリガーで毎朝動かす
- 失敗をメールで受け取る
運用を始めてから困りやすいのは、2と4・5です。
認証情報はスクリプト プロパティに置き、シートには書かない
アクセストークンや広告アカウントのIDは、プロジェクトの設定にある「スクリプト プロパティ」に保存し、コードからは PropertiesService で読み出します。
const props = PropertiesService.getScriptProperties();
const token = props.getProperty('META_TOKEN');
const accountId = props.getProperty('META_ACCOUNT_ID');
書き込みは、直近の数日分を消してから書き直す上書き型にします。成果があとから増える媒体では、前日分を足していくだけの追記型だと、遅れて計上されたコンバージョンが表に入りません。
時間主導型のトリガーで毎朝動かし、失敗はメールで受け取る
トリガーの画面で「時間主導型」「日付ベースのタイマー」を選び、たとえば午前5〜6時に実行します。作るときに「エラー通知設定」を「今すぐ通知を受け取る」にしておくと、失敗した朝にメールが届きます。止まったことに気づくのが月末の報告の直前になるのが、自作のレポートでいちばん高くつく失敗です。
失敗の中身は、エディタ左の「実行数」で実行ごとのログとエラーを確かめます。媒体のAPIは仕様が変わるため、昨日まで動いたコードが今日止まることは珍しくありません。APIには版ごとに提供終了の期限があり(MetaのGraph APIは各版がおおむね2年)、期限までにコードを新しい版へ移す作業が定期的に発生します。
広告レポートの集計作業に時間を取られていませんか?ADminiなら無料で始められます。無料で試してみる →
6分の上限で止まるのは毎朝の更新ではなく初回の取り込み
GASには、1回の実行は6分まで、トリガーで動かす合計は1日90分まで(無料のGoogleアカウント。Google Workspaceは6時間)、外部への取得(URL取得)は1日2万回まで(同10万回)という上限があります(Google for Developers「Google サービスの割り当て」)。この上限に当たるかどうかは、取得の回数と1回あたりの時間で先に見積もれます。
再現用のサンプルで計算します。Meta広告・GA4・X広告の3媒体で、それぞれ2アカウント(キャンペーンは各アカウント20本以下)を扱い、1回の取得に平均3秒かかると仮定します。Meta広告は1か月分を1回で、X広告は同期の分析の上限どおり7日分ずつ取ります。
| 項目 | 毎朝の更新(直近7日を取り直す) | 初回の取り込み(過去1年) | GASの上限 |
|---|---|---|---|
| 取得の回数 | Meta 2回+GA4 2回+X 2回=6回 | Meta 24回(12か月×2)+GA4 2回+X 106回(53週×2)=132回 | URL取得 2万回/日 |
| 1回の実行時間 | 6回×3秒=18秒 | 132回×3秒=396秒(6分36秒) | 6分/実行 |
| 上限に対する割合 | 6分の5% | 6分の110%(途中で止まる) | — |
毎朝の更新は18秒で、6分のうち5%しか使いません。初回の取り込みは毎朝の更新の22倍の回数になり、1回の実行に収まりません。アカウントが1つ増えるたびに、X広告だけで53回ずつ増える計算です。3秒という前提は通信の状態で変わるため、実際の値は「実行数」に出る所要時間で置き換えてください。
6分を超える処理を区切って再開させる方法
初回の取り込みが6分を超えるなら、処理を区切ります。
- どこまで取ったかをスクリプト プロパティに書き残す
- 実行開始から5分を過ぎたら処理を止める
- 数分後に動く一度きりのトリガーを作る
- 次の実行は、書き残した位置から再開させる
const LIMIT_MS = 5 * 60 * 1000;
const start = Date.now();
const props = PropertiesService.getScriptProperties();
let i = Number(props.getProperty('NEXT_INDEX') || 0);
for (; i < tasks.length; i++) {
if (Date.now() - start > LIMIT_MS) {
props.setProperty('NEXT_INDEX', String(i));
ScriptApp.newTrigger('importHistory').timeBased().after(3 * 60 * 1000).create();
return;
}
fetchAndWrite(tasks[i]);
}
props.deleteProperty('NEXT_INDEX');
期間の長い取得を非同期で受け付ける媒体(X広告は分割なしで90日まで)なら、取得そのものを媒体側に任せて完了を待つ書き方もあります。
ここまで組むと、GASのレポートは「書いて終わり」の道具ではなくなります。トークンの更新、媒体のAPIの版の切り替え、区切り処理の不具合、担当が替わったときの引き継ぎまでを誰かが持ち続けることになります。保守を引き受ける人がいないなら、GASでは作らないほうがよい状況です。
一方で、GASのほうが向く場面もあります。社内の別のシステムへ書き戻したい、媒体の連携ツールで取れない指標(動画の再生率やリーチなど)を毎日取りたい、といった場合です。コードを持たずに複数媒体をそろえたいなら、ADminiのようにGoogle広告・Meta広告・LINEヤフー広告・X広告・GA4をつなぐだけで1日1回の自動更新で数字が1つの表にそろうツールを使う手もあります。ADminiの広告媒体の連携で取得できる指標は費用・表示回数・クリック・コンバージョン・コンバージョン値の5つ(X広告はコンバージョンを取得しない)で、それ以外はGASか媒体からの書き出しが要ります。
まとめ
- 書き始める前に、媒体ごとの取り方を決める。GA4とMeta広告はGASから取り、Google広告とLINEヤフー広告は媒体側のスクリプトで書き出すのが近道
- GASに書かせるのは生データだけにし、認証情報はスクリプト プロパティに置き、トリガーのエラー通知を必ずオンにする
- 毎朝の更新は上限の数%でも、初回の取り込みは6分を超えやすい。区切って再開する処理を最初から入れておく
よくある質問
GASで広告レポートを自動化するのに費用はかかりますか?
GAS自体はGoogleアカウントがあれば無料で使えます。ただし、無料のGoogleアカウントでは1回の実行が6分まで、トリガーの合計が1日90分まで、外部へのURL取得が1日2万回までという上限があります。Google Workspaceのアカウントではトリガーの合計が1日6時間、URL取得が1日10万回まで広がります。費用の代わりに、コードを書く時間と止まったときの保守の手間がかかります。
GASでGoogle広告のレポートを取得できますか?
GASから広告のAPIを直接呼ぶには、開発者トークンの申請と承認が要ります。多くの場合は、Google広告の管理画面で動くGoogle広告スクリプトでスプレッドシートへ書き出し、その表をGASや関数で読むほうが近道です。GA4やMeta広告は、GASから直接データを取りに行けます。
GASの広告レポートが6分の上限で止まるときはどうすればよいですか?
処理を区切ります。どこまで取得したかをスクリプト プロパティに書き残し、5分を過ぎたら処理を止めて、数分後に動く一度きりのトリガーを作り、次の実行で続きから再開させます。止まりやすいのは毎朝の更新ではなく、過去1年分などをまとめて取り込む初回です。
GASの広告レポートが止まったことに気づくにはどうすればよいですか?
トリガーを作るときに「エラー通知設定」を「今すぐ通知を受け取る」にしておくと、実行に失敗した時点でメールが届きます。失敗の中身は、Apps Scriptのエディタ左の「実行数」で、実行ごとのログとエラーを確認できます。媒体のAPIは仕様が変わるため、通知をオフにしたまま運用しないことが大切です。
図解・表つきの完全版はこちら:GASで広告レポートを自動化する手順|媒体ごとのデータの取り方と、6分の上限に収まるかを先に見積もる計算
広告レポートの集計作業に時間を取られていませんか?ADminiなら無料で始められます。無料で試してみる →
この記事が役に立ったら LGTM をいただけると励みになります!
