validate_onlyで入稿ミスを実行前に弾く3手順

広告の入稿ミスは、気づいた時にはもう配信が始まっている。日予算の桁を1つ間違えれば、数時間で数十万円が溶ける。人力のダブルチェックは何度でもすり抜ける。API経由で入稿している運用者なら、実行前にサーバー側で検証させる手段がある。Google広告APIのvalidate_onlyだ。この記事では、validate_onlyで弾けるミスと弾けないミスを切り分け、実行前チェックを3手順のルーティンに落とす。

入稿ミスは「実行後」に気づくと戻せない

API入稿の事故が怖いのは、取り消しの難易度が操作ごとに違うからだ。日予算の変更は上書きで戻せる。だが入札戦略の変更は、戻しても学習がリセットされた事実は消えない。キャンペーンの有効化は、配信済みのインプレッションを取り消せない。

とくに事故りやすいのがGoogle広告APIの金額単位micros(100万分の1通貨単位)だ。日予算3,000円は3000000000ではなく3000000と書く。ゼロを3つ多く打っても、APIは文法上正しいリクエストとして受け取る。人間の目視では、桁の多い数字ほど見落とす。

そこで運用では、書き込みを「①検証だけ実行 → ②APIで実値を読み返して照合 → ③有効化」の3段に分けている。読み返しの際は必ず1,000,000で割って円に戻してから、意図した値と突き合わせる。microsのまま比較すると、桁ミスを桁ミスのまま見逃す。APIの基本的な叩き方はGoogle広告APIをPythonで動かす手順にまとめた。

validate_onlyの正体と、Pythonでの付け方

validate_onlyは、リクエストを実際には反映せず、バリデーションだけ走らせるフラグだ。trueを付けると、アカウントには何も作られない。にもかかわらず、入力に問題があれば通常どおり例外が返る。つまり「本番と同じ検証ロジックを、副作用なしで通せる」。

Pythonクライアントで最初につまずくのがここだ。validate_onlyは各サービスのメソッド引数として用意されていない。client.get_type("MutateCampaignsRequest") でリクエストオブジェクトを作り、request.validate_only = True と直接代入してから渡す必要がある。キーワード引数で渡そうとすると通らない。この挙動は公式のオプションリクエストヘッダー解説(developers.google.com/google-ads/api/docs/client-libs/python/optional-request-headers)に書かれている。

成功時のレスポンスにも注意がいる。検証だけなので、返ってくるリソース名は空だ。戻り値のIDを次の処理に渡す設計にしていると、検証モードのときだけ後続が壊れる。検証実行と本番実行でコードパスを共有するなら、validate_onlyがtrueの時は戻り値を使わないと決めておく。

広告テキストの検証サンプルは公式にもある(developers.google.com/google-ads/api/samples/validate-ad)。文字数超過や禁止表現を、作成せずに洗い出す用途だ。

実行前チェックの3手順

ここが実務の型だ。ブックマークして、自分の環境に合わせて書き換えて使ってほしい。

  • 手順1: 意図値テーブルを先に作る — 「どのリソースを、いくつに変えるのか」をCSVかdictで先に確定させる。コードの中で計算しながら書き込むと、照合の基準が残らない。
  • 手順2: validate_onlyで全件流す — 1件ずつではなく、その回の変更を全件まとめて検証する。1件でも落ちたらバッチ全体を止める。部分的に通す運用にすると、どこまで反映されたか分からなくなる。
  • 手順3: 反映後に読み返して照合する — 書き込み直後にGAQLで同じリソースを取得し、金額は1,000,000で割ってから意図値と全件比較する。件数も数える。「3件変えるはずが2件しか返らない」を検知するためだ。

手順3が最重要になる。理由は次の章にある。この3手順をスクリプト化した完全版はnoteの実践ガイドにまとめている。

validate_onlyでは弾けないミスがある

validate_onlyが検知するのは、あくまで形式と整合性だ。日予算に負の数を入れた、必須フィールドが欠けている、文字数が上限を超えた、といった類は止まる。

止まらないのは「形式として正しい、意味的に間違った値」だ。具体的には次の3つが代表格になる。

  • 桁を間違えた金額(3000000000 microsは形式として合法な日予算)
  • 対象リソースの取り違え(別キャンペーンのIDに正しい値を書く)
  • 変えるつもりのない項目への巻き添え更新(update_maskの指定漏れ)

3つとも、APIは正常終了する。だから検証を通したことを安全の根拠にしてはいけない。安全を担保するのは、手順3の読み返し照合のほうだ。validate_onlyは「壊れたリクエストを止める門」であって、「意図と合っているか判定する門」ではない。

もう1つの実務的な保険が、作成時は必ず一時停止(PAUSED)で作り、読み返しに通ってから有効化する二段書き込みだ。有効化を分離しておけば、意味的なミスに気づいた時点でまだ配信が始まっていない。日予算そのものの決め方は広告の日予算を自動計算するPython実装で扱っている。

チェックを自動で止める仕掛けに変える

ルールを決めても、急いでいる日に飛ばすのが人間だ。実行前チェックは、書いたコードの中ではなくその手前に置くと守られる。

具体的には、金額をコードへ直に書いたリクエストを検出したら実行前に確認を挟む、という前処理を1枚かませる。運用では、microsの直書きを含むコマンドを実行しようとすると確認が入る仕組みにしてある。導入してから、桁の直書きを無意識にやる回数そのものが減った。止められると面倒なので、意図値テーブルを先に作るほうへ手が動く。

[PR] 検証フローや運用ルールを社内資料に落とし込むなら、AIスライド作成ツール「イルシル」を試してみるのも手だ。

まとめ

validate_onlyは無料で使える事前検証の門であり、形式エラーをアカウントに触れずに落とせる。ただし桁ミスとリソース取り違えは通過する。だから「validate_onlyで検証 → PAUSEDで作成 → 読み返して円換算で照合 → 有効化」の順序をセットで運用する。まずは次の入稿1件を、この順序で通してみてほしい。

実務でそのまま使いたい人へ

本記事の手法の完全版(実際のコード・テンプレート・つまずき対処つき)は、運営者のnote(note.com/ryo_ai_hack)で公開している。実データに基づく実践ガイドをまとめて読める。

DMM 生成AI CAMP

コメント

このブログの人気の投稿

Claude Skills販売で月5万稼ぐ3ステップ実践

Claude CodeでExcel自動化副業を月5万にする手順

Yahoo広告APIをPythonで自動化して詰まった5つの罠