AI Adoption GuideGeneralSelect
Vibe scripting
Vibe scripting uses AI to draft small scripts for spreadsheet or workspace busywork when a lightweight script is faster than a full automation project.
By Don, DoneThat’s AI coach · updated
A small script is for bounded busywork, not a standing workflow
Use vibe scripting when a lightweight script is faster than clicking through the sheet and cheaper than standing up a full automation project. The job is a bounded transform you will run once, or a few times, on a file you control: reshape an export, split a column, or normalize a handful of status values.
A process that must fire on every new row, wait on people, or talk to other tools is workflow automation, not a one-off script. Filling missing company or title fields from outside sources is data enrichment. Building a site from a prompt is vibe-coding websites. Keep those lanes separate so you do not treat a production system as a scratch pad.
The quality bar is narrow. A usable result cites the sample input and the expected columns. If you have no sample, leave the script empty. Do not invent a formula that mutates the live workbook. You still run whatever you get on a copy first.
ChatGPT, Claude, and Copilot can draft the script. Google Apps Script and Excel are where it runs. The chat window does not see your live sheet unless you paste it. The spreadsheet will do exactly what the code says, including the destructive parts.
Paste the sample first, or leave the script empty
Do not describe the sheet in the abstract and hope the model guesses the headers. Paste a real sample: the header row plus enough data rows that blanks, odd capitalization, and the values you care about mapping are visible.
This page uses one example. A coordinator exports event RSVPs. Headers: First Name, Last Name, Email, RSVP Status, Dietary, Notes. Sample rows:
- Sam, Ortiz, [email protected], yes, vegetarian, (blank notes)
- Jordan, Lee, [email protected], (blank status), (blank dietary), waitlist
- Priya, Shah, [email protected], attending, (blank dietary), plus one
- Chris, Ng, [email protected], no, (blank dietary), (blank notes)
Intended output: Full Name (First Name plus Last Name, trimmed) and Status (Yes, No, or Maybe). Empty RSVP Status stays empty. Dietary and Notes are not rewritten. Email is not "fixed." There is no Attendance Score, no Likelihood, and no in-place overwrite of RSVP Status.
If that sample is missing, stop. Ask again after you have a header row and a few real lines. A model that invents Status_Clean, GuestCount, or a default of No for blanks is guessing. Empty stays empty when you have no sample. That is the correct failure.
When you paste, say what must not change. Name the tab if the file has more than one. Say whether the script should add columns to the right or write a second sheet. Silence on those points is how you get a script that sorts the live range or drops rows it does not recognize.
Ask for code that cites the input and the output columns
Write the prompt so the generated script documents the headers before it transforms them. Require comments that name the exact input columns from the sample and the exact output columns you asked for. If a requested column cannot be derived from the sample, the script should skip it rather than fabricate a formula.
Prompt for the example:
Here is a sample from my RSVP export, header row included. Input columns: First Name, Last Name, Email, RSVP Status, Dietary, Notes. Write a Google Apps Script, or an Excel macro that matches the file I actually have, that adds Full Name and Status. Map RSVP Status values yes, y, attending to Yes; no, n to No; maybe, m to Maybe, case-insensitive. Leave Status blank when RSVP Status is blank. Do not invent other columns. Do not overwrite RSVP Status, Email, Dietary, or Notes. Do not write to the original sheet. Write to a sheet named RSVP_copy. Cite these input and output column names in comments at the top. If a column I named is not in the sample, do nothing for that column.
The last sentence is the guardrail. It stops the model from parsing "plus one" in Notes into a Guest Count. Notes is free text. Parsing it is a different task, with its own sample.
Name the runtime. Google Apps Script and Excel do not share a dialect. ChatGPT, Claude, and Copilot will still produce something that looks right for the wrong runtime. Plausible and runnable are not the same.
If you already keep AI Skills for prompting, put the same constraints there: sample first, columns named, no mutation of production, copy sheet required. Skills stop you retyping guardrails. They do not review the code.
Run on a copy, then check blanks and invented columns
Duplicate the file or the tab, then paste the script into that copy. Do not try it on the live attendance list. Running on production first is how a short cleanup becomes an edit you cannot reverse. Spreadsheet undo is not a backup after you close the file, after a script writes in batches, or while someone else has the workbook open.
After the copy run, check before production:
- Full Name is First plus Last. A missing name stayed blank.
- Status is Yes, No, Maybe, or empty. Empty input stayed empty. "attending" became Yes. Nothing became a number.
- Column count matches what you asked for. A new column you did not name means you delete the script, not keep the extra field because it looks handy.
- Email, Dietary, Notes, and original RSVP Status match the copy's starting values, aside from the new columns.
Inventing a column is a fail even when the values look reasonable. The script must cite the sample and the expected columns. Extra output means the model left the brief. Rewrite it.
Only after the copy matches do you run the same script toward production, still by copying the live tab, running, and replacing only when the check passes again. A formula that mutates cells in place on the real sheet is out of scope. If the generated code overwrites RSVP Status, you accepted the wrong script. Change it. Do not run it "just this once" on the master file.
Generated code is a draft until you walk the logic
A clean run, a confident chat tone, or a first successful row is not review. Read the script. Check the range it touches, the sheet it writes to, whether it sorts or deletes, whether it assumes a header on row 1, and whether it fills blanks with a default.
In this example, watch for mapping only "yes" and dropping "attending"; filling blank Status with No; writing Full Name in all caps; starting at row 1 and turning the header into a data row; looping every tab; writing to whatever sheet happens to be active.
If you cannot explain a line, it does not ship. Ask the same model to annotate that line against the sample. If the annotation cites a column that is not in the paste, delete that path.
Unsafe target selection is its own bug. A script that hard-codes the production tab, or that binds to the active sheet with no copy, is unsafe even if the transform is correct. Point it at a named copy.
When the cleanup has to keep happening, stop vibe scripting it. Recurring RSVP transforms, nightly joins, or anything that must run unattended belong in workflow automation. A script you cannot name the columns for is not ready. A script you have not run on a copy is not ready. Production is the last step, not the test.
Is this worth automating for you?
Whether this pays back depends on how much time it takes your team today. Most teams estimate that from memory, and the estimate is usually wrong in one direction or the other.
DoneThat reconstructs where the time actually went, with no timers to forget, so you can measure the baseline before committing to a project and check the gain afterward.
Measure the baseline first