O erro ocorre porque e.values está chegando como undefined ou vazio. Isso normalmente acontece quando o gatilho foi criado no Google Formulários, pois nesse tipo de gatilho os dados ficam em e.response, não em e.values.
e.values existe no evento de envio de formulário disparado pela planilha de respostas. O objeto e só é fornecido quando o gatilho executa a função automaticamente; ao clicar em Executar no editor, ele não existe.
Também há um segundo problema possível: ao criar a nova aba, é necessário guardar a aba criada na mesma variável usada posteriormente pelo appendRow().
Solução recomendada: script vinculado à planilha de respostasColoque este código no Apps Script aberto pela planilha que recebe as respostas:
O método appendRow() recebe um array com os conteúdos da linha. Caso esse array esteja vazio ou indefinido, a exceção informada é gerada.
Configure o gatilhoNo editor do Apps Script:
Não teste essa função diretamente pelo botão Executar. Para testes manuais, use uma função separada:
Nesse caso, utilize e.response.getItemResponses():
Portanto, a correção depende da origem do gatilho:
--
You received this message because you are subscribed to the Google Groups "Google Apps Script Community" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-apps-script-c...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/google-apps-script-community/2310d750-88eb-4ba1-b8a6-eed0306a946en%40googlegroups.com.
Olá,
Essa é uma dúvida muito comum entre quem está começando com Google Apps Script. A confusão acontece porque existem dois gatilhos diferentes chamados "Ao enviar formulário", e cada um fornece um objeto de evento (e) diferente.
A regra é simples:
Essa diferença existe porque cada serviço trabalha de forma diferente.
Se o gatilho foi criado na planilha de respostas, o Apps Script já sabe qual linha acabou de ser adicionada.
Exemplo:
function onFormSubmit(e) { Logger.log(e.values); }Supondo que o formulário recebeu:
Nome: João Idade: 25 Cidade: Recifee.values será aproximadamente:
[ "10/07/2026 09:15:22", "João", "25", "Recife" ]Ou seja, trata-se de um array contendo todos os valores da linha.
Assim, você pode acessar os dados por posição:
var nome = e.values[1]; var idade = e.values[2];Ou simplesmente gravar a linha em outra planilha:
sheet.appendRow(e.values);Esse é exatamente o formato esperado pelo método appendRow().
Quando o gatilho está na planilha, também existe:
e.namedValuesEsse objeto utiliza os títulos das perguntas como chave:
{ "Nome": ["João"], "Idade": ["25"], "Cidade": ["Recife"] }Assim, você pode acessar os valores pelo nome da pergunta:
var nome = e.namedValues["Nome"][0];Essa abordagem costuma ser mais segura quando a ordem das perguntas pode mudar.
Se o gatilho foi criado diretamente no Google Formulários, o objeto recebido é diferente.
Nesse caso, utiliza-se:
function onFormSubmit(e) { Logger.log(e.response); }e.response não é um array.
Ele é um objeto do tipo FormResponse, que possui diversos métodos, como:
e.response.getTimestamp(); e.response.getRespondentEmail(); e.response.getItemResponses();Por exemplo:
function onFormSubmit(e) { var respostas = e.response.getItemResponses(); respostas.forEach(function(r) { Logger.log(r.getItem().getTitle()); Logger.log(r.getResponse()); }); }Resultado:
Nome João Idade 25 Cidade RecifePerceba que, nesse caso, o Apps Script trabalha com perguntas e respostas, e não com uma linha pronta da planilha.
Cada serviço possui uma visão diferente dos dados.
Google SheetsA planilha trabalha com linhas:
Timestamp | Nome | Idade | CidadePor isso o Apps Script fornece:
e.valuesque representa exatamente essa linha.
Google FormsO formulário trabalha com perguntas e respostas:
Pergunta 1 Pergunta 2 Pergunta 3Por isso ele fornece:
e.responseque representa toda a resposta enviada pelo usuário.
Não.
No gatilho padrão de envio de formulário, o correto é:
e.response(no singular)
Para obter todas as respostas utiliza-se:
var respostas = e.response.getItemResponses();Se o objetivo é copiar os dados enviados para outra planilha, como no exemplo:
sheetWeek.appendRow(userValues);o mais simples é criar o gatilho na planilha de respostas e utilizar:
var userValues = e.values;Já se o objetivo for trabalhar diretamente com o formulário (por exemplo, obter o e-mail do respondente, identificar as perguntas ou acessar outros detalhes da submissão), então deve-se utilizar:
e.responseUma ótima forma de entender quais propriedades o objeto e possui é registrar seu conteúdo durante a execução do gatilho:
function onFormSubmit(e) { console.log(JSON.stringify(e, null, 2)); }Lembre-se de que essa função deve ser executada pelo gatilho de envio do formulário, e não pelo botão Executar do editor. Dessa forma, será possível visualizar exatamente quais propriedades (values, namedValues, response, etc.) estão disponíveis naquele contexto.
Kildere Sobral Irineu
Analista e Desenvolvedor de Sistemas e Agentes de IA
Administração de Empresas – MBA Gestão
https://www.linkedin.com/in/kilderesobralirineu/