Para criar um formulário que classifica pedidos com IA, ligue um Google Forms a uma planilha, crie no Apps Script um gatilho de envio de formulário que manda o texto do pedido para a API do Gemini (ou da OpenAI) com uma lista fechada de categorias e um JSON Schema de resposta, e grave a categoria na própria linha da planilha. Pedidos em que o modelo marca baixa confiança, escolhe “outro” ou indicam urgência alta vão para uma fila de revisão humana. No formulário, um aviso curto explica que o texto será analisado por IA e para quê.
O resultado é uma triagem que começa no momento do envio, com categorias que não variam de grafia e um caminho claro para os casos duvidosos. Este guia trata de pedidos que chegam por formulário (orçamento, suporte, solicitação interna). Para mensagens que chegam por e-mail, o assunto é outro e está no guia de triagem de e-mails de atendimento com IA.
Resumo rápido
- Fluxo: Google Forms grava na planilha, o gatilho “ao enviar formulário” chama a IA e o script escreve categoria, urgência e confiança na mesma linha.
- Use saída estruturada com JSON Schema e
enumpara as categorias: o modelo só pode responder com valores da lista.- Saída estruturada garante o formato, não o acerto. O script ainda valida a resposta e manda os casos duvidosos para revisão.
- Inclua sempre a categoria “outro” e trate-a como “precisa de gente”.
- Avise no formulário que a IA classifica o pedido, peça só os dados necessários e não use o nível gratuito da Gemini API com dados pessoais.
Como o fluxo funciona
São quatro peças, todas dentro do Google Workspace, exceto a chamada à API:
- Google Forms: perguntas objetivas (nome, contato, tipo de cliente) e uma pergunta aberta “Descreva seu pedido”.
- Planilha de respostas: cada envio vira uma linha. Você acrescenta à direita as colunas Categoria, Urgência, Confiança, Justificativa e Status.
- Apps Script: um gatilho instalável de envio de formulário recebe o evento, lê o texto e chama a IA.
- Fila de revisão: uma aba “Revisão” (ou um filtro por Status) onde ficam os pedidos que uma pessoa precisa olhar antes de encaminhar.
A documentação do Apps Script descreve duas versões do gatilho de envio: uma vinculada ao Forms, cujo evento traz o objeto response com a resposta inteira, e outra vinculada à planilha, cujo evento traz namedValues (perguntas e respostas por nome), values e range (as células que receberam os dados). A versão da planilha é a mais simples aqui, porque o range já diz em que linha gravar o resultado.
Defina as categorias antes de escrever qualquer código
A qualidade da classificação depende mais da lista de categorias do que do modelo. Algumas regras práticas:
- Categorias que não se sobrepõem: se “Orçamento” e “Instalação” podem descrever o mesmo pedido, o modelo vai oscilar entre elas. Defina cada uma com uma frase e um exemplo.
- Poucas categorias: comece com cinco a oito. Dá para dividir depois, com dados reais na mão.
- “Outro” obrigatório: sem essa saída, o modelo é forçado a encaixar qualquer coisa em alguma categoria. A documentação da OpenAI recomenda dizer no prompt o que fazer quando a entrada não permite uma resposta válida, porque o modelo sempre tenta preencher o schema.
- Uma intenção por pedido: se é comum o cliente pedir duas coisas no mesmo texto, leia o guia de classificação multilabel antes de decidir o schema.
Saída estruturada no Gemini e na OpenAI
Saída estruturada é quando você entrega à API um JSON Schema e o modelo devolve um JSON que segue aquele formato. Com um campo enum, a categoria só pode ser um dos valores listados, o que elimina “Orçamentos”, “orcamento” e “Pedido de orçamento” como variações da mesma coisa.
| Item | Gemini API (Interactions API) | OpenAI (Responses API) |
|---|---|---|
| Onde vai o schema | response_format com mime_type: "application/json" e o campo schema |
text.format com type: "json_schema", name, schema e strict: true |
| Lista fechada de valores | enum em strings e números |
enum no schema |
| Exigências do schema | Nem todos os recursos de JSON Schema são aceitos; schemas muito grandes ou aninhados podem ser rejeitados | Exemplos usam additionalProperties: false e todos os campos em required |
| O que não é garantido | A documentação avisa que o JSON é válido, mas os valores ainda precisam de validação | Recusas podem vir fora do schema; resposta cortada por limite de tokens fica incompleta |
| Alternativa mais fraca | Pedir JSON só no prompt | JSON mode (json_object), que garante JSON válido mas não a aderência ao schema |
Nos dois casos, trate a saída estruturada como garantia de formato. Quem garante que a categoria faz sentido é a sua validação e a revisão humana.
O script, passo a passo
1. Chave e gatilho
Na planilha de respostas, abra Extensões > Apps Script, salve a chave da API em Configurações do projeto > Propriedades do script (GEMINI_API_KEY) e rode uma vez:
function instalarGatilho() {
ScriptApp.newTrigger('classificarPedido')
.forSpreadsheet(SpreadsheetApp.getActive())
.onFormSubmit()
.create();
}
Gatilhos instaláveis rodam com a conta de quem os criou, então use uma conta da empresa, não a pessoal de um funcionário que pode sair.
2. Chamada com schema
const CATEGORIAS = ['Orçamento de instalação', 'Manutenção preventiva',
'Conserto', 'Garantia', 'Financeiro', 'Outro'];
function classificarPedido(e) {
const texto = e.namedValues['Descreva seu pedido'][0];
const schema = {
type: 'object',
properties: {
categoria: { type: 'string', enum: CATEGORIAS },
urgencia: { type: 'string', enum: ['baixa', 'media', 'alta'] },
confianca: { type: 'string', enum: ['alta', 'baixa'] },
justificativa: { type: 'string', description: 'Uma frase curta.' }
},
required: ['categoria', 'urgencia', 'confianca', 'justificativa']
};
const corpo = {
model: 'gemini-3.8-flash',
store: false,
input: 'Classifique o pedido de um cliente de assistência técnica. '
+ 'Se não houver informação suficiente ou nenhuma categoria servir, '
+ 'use "Outro" e confianca "baixa". Pedido:n' + texto,
response_format: { type: 'text', mime_type: 'application/json', schema: schema }
};
const resp = UrlFetchApp.fetch('https://generativelanguage.googleapis.com/v1beta/interactions', {
method: 'post', contentType: 'application/json',
headers: { 'x-goog-api-key': PropertiesService.getScriptProperties().getProperty('GEMINI_API_KEY') },
payload: JSON.stringify(corpo), muteHttpExceptions: true
});
gravar(e.range.getRow(), resp);
}
A Interactions API é a interface que a Google recomenda para projetos novos desde junho de 2026; a generateContent segue suportada. O nome do modelo é o dos exemplos da documentação em outubro de 2026: confira a página de modelos antes de usar. O parâmetro store: false desliga o armazenamento da interação, que por padrão fica guardada por 55 dias no nível pago e 1 dia no gratuito.
3. Validar e decidir a rota
function gravar(linha, resp) {
const aba = SpreadsheetApp.getActive().getSheetByName('Respostas ao formulário 1');
let r = null;
if (resp.getResponseCode() === 200) {
const passo = JSON.parse(resp.getContentText()).steps
.filter(s => s.type === 'model_output').pop();
try { r = JSON.parse(passo.content.find(c => c.type === 'text').text); } catch (err) {}
}
const valido = r && CATEGORIAS.includes(r.categoria);
const revisar = !valido || r.confianca === 'baixa'
|| r.categoria === 'Outro' || r.urgencia === 'alta';
aba.getRange(linha, 8, 1, 5).setValues([[
valido ? r.categoria : 'ERRO', valido ? r.urgencia : '',
valido ? r.confianca : '', valido ? r.justificativa : '',
revisar ? 'Revisão' : 'Encaminhado'
]]);
}
Ajuste o nome da aba e a coluna inicial (8, no exemplo) ao seu formulário. Se a API falhar, a linha fica como ERRO e em revisão: nenhum pedido some.
A fila de revisão para baixa confiança
O campo confianca é uma autoavaliação do modelo, útil como sinal, mas não calibrada. Por isso a regra de revisão soma critérios objetivos: categoria “Outro”, resposta inválida, erro de API e urgência alta (onde um erro custa caro). Depois de algumas semanas, compare o que foi para revisão com a decisão final da equipe e ajuste. O guia sobre quando um classificador deve se abster mostra como medir esse ponto de corte.
Na prática, a fila é uma visão filtrada da planilha por Status = Revisão, com uma coluna “Categoria final” preenchida pela pessoa. Essa coluna vira seu conjunto de teste: sempre que mudar o prompt ou o modelo, reclassifique esses pedidos e veja quantos concordam com a decisão humana.
Privacidade e LGPD no formulário
Classificar um pedido com IA é tratamento de dados pessoais quando o texto identifica alguém. Pontos que a LGPD (Lei 13.709/2018) torna obrigatórios ou recomendáveis:
- Informar: o artigo 9º garante ao titular acesso claro à finalidade do tratamento, à identificação do controlador e ao uso compartilhado de dados. Coloque na descrição do formulário algo como: “Usamos um serviço de IA para classificar seu pedido e encaminhá-lo à equipe certa. Uma pessoa revisa os casos duvidosos.”
- Minimizar: o princípio da necessidade (artigo 6º) limita o tratamento ao mínimo necessário. Envie para a API só o texto do pedido, sem nome, CPF ou telefone, que ficam na planilha.
- Revisão: o artigo 20 dá ao titular o direito de pedir revisão de decisões tomadas unicamente com base em tratamento automatizado que afetem seus interesses. Se a classificação definir prazo ou prioridade de atendimento, tenha um canal para contestação.
- Escolher o nível da API: os termos da Gemini API dizem que, nos serviços não pagos, o conteúdo pode ser usado para melhorar produtos e lido por revisores humanos, e pedem para não enviar informação pessoal ou confidencial. Para dados de clientes, use o nível pago, em que a Google afirma não usar prompts e respostas para melhorar produtos.
Para o desenho completo de governança, veja LGPD e IA na empresa.
Exemplo: assistência técnica de climatização no Recife
Pense numa empresa de instalação e manutenção de ar-condicionado no Recife que recebe pedidos pelo site, por um link do Google Forms. Antes, uma atendente lia cada resposta e repassava ao técnico ou ao financeiro por mensagem.
Com o fluxo, um pedido como “o aparelho do quarto está pingando água desde ontem” chega classificado como Conserto, urgência média, confiança alta, e vai direto para a lista do técnico. Já “quero saber se a garantia cobre a troca do controle, comprei em março” vira Garantia, mas com confiança baixa, porque não diz se a compra foi com a empresa: vai para a fila de revisão, e a atendente pergunta antes de encaminhar. Um texto como “vocês vendem filtro de água?” cai em Outro e também passa por uma pessoa. A atendente deixa de ler tudo e passa a olhar só o que o sistema não resolveu sozinho.
A integração usa recursos que a empresa já tinha no Workspace. Se quiser ver onde mais o Gemini aparece no pacote, consulte a página de integrações do Google Gemini.
Erros comuns
- Confiar no schema como se fosse validação: a categoria pode estar na lista e ainda assim errada. Valide no script e acompanhe a taxa de correção humana.
- Classificar com perguntas de múltipla escolha mal desenhadas: se o próprio cliente pode escolher a categoria com segurança, uma pergunta fechada no formulário é mais barata e exata do que IA. Use a IA para o texto livre.
- Esquecer o caminho de erro: sem tratar falha de API, a linha fica em branco e o pedido não entra em fila nenhuma.
- Mudar as categorias sem histórico: renomear “Conserto” para “Reparo” quebra filtros e relatórios. Versione a lista e guarde a data da troca.
- Mandar dados pessoais para a API: nome e telefone não ajudam a classificar e aumentam o risco.
- Ignorar limites do Apps Script: cada execução tem até 6 minutos e há cotas diárias de chamadas externas; para picos grandes, enfileire e processe em lote com um gatilho de tempo.
Perguntas frequentes
Funciona com conta gratuita do Google?
Forms, Planilhas e Apps Script funcionam em contas pessoais, com cotas menores que as do Workspace (por exemplo, 20 mil chamadas de URL Fetch por dia, contra 100 mil). O ponto de atenção é a API: o nível gratuito do Gemini não deve receber dados pessoais.
Posso usar a OpenAI em vez do Gemini?
Sim. Troque a chamada pela Responses API com text.format do tipo json_schema e strict: true. A validação e a fila de revisão continuam iguais. Verifique também se a resposta veio como recusa, que a OpenAI documenta como um item à parte, fora do schema.
Preciso pedir consentimento para usar IA?
A LGPD tem outras bases legais além do consentimento, e a escolha depende do caso; vale consultar quem cuida de privacidade na empresa. Independentemente da base, informar a finalidade de forma clara é obrigação do artigo 9º.
A IA pode responder o cliente automaticamente?
Pode, mas é outro projeto. Comece só classificando e encaminhando. Resposta automática exige revisão do texto, regras de tom e cuidado com promessas de prazo.
Quantas categorias são demais?
Não há número oficial. Na prática, se a equipe discorda entre si sobre a categoria certa de um pedido, o modelo também vai errar. Una categorias até que pessoas diferentes classifiquem do mesmo jeito.
Fontes e leitura recomendada
- Apps Script: gatilhos instaláveis (inclui envio de formulário)
- Apps Script: objetos de evento dos gatilhos
- Gemini API: saídas estruturadas
- Gemini API: Interactions API e retenção de dados
- Termos adicionais da Gemini API
- OpenAI: Structured Outputs
- Lei Geral de Proteção de Dados (Lei 13.709/2018)
- ANPD: Autoridade Nacional de Proteção de Dados