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
In this repository41 other files it gives its agents.
- account-diagnosticSkill
- ad-copy-generation-frameworkSkill
- ad-copy-verification-standardSkill
- add-account-negative-keywordsSkill
- ads-checkerSkill
- budget-guardianSkill
- budget-recommendation-calculatorSkill
- change-history-checkerSkill
- client-communication-standardsSkill
- competitor-analysis-v2Skill
- conversion-tracking-healthSkill
- dgen-automation-disableSkill
- fair-housing-complianceSkill
- ga4-campaign-cross-referenceSkill
- ga4-cross-analysisSkill
- ga4-lead-quality-investigationSkill
- gaql-query-patternsSkill
- geo-conflict-analyzerSkill
- google-ads-api-setupSkill
- google-ads-querySkill
- google-ads-samplesSkill
- impression-share-diagnosticsSkill
- investigation-methodologySkill
- lead-quality-pattern-analysisSkill
- lead-quality-recommendation-prioritizationSkill
- markdown-to-sheets-presenterSkill
- mcc-hack-auditSkill
- mutation-safetySkill
- neg-conflict-finderSkill
- non-serving-keyword-scannerSkill
- pmax-asset-automationSkill
- pmax-builderSkill
- portfolio-health-prioritizationSkill
- portfolio-pacing-rulesSkill
- rsa-refreshSkill
- rsa-single-accountSkill
- shared-budget-updaterSkill
- sqr-classifierSkill
- sqr-pipelineSkill
- underspending-investigationSkill
- youtube-placement-auditSkill
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
- Very specific: line 111
No validation: No length checks, no casing adaptation, no meaning checks — the rules.md review checklist is the validation layer, by design …
- Distinctive: line 176
Search the whole token — matching text inside the braces corrupts the customizer instead of retiring it.
- Distinctive: line 181
Read-only against Google Ads — one GAQL SELECT per account, and the only write is the review tab in a sheet you own.
≈ “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.
Files
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.yamlat project root — see the google-ads-api-setup skill if you don't have one. The--sheet-idoutput step reuses this same file's OAuth credentials for the Sheets API — its refresh token must carry thespreadsheetsscope, 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--configflag - 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_IDMultiple Accounts
python scripts/rsa_bulk_edit.py \
--cids "1234567890,2345678901,3456789012" \
--search "color" \
--replace "colour" \
--sheet-id YOUR_SHEET_IDCustom 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-runArguments
| Argument | Required | Description |
--cid | At least one of cid/cids (both combine) | Single customer ID (dashes stripped) |
--cids | At least one of cid/cids (both combine) | Comma-separated customer IDs |
--search | Yes | Literal text to find (substring match — no regex, no word boundaries) |
--replace | Yes | Replacement text, inserted exactly as typed ("" = delete) |
--sheet-id | No | Google Sheet ID for output |
--tab-name | No | Tab name (default: RSA Edits) |
--case-sensitive | No | Enable case-sensitive matching |
--dry-run | No | Console 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
- Review sheet, filter by "Has Match" = YES
- Run the
rules.mdchecklist — length audit (the script writes over-limit text unflagged), casing scan, collateral read - Filter to ONE account; copy columns C onwards (Campaign through Final URL)
- Paste into Google Ads Editor with that account open
- Review changes in Editor's preview (pasted rows carry no ad identity)
- 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 arersa-single-account. - No validation. No length checks, no casing adaptation, no meaning
checks — the
rules.mdreview 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
| File | Purpose |
SKILL.md | This file — workflow + routing |
README.md | Zero-context setup: install, prerequisites, first run |
rules.md | Judgment layer: when bulk is wrong, pre-flight, review checklist, false alarms |
examples.md | Worked reads: a rebrand with catches, substring collateral, the ask that isn't bulk work |
references/edit-contract.md | Exact match semantics, sheet columns, run modes, Editor-paste contract |
scripts/rsa_bulk_edit.py | The 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
| Situation | Load |
| The "edit" changes meaning or quality — rewriting LOW performers, tone work, per-context judgment | rsa-refresh |
| A full RSA set for an account from scratch | rsa-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 slots | ad-copy-generation-framework |
| Confirming what actually changed in the account after an Editor post | change-history-checker |
No google-ads.yaml yet | google-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_IDTitle-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.
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
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.

