agentleFS
fourteenwmfourteenwm/ppc-ai-skills/rsa-bulk-edit/SKILL.md

rsa-bulk-edit

Skill72 starsChanged 4 months agoMITView on GitHub

Find and replace text across RSA ads at scale, outputting to Google Sheet in Google Ads Editor format for review before manual import. Auto-invoke when user says "RSA bulk edit", "find and replace in RSA ads", "edit RSA ads at scale", or "bulk RSA changes". Supports single account, multiple CIDs, dry-run preview, and case-sensitive matching.

  • Installs packages

The file

We split this skill into the rules it gives an agent

3 rules. About 0 are common, 2 are distinctive, and 1 is very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈2

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 1

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    No validation: No length checks, no casing adaptation, no meaning checks — the rules.md review checklist is the validation layer, by design …

    line 111
  2. Distinctive:

    Search the whole token — matching text inside the braces corrupts the customizer instead of retiring it.

    line 176
  3. Distinctive:

    Read-only against Google Ads — one GAQL SELECT per account, and the only write is the review tab in a sheet you own.

    line 181

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

RSA Bulk Edit Skill

Find-and-replace literal text across RSA ads in one or more accounts, outputting a Google Ads Editor-ready review sheet. One operator owns the workflow end to end: scope the swap → dry-run → sheet → the review checklist in rules.md (length audit, casing scan, collateral read) → per-account Editor paste → post.

The tool is deliberately dumb: it moves text you already decided on. If the change needs judgment about meaning or new copy, it's not bulk work — rules.md has the boundary table.

Auto-Invocation Triggers

  • "RSA bulk edit"
  • "find and replace in RSA ads"
  • "edit RSA ads at scale"
  • "bulk RSA changes"

Prerequisites

  • google-ads.yaml at project root — see the google-ads-api-setup skill if you don't have one. The --sheet-id output step reuses this same file's OAuth credentials for the Sheets API — its refresh token must carry the spreadsheets scope, which the setup skill's generator grants by default (token predates that? re-run the generator once)
  • Run from the directory holding google-ads.yaml — the script loads it by literal filename; there is no --config flag
  • Python packages: pip install google-ads gspread google-auth pyyaml

Usage

Single Account

python scripts/rsa_bulk_edit.py \
  --cid 1234567890 \
  --search "color" \
  --replace "colour" \
  --sheet-id YOUR_SHEET_ID

Multiple Accounts

python scripts/rsa_bulk_edit.py \
  --cids "1234567890,2345678901,3456789012" \
  --search "color" \
  --replace "colour" \
  --sheet-id YOUR_SHEET_ID

Custom Tab Name

python scripts/rsa_bulk_edit.py \
  --cid 1234567890 \
  --search "color" \
  --replace "colour" \
  --sheet-id YOUR_SHEET_ID \
  --tab-name "RSA - QA"

Dry Run (Preview Only)

python scripts/rsa_bulk_edit.py \
  --cid 1234567890 \
  --search "color" \
  --replace "colour" \
  --dry-run

Arguments

ArgumentRequiredDescription
--cidAt least one of cid/cids (both combine)Single customer ID (dashes stripped)
--cidsAt least one of cid/cids (both combine)Comma-separated customer IDs
--searchYesLiteral text to find (substring match — no regex, no word boundaries)
--replaceYesReplacement text, inserted exactly as typed ("" = delete)
--sheet-idNoGoogle Sheet ID for output
--tab-nameNoTab name (default: RSA Edits)
--case-sensitiveNoEnable case-sensitive matching
--dry-runNoConsole preview only (first 10 matches), no sheet write

Match semantics, the sheet's exact column layout, and every run mode: references/edit-contract.md. Scope in one line: ENABLED RSAs in ENABLED campaigns (any ad-group status), searching headlines and descriptions only — paths and final URLs are carried to the sheet but never edited.

Post-Script Workflow

  1. Review sheet, filter by "Has Match" = YES
  2. Run the rules.md checklist — length audit (the script writes over-limit text unflagged), casing scan, collateral read
  3. Filter to ONE account; copy columns C onwards (Campaign through Final URL)
  4. Paste into Google Ads Editor with that account open
  5. Review changes in Editor's preview (pasted rows carry no ad identity)
  6. Post changes; repeat per account

What this skill deliberately does NOT do

  • No API mutations, ever. The only write is the review sheet; text reaches Google Ads solely through your Editor paste-and-post.
  • No copy generation. Literal replacement only. Rewriting weak copy is rsa-refresh; net-new ad sets are rsa-single-account.
  • No validation. No length checks, no casing adaptation, no meaning checks — the rules.md review checklist is the validation layer, by design in front of a human.
  • No paths or extensions. Headlines 1–15 and Descriptions 1–4 are the only searched fields.

Files in this skill

FilePurpose
SKILL.mdThis file — workflow + routing
README.mdZero-context setup: install, prerequisites, first run
rules.mdJudgment layer: when bulk is wrong, pre-flight, review checklist, false alarms
examples.mdWorked reads: a rebrand with catches, substring collateral, the ask that isn't bulk work
references/edit-contract.mdExact match semantics, sheet columns, run modes, Editor-paste contract
scripts/rsa_bulk_edit.pyThe engine: GAQL query → find/replace → sheet write

The output tab lives in a sheet you own — no runtime data in this folder.

When to load a sibling skill

SituationLoad
The "edit" changes meaning or quality — rewriting LOW performers, tone work, per-context judgmentrsa-refresh
A full RSA set for an account from scratchrsa-single-account
Replacement text introduces any claim (services, hours, credentials)ad-copy-verification-standard — verify before running the swap
The task turns out to be writing new copy into slotsad-copy-generation-framework
Confirming what actually changed in the account after an Editor postchange-history-checker
No google-ads.yaml yetgoogle-ads-api-setup

Examples

UK Spelling Corrections

# Color -> Colour
python scripts/rsa_bulk_edit.py \
  --cids "1234567890,2345678901" \
  --search "color" \
  --replace "colour" \
  --sheet-id YOUR_SHEET_ID

# Center -> Centre
python scripts/rsa_bulk_edit.py \
  --cids "1234567890,2345678901" \
  --search "center" \
  --replace "centre" \
  --sheet-id YOUR_SHEET_ID

Title-Case portfolios: run case-sensitive passes per casing variant (Color→Colour, then color→colour) — the replacement is inserted exactly as typed (rules.md pre-flight #3).

Customizer Replacement

python scripts/rsa_bulk_edit.py \
  --cid 1234567890 \
  --search "{CUSTOMIZER.Price}" \
  --replace "Contact For Rent Pricing" \
  --sheet-id YOUR_SHEET_ID \
  --tab-name "RSA - QA"

Search the whole token — matching text inside the braces corrupts the customizer instead of retiring it.

Safety

Read-only against Google Ads — one GAQL SELECT per account, and the only write is the review tab in a sheet you own. Nothing changes in any account until a human reviews and posts through Google Ads Editor.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.