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());
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top