google-ads-scripts

Installation
SKILL.md

Google Ads Scripts

JavaScript that runs in Google Ads (Tools > Bulk actions > Scripts) on the Google Ads API. Selector conditions and reports use GAQL field names (campaign.status, ad_group_criterion.quality_info.quality_score, metrics.cost_micros); Google picks the API version, so scripts do not pin one.

Steps

  1. Read with the cheapest tool. Use selectors (AdsApp.keywords().withCondition(...)) when you will modify the entities you read. Use AdsApp.search or AdsApp.report with a GAQL query when you need metrics the Stats object lacks (conversion value, ROAS, impression share, quality-score components) or rows across many entities. Done when every metric the script uses comes from a source that actually returns it.

  2. Filter on the server. Put every filter in .withCondition() or the GAQL WHERE, add .forDateRange('LAST_30_DAYS') (or another relative range) whenever a condition touches metrics.*, and cap with .withLimit(). Done when no JavaScript if re-filters what a condition could have filtered, and no date is hard-coded.

  3. Get the units right. Entity methods are in account currency (Stats.getCost(), Budget.setAmount(50), keyword.bidding().setCpc(1.25)); GAQL is in micros (metrics.cost_micros > 100000000 means 100). Done when every / 1000000 divides a GAQL *_micros value and nothing else.

  4. Gate every mutation. Ship with DRY_RUN = true, clamp each change (minimum and maximum bid, maximum percentage change per run), skip shared budgets unless intended (budget.isExplicitlyShared()), and record what changed to a Sheet or email. Done when a dry run logs exactly the changes a live run would make.

  5. Fit the 30-minute limit. Collect the IDs to change first, then mutate; fetch entities in bulk with .withIds([...]) (10,000 per selector). For manager accounts use AdsManagerApp.accounts().executeInParallel(...) (50 accounts per call). Done when the run time is bounded by .withLimit() or batch size, not account size.

Quick start

Pause keywords with a low quality score and real spend:

Installs
116
GitHub Stars
93
First Seen
Jan 25, 2026