Google Ads Scripts入門|自動化ルールとスクリプトで運用を効率化する
広告運用における自動化の選択肢
Google広告には、運用の一部を自動化する仕組みが2つあります。管理画面から設定できる「自動化ルール」と、JavaScriptでカスタムロジックを記述する「Google Ads Scripts」です。
どちらも目的は「手動で繰り返す判断や操作を自動化する」ことですが、対応できる範囲と柔軟性が大きく異なります。
自動化ルールはノーコードで手軽に使えますが、条件の組み合わせや外部サービスとの連携には対応していません。より柔軟な自動化が必要な場合にGoogle Ads Scriptsが選択肢になります。
自動化ルールの基本
まず、管理画面から設定できる自動化ルールの概要を押さえましょう。
自動化ルールでできること
自動化ルールは、指定した条件に該当したときに、あらかじめ決めたアクションを自動実行する機能です。管理画面の「ツールと設定」→「一括操作」→「ルール」から設定できます。
| アクション | 対象 | ユースケース |
|---|---|---|
| キャンペーンの有効化/一時停止 | キャンペーン | 期間限定セールの開始・終了を自動制御 |
| 入札単価の引き上げ/引き下げ | キーワード | 掲載順位に応じた入札調整 |
| 予算の変更 | キャンペーン | 曜日や時間帯に応じた予算調整 |
| メール通知 | 全エンティティ | 特定条件を満たしたときの通知 |
自動化ルールの限界
自動化ルールは便利ですが、以下のような場面では対応できません。
- 複数の指標を組み合わせた複雑な条件判定
- スプレッドシートへのデータ書き出し
- 外部サービスへの通知(Slackやチャットツール等)
- アカウントをまたいだ横断的な処理
- カスタム計算式に基づく判断
これらの要件がある場合は、Google Ads Scriptsを使います。
運用メモ 自動化ルールとスマート自動入札は目的が異なります。スマート自動入札は機械学習で入札を最適化する仕組みで、目標CPA・目標ROASなどの戦略に基づいて動きます。自動化ルールは「特定条件 → 特定アクション」の単純なルール実行です。両者は併用できますが、自動入札が有効なキャンペーンで入札単価を自動化ルールで上書きすると、学習を阻害するため避けてください。
Google Ads Scriptsとは
Google Ads Scriptsは、Google広告の管理画面上でJavaScriptを実行できる仕組みです。Google Ads APIの機能をJavaScriptから簡易的に呼び出せるラッパーが用意されており、APIの認証やHTTPリクエストの処理を意識することなく、広告データの取得や操作が可能です。
Scriptsでできること
- 広告アカウントのデータを取得・集計する
- キャンペーンや広告の設定を変更する
- スプレッドシートにデータを書き出す
- メールを送信する
- 外部URLへHTTPリクエストを送る
- 定期実行のスケジュールを設定する
Scriptsの始め方
Google広告の管理画面から「ツールと設定」→「一括操作」→「スクリプト」を開きます。新規作成ボタンを押すとエディタが表示され、そこにJavaScriptを記述して実行できます。
スクリプトのエントリーポイントはmain()関数です。すべての処理はこの関数内に記述するか、この関数から呼び出す形で構成します。
function main() {
// ここに処理を記述する
Logger.log('スクリプトが実行されました');
}
基本的なデータ取得
Google Ads Scriptsでは、GAQL(Google Ads Query Language)を使ってデータを取得します。SQLに似た構文で、Google広告のレポートデータを柔軟に抽出できます。
function main() {
var query = 'SELECT campaign.name, metrics.cost_micros, metrics.conversions ' +
'FROM campaign ' +
'WHERE segments.date DURING LAST_7_DAYS ' +
'AND metrics.impressions > 0';
var results = AdsApp.search(query);
while (results.hasNext()) {
var row = results.next();
var campaignName = row.campaign.name;
var cost = row.metrics.costMicros / 1000000;
var conversions = row.metrics.conversions;
Logger.log(campaignName + ': 広告費 ' + cost + '円, CV ' + conversions + '件');
}
}
cost_microsはマイクロ単位(100万分の1)で返されるため、1,000,000で割って円単位に変換する必要があります。
実用スクリプト例1:異常値アラート
CPAが急騰した場合にメールで通知するスクリプトです。日次で実行し、前日のCPAが設定した閾値を超えたキャンペーンを検出します。
function main() {
var CPA_THRESHOLD = 10000;
var ALERT_EMAIL = 'your-email@example.com';
var alertCampaigns = [];
var query = 'SELECT campaign.name, metrics.cost_micros, metrics.conversions ' +
'FROM campaign ' +
'WHERE segments.date DURING YESTERDAY ' +
'AND metrics.conversions > 0';
var results = AdsApp.search(query);
while (results.hasNext()) {
var row = results.next();
var campaignName = row.campaign.name;
var cost = row.metrics.costMicros / 1000000;
var conversions = row.metrics.conversions;
var cpa = cost / conversions;
if (cpa > CPA_THRESHOLD) {
alertCampaigns.push({
name: campaignName,
cost: cost,
conversions: conversions,
cpa: Math.round(cpa)
});
}
}
if (alertCampaigns.length > 0) {
var subject = '【アラート】CPA閾値超過キャンペーン: ' + alertCampaigns.length + '件';
var body = 'CPA ' + CPA_THRESHOLD + '円を超過したキャンペーン:\n\n';
for (var i = 0; i < alertCampaigns.length; i++) {
var c = alertCampaigns[i];
body += c.name + '\n';
body += ' 広告費: ' + c.cost.toLocaleString() + '円\n';
body += ' CV数: ' + c.conversions + '件\n';
body += ' CPA: ' + c.cpa.toLocaleString() + '円\n\n';
}
MailApp.sendEmail(ALERT_EMAIL, subject, body);
Logger.log(alertCampaigns.length + '件のキャンペーンでアラートを送信しました');
} else {
Logger.log('閾値を超過したキャンペーンはありません');
}
}
上部のCPA_THRESHOLDとALERT_EMAILを自社の値に書き換えて使用してください。CV数が0のキャンペーンはゼロ除算を避けるためクエリ段階で除外しています。
運用メモ CPA閾値は固定値ではなく、過去30日間の平均CPAに対する倍率(例: 平均CPAの1.5倍)で設定する方が実用的です。キャンペーンごとにCPA水準が異なるため、一律の閾値では大規模キャンペーンで誤検知が増えます。ただし、初めてスクリプトを書く段階では固定値でシンプルに始め、慣れてきたら動的な閾値に拡張するのがおすすめです。
実用スクリプト例2:レポート自動出力
日次のキャンペーンデータをGoogleスプレッドシートに自動書き出しするスクリプトです。
function main() {
var SPREADSHEET_URL = 'https://docs.google.com/spreadsheets/d/YOUR_SPREADSHEET_ID/edit';
var SHEET_NAME = 'DailyReport';
var spreadsheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
var sheet = spreadsheet.getSheetByName(SHEET_NAME);
if (!sheet) {
sheet = spreadsheet.insertSheet(SHEET_NAME);
sheet.appendRow([
'日付', 'キャンペーン名', '表示回数', 'クリック数',
'CTR', '広告費', 'CV数', 'CPA', 'ROAS'
]);
}
var query = 'SELECT campaign.name, segments.date, ' +
'metrics.impressions, metrics.clicks, metrics.ctr, ' +
'metrics.cost_micros, metrics.conversions, ' +
'metrics.conversions_value ' +
'FROM campaign ' +
'WHERE segments.date DURING YESTERDAY ' +
'AND metrics.impressions > 0 ' +
'ORDER BY metrics.cost_micros DESC';
var results = AdsApp.search(query);
while (results.hasNext()) {
var row = results.next();
var cost = row.metrics.costMicros / 1000000;
var conversions = row.metrics.conversions;
var convValue = row.metrics.conversionsValue;
var cpa = conversions > 0 ? Math.round(cost / conversions) : 0;
var roas = cost > 0 ? Math.round(convValue / cost * 100) : 0;
sheet.appendRow([
row.segments.date,
row.campaign.name,
row.metrics.impressions,
row.metrics.clicks,
(row.metrics.ctr * 100).toFixed(2) + '%',
Math.round(cost),
conversions,
cpa,
roas + '%'
]);
}
Logger.log('レポートの書き出しが完了しました');
}
SPREADSHEET_URLにはデータを書き出す先のGoogleスプレッドシートのURLを設定します。初回実行時にシートが存在しない場合はヘッダー行を含めて自動作成します。
データ書き出しの実行フロー
スクリプトの実行は、以下の流れで処理されます。
実用スクリプト例3:広告のルールベース管理
特定の条件に基づいて広告を自動的にON/OFFするスクリプトです。この例では、CTRが極端に低い広告を一時停止し、担当者にメールで通知します。
function main() {
var CTR_THRESHOLD = 0.005;
var MIN_IMPRESSIONS = 1000;
var ALERT_EMAIL = 'your-email@example.com';
var pausedAds = [];
var query = 'SELECT ad_group_ad.ad.id, ad_group_ad.ad.name, ' +
'ad_group.name, campaign.name, ' +
'metrics.impressions, metrics.clicks, metrics.ctr ' +
'FROM ad_group_ad ' +
'WHERE segments.date DURING LAST_30_DAYS ' +
'AND ad_group_ad.status = "ENABLED" ' +
'AND metrics.impressions >= ' + MIN_IMPRESSIONS;
var results = AdsApp.search(query);
while (results.hasNext()) {
var row = results.next();
if (row.metrics.ctr < CTR_THRESHOLD) {
pausedAds.push({
campaign: row.campaign.name,
adGroup: row.adGroup.name,
impressions: row.metrics.impressions,
clicks: row.metrics.clicks,
ctr: (row.metrics.ctr * 100).toFixed(2) + '%'
});
}
}
if (pausedAds.length > 0) {
var subject = '【通知】低CTR広告の検出: ' + pausedAds.length + '件';
var body = 'CTR ' + (CTR_THRESHOLD * 100).toFixed(1) + '% 未満 ' +
'(表示回数 ' + MIN_IMPRESSIONS + '以上) の広告:\n\n';
for (var i = 0; i < pausedAds.length; i++) {
var ad = pausedAds[i];
body += 'キャンペーン: ' + ad.campaign + '\n';
body += '広告グループ: ' + ad.adGroup + '\n';
body += '表示回数: ' + ad.impressions.toLocaleString() + '\n';
body += 'クリック数: ' + ad.clicks + '\n';
body += 'CTR: ' + ad.ctr + '\n\n';
}
body += '※ このスクリプトは検出のみ行います。\n';
body += ' 一時停止は管理画面から手動で実施してください。';
MailApp.sendEmail(ALERT_EMAIL, subject, body);
Logger.log(pausedAds.length + '件の低CTR広告を検出しました');
} else {
Logger.log('低CTR広告は検出されませんでした');
}
}
上記のスクリプトはメール通知のみで、広告の一時停止は手動で行う安全な設計にしています。自動一時停止を実装する場合は、AdsApp.adGroupAds()イテレーターを使って対象の広告をpause()できます。ただし意図しない広告停止のリスクがあるため、まず通知のみで運用して精度を確認してから段階的に自動化するのがおすすめです。
運用メモ 広告の自動ON/OFFは便利ですが、意図しない停止が発生するリスクがあります。本番導入前に以下の安全策を講じてください。(1) まずログ出力のみで1〜2週間テストする。(2) 除外条件(特定キャンペーン名のスキップ等)を設ける。(3) 実行ログを毎日確認する習慣をつける。自動化は「信頼できる」と確認できてから範囲を広げるのが鉄則です。
スクリプトの実行スケジュールとエラー対応
スケジュール設定
Google Ads Scriptsは管理画面から実行頻度を設定できます。
| 実行頻度 | 設定可能な間隔 | 主な用途 |
|---|---|---|
| 毎時 | 1時間ごと | リアルタイム性が必要なアラート |
| 毎日 | 時刻指定(1時間単位) | 日次レポート、日次チェック |
| 毎週 | 曜日と時刻を指定 | 週次レポート、定期メンテナンス |
| 毎月 | 日付と時刻を指定 | 月次レポート |
スケジュールはスクリプトのエディタ画面で「スケジュール」ボタンから設定します。タイムゾーンはアカウントの設定に従います。
エラーへの対応
スクリプトの実行中にエラーが発生した場合、Logger.log()で出力したメッセージは管理画面の実行ログから確認できます。よくあるエラーと対処法を整理します。
| エラー | 原因 | 対処法 |
|---|---|---|
| DEADLINE_EXCEEDED | 実行時間が30分を超過 | 処理を分割する、対象期間を短縮する |
| PERMISSION_DENIED | スプレッドシートへのアクセス権がない | スクリプト実行アカウントに編集権限を付与 |
| INVALID_ARGUMENT | GAQLの構文エラー | クエリのフィールド名やWHERE句を確認 |
| RESOURCE_EXHAUSTED | API呼び出し回数の上限 | 処理をバッチ化する、実行頻度を下げる |
エラー通知を自動化するには、try-catchで例外を捕捉してメール送信する方法が確実です。
function main() {
try {
// メインの処理
executeReport();
} catch (e) {
var subject = '【エラー】Google Ads Script 実行失敗';
var body = 'エラー内容:\n' + e.message + '\n\n' +
'スタックトレース:\n' + e.stack;
MailApp.sendEmail('your-email@example.com', subject, body);
throw e;
}
}
function executeReport() {
// ここにレポート処理を記述
Logger.log('レポート処理を実行中...');
}
注意点
API変更への追随
Google Ads Scriptsの内部APIは定期的に更新されます。非推奨(deprecated)になったメソッドは一定期間後に削除されるため、Google Ads Developers Blogや公式ドキュメントの変更履歴を定期的に確認してください。
特にAdsApp.report()からAdsApp.search()への移行は大きな変更点です。現在はAdsApp.search()とGAQL構文の使用が推奨されています。
MCCスクリプトとの違い
MCC(クライアント センター)アカウントからスクリプトを実行すると、配下の複数アカウントに対して横断的な処理が可能です。
| 項目 | 通常のスクリプト | MCCスクリプト |
|---|---|---|
| 対象 | 単一アカウント | 配下の複数アカウント |
| 実行時間の上限 | 30分 | 30分(executeInParallel+コールバック指定時は60分) |
| アクセス方法 | 個別アカウントのスクリプト画面 | MCCアカウントのスクリプト画面 |
| アカウント切替 | 不要 | AdsManagerApp.accounts()で切替 |
代理店・支援会社で複数のクライアントアカウントを管理している場合は、MCCスクリプトを活用するとレポートやアラートの横断管理が効率化されます。
セキュリティ
スクリプト内にはパスワードやAPIキーなどの機密情報をハードコードしないでください。Googleスプレッドシートの保護されたシートに設定値を格納し、スクリプトから読み取る方法が安全です。
スクリプトの編集・実行権限はGoogle広告アカウントのアクセス権限に連動します。管理者権限を持つユーザーのみがスクリプトを作成・変更できます。
まとめ
Google広告の自動化は、管理画面の自動化ルールとGoogle Ads Scriptsの2つの手段があります。
自動化ルールはプログラミング不要で手軽に使えますが、柔軟性には限界があります。Google Ads Scriptsは学習のハードルはありますが、データ取得から外部連携まで幅広い自動化を実現できます。
まずは自動化ルールで対応できるか検討し、要件がその範囲を超える場合にスクリプトを導入するのが現実的な進め方です。スクリプトの導入は「通知のみ」の安全な処理から始め、精度を確認したうえで段階的に自動化の範囲を広げてください。
運用型広告のコンサルタント。Google広告・Meta広告・Yahoo!広告を中心に10年以上の実務経験。