Google Ads Scripts入門|自動化ルールとスクリプトで運用を効率化する

広告運用における自動化の選択肢

Google広告には、運用の一部を自動化する仕組みが2つあります。管理画面から設定できる「自動化ルール」と、JavaScriptでカスタムロジックを記述する「Google Ads Scripts」です。

どちらも目的は「手動で繰り返す判断や操作を自動化する」ことですが、対応できる範囲と柔軟性が大きく異なります。

自動化ルール vs Google Ads Scripts自動化ルール管理画面から設定対応範囲キャンペーン / 広告グループ /キーワード / 広告の ON/OFF・入札変更条件設定指標の閾値(CPA > 5,000 など)プリセットの条件のみ外部連携メール通知のみプログラミング不要Google Ads ScriptsJavaScriptで記述対応範囲Google Ads APIで操作可能なほぼすべてのエンティティ条件設定自由なロジックを記述可能複数条件の組み合わせ、計算式も可外部連携スプレッドシート / メール / 外部APIプログラミングJavaScript(基礎レベル)が必要

自動化ルールはノーコードで手軽に使えますが、条件の組み合わせや外部サービスとの連携には対応していません。より柔軟な自動化が必要な場合にGoogle Ads Scriptsが選択肢になります。

自動化ルールの基本

まず、管理画面から設定できる自動化ルールの概要を押さえましょう。

自動化ルールでできること

自動化ルールは、指定した条件に該当したときに、あらかじめ決めたアクションを自動実行する機能です。管理画面の「ツールと設定」→「一括操作」→「ルール」から設定できます。

アクション対象ユースケース
キャンペーンの有効化/一時停止キャンペーン期間限定セールの開始・終了を自動制御
入札単価の引き上げ/引き下げキーワード掲載順位に応じた入札調整
予算の変更キャンペーン曜日や時間帯に応じた予算調整
メール通知全エンティティ特定条件を満たしたときの通知

自動化ルールの限界

自動化ルールは便利ですが、以下のような場面では対応できません。

  • 複数の指標を組み合わせた複雑な条件判定
  • スプレッドシートへのデータ書き出し
  • 外部サービスへの通知(Slackやチャットツール等)
  • アカウントをまたいだ横断的な処理
  • カスタム計算式に基づく判断

これらの要件がある場合は、Google Ads Scriptsを使います。

運用メモ 自動化ルールとスマート自動入札は目的が異なります。スマート自動入札は機械学習で入札を最適化する仕組みで、目標CPA・目標ROASなどの戦略に基づいて動きます。自動化ルールは「特定条件 → 特定アクション」の単純なルール実行です。両者は併用できますが、自動入札が有効なキャンペーンで入札単価を自動化ルールで上書きすると、学習を阻害するため避けてください。

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_THRESHOLDALERT_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を設定します。初回実行時にシートが存在しない場合はヘッダー行を含めて自動作成します。

データ書き出しの実行フロー

スクリプトの実行は、以下の流れで処理されます。

スクリプト実行フロースケジュール毎日 / 毎時 / 毎週main() 実行スクリプトが起動GAQL実行広告データを取得加工・計算CPA / ROAS算出出力シート / メールエラー発生時Logger.logにエラー詳細を記録 → 実行ログで確認 → メール通知(任意)実行時間の上限: 30分(MCCのexecuteInParallel+コールバック指定時のみ60分)。大量データは分割実行が必要

実用スクリプト例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_ARGUMENTGAQLの構文エラークエリのフィールド名やWHERE句を確認
RESOURCE_EXHAUSTEDAPI呼び出し回数の上限処理をバッチ化する、実行頻度を下げる

エラー通知を自動化するには、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は学習のハードルはありますが、データ取得から外部連携まで幅広い自動化を実現できます。

まずは自動化ルールで対応できるか検討し、要件がその範囲を超える場合にスクリプトを導入するのが現実的な進め方です。スクリプトの導入は「通知のみ」の安全な処理から始め、精度を確認したうえで段階的に自動化の範囲を広げてください。

r
ryottaman

運用型広告のコンサルタント。Google広告・Meta広告・Yahoo!広告を中心に10年以上の実務経験。

この記事について感想やご質問を送れます

誤りの指摘、補足情報、ご質問など、お気軽にどうぞ。