Acessando os dados inseridos pelo usuário ao enviar nos formulários do Google
-
21-12-2019 - |
Pergunta
Eu tenho um formulário do Google que possui os dois campos a seguir:
- Endereço de email:- Uma caixa de texto
- Ferramenta:- Um botão de opção
- Ferramenta 1
- Ferramenta 2
- Ferramenta 3
O usuário inseriria seu endereço de e-mail, selecionaria uma ferramenta e clicaria em enviar.Gostaria que aparecesse a seguinte mensagem:
Obrigado por responder.Um e-mail foi enviado para você em endereço de e-mail digitado baixar ferramenta selecionada.
Eu tenho o seguinte trecho de código no editor de script
function emailFormSubmission() {
var form = FormApp.getActiveForm();//the current form
var dest_id = form.getDestinationId(); //the destination spreadsheet where form responses are stored
var ss = SpreadsheetApp.openById(dest_id);//open that spreadsheet
var theFormSheet = ss.getSheets()[0]; //read the first sheet in that spreadsheet
var row = theFormSheet.getLastRow(); //get the last row
var emailid = theFormSheet.getRange(row,2,1,1).getValue();//get column 2 corresponding to the email id. column 1 is timestamp. so, skip that.
var tool = theFormSheet.getRange(row,3,1,1).getValue();//get column 3 corresponding to the selected tool.
form.setConfirmationMessage('Thanks for responding. An email has been sent to you '+ emailid + ' to download' + tool);
}
Eu também configurei o triggers
para ser executado -> emailFormSubmission
, Eventos -> from Form
, onFormSubmit
.
O que acontece é:Suponha que o primeiro usuário ('A') insira suas informações e clique em enviar.Suas informações inseridas são exibidas corretamente.Quando o segundo usuário ('B') insere suas informações e clica em enviar, as informações de A são exibidas.Quando o terceiro usuário ('C') insere suas informações e clica em enviar, as informações de B são exibidas.Descobri que o problema é com "getlastrow ()" já que a planilha está atualizada depois emailFormSubmission é processado.
O que há de errado com o código acima?Como faço para corrigir isso?
ATUALIZAR
Com base nos comentários de @wchiquito, alterei o código para o seguinte para que funcionasse.
function emailFormSubmission(e) {
var form = FormApp.getActiveForm();
//Check this link on how to access form response:
//https://developers.google.com/apps-script/understanding_events?hl=en
var responses = e.response;//e is of type formresponse.
var emailid = responses.getItemResponses()[0].getResponse();
var tool = responses.getItemResponses()[1].getResponse();
Logger.log(emailid);
Logger.log(tool);
form.setConfirmationMessage('Thanks for responding. An email has been sent to '+ emailid + ' with instructions to download ' + tool +'. If you do not find our email in your inbox, please check your spam folder');
Logger.log(form.getConfirmationMessage());
}
Solução
Lembre-se que o evento On form submit
(Compreendendo os eventos) recebe um parâmetro que possui a seguinte estrutura:
- valores
- faixa
- Valores nomeados
e você pode fazer algo como:
function emailFormSubmission(e) {
...
var row = e.range.getRow();
...
}
Experimente o código a seguir para observar a estrutura do parâmetro e
:
function emailFormSubmission(e) {
...
Logger.log(e);
...
}
ATUALIZAR
Primeiro, desculpe minha confusão, mostrei a estrutura de um Spreadsheet form submit event
quando você realmente está usando um Form submit event
.
Com certeza, um Form submit event
tem a seguinte estrutura:
- resposta
Retornando um objeto do tipo FormResponse
.
Portanto, definindo o evento: On submit form
(Form submit event
), você pode fazer algo como o seguinte:
function emailFormSubmission(e) {
var itemResponses = e.response.getItemResponses();
for (var i = 0, len = itemResponses.length; i < len; ++i) {
Logger.log('Response #%s to the question "%s" was "%s"',
(i + 1).toString(),
itemResponses[i].getItem().getTitle(),
itemResponses[i].getResponse());
}
}
Porém, a mensagem de confirmação definida de acordo com os dados enviados como respostas do formulário, não parece muito clara, você pode definir a mensagem, mas não será exibida para a resposta ativa, se não para a próxima.
Outras dicas
Meu primeiro palpite são estas duas linhas aqui:
var emailid = theFormSheet.getRange(row,2,1,1).getValue();//get column 2 corresponding to the email id. column 1 is timestamp. so, skip that.
var tool = theFormSheet.getRange(row,3,1,1).getValue();//get column 3 corresponding to the selected tool.
Quando Você ligar getLastRow()
em uma planilha - você está obtendo a última linha.Claro, mas considerando a ordem dos eventos e como esses valores são processados, você precisa de um +1
, para obter o envio mais recente.Atualmente você está uma linha atrás quando seu código é executado para atualizar a mensagem de confirmação do formulário.
Então basta alterar seu código para o seguinte:
var emailid = theFormSheet.getRange(row+1,2,1,1).getValue();
var tool = theFormSheet.getRange(row+1,3,1,1).getValue();
As planilhas são os serviços do Google mais confusos, na minha opinião.Quando você obtém valores na planilha, eles são retornados como um []
ou [][]
dependendo de qual é o seu Range quando você paga getValues()
.Mas getRange()
com um sheet
começa no índice 1 (para facilitar a leitura do código, suponho).Muitas vezes descubro que tenho um erro pontual devido à forma como os dados são transmitidos.Lembre-se disso ao trabalhar com planilhas :)
Resposta curta:o que você quer não pode ser feito com os formulários do Google.
Explicação:form.setConfirmationMessage() define a mensagem de confirmação para o formulário armazenado no servidor, não para o formulário ativo atual.O mesmo se aplica, por exemplo, para form.setTitle().O formulário ativo não será modificado.Seria de esperar um comportamento diferente para a mensagem de confirmação, mas, infelizmente, não é esse o caso.