◉GEMINI LABJP
●ARGON — gemini-4-argon is generally available as of 10/13, aimed at complex coding, agents, math and science●DEEP RES — The old Deep Research agent shut down on 10/23. If calls fail, move to deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 is GA (10/06). gemini-3.1-flash-image is deprecated with no shutdown date yet●MCP — One write-up cut an 85,000-token tool result to 310 tokens by wrapping it in an ADK FunctionTool●FLASH — gemini-3.7-flash and 3.5-flash now route automatically to newer Flash models (10/08)●NEW — Stop Re-Reading Every Crash Report: Gre…●ARGON — gemini-4-argon is generally available as of 10/13, aimed at complex coding, agents, math and science●DEEP RES — The old Deep Research agent shut down on 10/23. If calls fail, move to deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 is GA (10/06). gemini-3.1-flash-image is deprecated with no shutdown date yet●MCP — One write-up cut an 85,000-token tool result to 310 tokens by wrapping it in an ADK FunctionTool●FLASH — gemini-3.7-flash and 3.5-flash now route automatically to newer Flash models (10/08)●NEW — Stop Re-Reading Every Crash Report: Gre…
Articles/Workspace
◧ Workspace/2026-10-26Beginner

Sorting Forms free-text answers with the Sheets AI function: decide the shelves before you write the formula

How to sort free-text Google Forms answers into request, bug, thanks and other with the Sheets AI function: fixing the categories first, trying 20 rows, checking against your own reading, and freezing the result as values.

Google FormsGoogle Sheets8AI functionGemini95Survey analysis

Somewhere past the hundredth response, my finger gets heavy on the scroll wheel. Free-text answers from a request form look different one by one, and before I notice, the question has quietly changed from "which one should I reply to first?" to "what was I looking for in the first place?"

As an indie developer who reads app feedback week after week, I know that feeling well. The weight isn't the number of rows. It's that the sorting rule lives only in my head.

So I let the Sheets AI function help with the sorting. But there is one thing to settle before any formula gets typed: the shelves.

Fix three shelves and an "other" first

If you simply ask an AI to "categorize these nicely," the wording drifts from row to row. "Request," "feature wish," and "suggestion" end up as three different labels for the same thing, and you can't count them later.

So I fix the labels by hand beforehand. Here they are, four in all.

ShelfWhat goes inExample answer (made up)
request"I wish it did this"The screen is too bright at night. A darker theme would be nice.
bug"I can't do X," "it doesn't work"The app closes when I open Settings.
thanksGratitude, or a note that they keep using itIt has become part of my morning.
otherAnything that fits none of the aboveI'd like to know how often ads are shown.

"Other" isn't an escape hatch. It's a place for the AI to put answers it would otherwise force into one of the three. The shelf names are the exact strings you'll later count with COUNTIF or a pivot table, so once they're set, I don't rename them midway.

Bring the form responses into a sheet

In the Responses tab of Google Forms, choose the link-to-Sheets option and the answers start piling up in a spreadsheet. I'll assume column C holds the free text and column D will hold the result. Put "category" in D1 and "my call" in E1; column E is for comparing against the AI later.

A formula in column D does not follow new response rows by itself. If you assume it will, the newest answers stay unsorted. I plan on copying the formula down by hand.

Start with one row

Put this in D2.

=AI("Classify the following free-text answer as exactly one word from: request, bug, thanks, other. Do not explain.", C2)

Three things are pinned down here.

  • The shelf names appear in the prompt exactly as I want them in the cell
  • "Exactly one word" and "do not explain" keep the cell down to the label alone
  • The text to read is passed as the second argument, the range C2

Google's help page strongly recommends giving the function its data through that range argument. The AI function can't read the whole sheet or other files in Drive, so anything you want it to see has to be in the range.

Select D2 and press Generate and insert. The cell gets one label, and the change history records you as the editor of that cell. You can also get there from Insert, then Function, then AI.

Try twenty rows, then compare with your own reading

I don't run all rows at once. I select D2 through D21 and generate only those. When you select several cells, only the first 350 are generated, so twenty is nowhere near that limit.

If the button won't respond or nothing generates, the cause may be where the file is stored or which plan you're on. I wrote that triage in a separate article, When the Sheets AI Function Won't Generate, Suspect the File's Location Before the Limit.

Once the twenty rows are filled, read them yourself and type your own call into E2 through E21. It's the tedious part, and the most important one. Then put this in F2 to flag disagreements.

=IF(D2=E2, "", "check")

And count them with this.

=COUNTIF(F2:F21, "check")

If even a few of twenty disagree, I rewrite the definition before running the rest. That's a rule of thumb, not a rule, but a mismatch you see in twenty rows comes back ten times larger in two hundred.

When I read the mismatched rows, the cause is more often a fuzzy boundary between shelves than a misreading by the AI. Take "I'm not getting notifications." Is that a bug or a request? If a person hesitates, the AI will too.

So I add the boundary in one sentence.

=AI("Classify the following free-text answer as exactly one word from: request, bug, thanks, other. If the answer says something cannot be done or does not work, it is a bug. If it says how things should be, it is a request. Do not explain.", C2)

You could keep the definition in a separate cell and join it into the prompt with concatenation. But the help page notes that when data in a concatenated range changes, you won't be prompted to refresh. After editing the definition cell, you decide when to regenerate.

Freeze the result as values

AI function output can be regenerated. The flip side is that opening the same sheet later and regenerating may not give you the same answers. And according to the help page, the function can't be undone or redone.

So once the sorting has settled, I turn the column I'll tally from into plain values. Copy and paste-values works, but I like doing a selected range in one step, so I keep a small Apps Script function around.

/**
 * Replace formulas in the selected range with their current values,
 * so AI function output is frozen before it goes into any tally.
 */
function freezeSelectedRange() {
  const range = SpreadsheetApp.getActiveRange();
  range.setValues(range.getValues());
}

getValues() returns what you currently see, not the formulas, and writing it back with setValues() replaces each formula with its value. There is no undo, so make a copy of the sheet before running it.

When the function isn't available at all

The help page lists reasons the "AI function isn't available" message can appear: you aren't in the Workspace Experiments program or your Workspace plan doesn't include the function, or an admin or language setting is in the way.

The only thing you can fix yourself is the language setting. For the rest, checking your plan is as far as I'd go before asking an administrator.

Tonight, just twenty rows

Sorting accuracy depends less on how the formula is phrased than on how clearly the shelf names and their boundaries were decided up front. Write the formula last and decide the shelves first. That order is one I try to keep no matter how many forms I end up reading.

Tonight, pick twenty rows from your own responses, write down four shelf names, and put one formula in D2. Reading the rows that disagree becomes your next definition.

Share

Thank You for Reading

Gemini Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • ✦Copy-paste ready implementation code
  • ✦New advanced guides published daily
  • ✦$5/mo or $10 for lifetime access
View Membership →

If you found this article helpful, a small tip ($1.50) would mean a lot to us. Your support helps keep this site ad-free and covers server and hosting costs.

Related Articles

◧ Workspace2026-09-16
When the Sheets AI Function Won't Generate, Suspect the File's Location Before the Limit
If Generate and insert stays greyed out in Google Sheets, don't assume you hit the 24-hour cap. Spreadsheets opened through Dropbox, Box or Egnyte can't generate at all. Here's the order I check things in now.
◧ Workspace2026-08-26
Sheets canvas Takes the Entry Point, Not the Execution Boundary
With Sheets canvas available, how much of your hand-built Apps Script can you actually retire? Sorting the answer by execution boundary, with the decision rules and a classifier script that does the inventory for you.
◧ Workspace2026-10-15
Before you turn on Meet's automatic notes: three things to settle in the calendar event
Some Meet note-taking settings can't be changed once someone has joined the call. Here is what to decide in the calendar event first — language, sharing scope, how it starts — and how to tell participants, following Google's help pages.