Pregunta

Tengo un formulario de Google que tiene los dos campos siguientes:

  • Dirección de correo electrónico:- Un cuadro de texto
  • Herramienta:- Un botón de radio
    • Herramienta 1
    • Herramienta 2
    • Herramienta 3

El usuario ingresaría su dirección de correo electrónico, seleccionaría una herramienta y haría clic en enviar.Me gustaría que me apareciera el siguiente mensaje:

Gracias por responder.Se le ha enviado un correo electrónico a dirección de correo electrónico ingresada descargar herramienta seleccionada.

Tengo el siguiente código en el editor de scripts

    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);
    }

También he puesto el triggers para ser ejecutado -> emailFormSubmission, Eventos -> from Form , onFormSubmit.

Lo que ocurre es:Supongamos que el primer usuario ("A") ingresa su información y hace clic en enviar.La información ingresada se muestra correctamente.Cuando el segundo usuario ('B') ingresa su información y hace clic en enviar, se muestra la información de A.Cuando el tercer usuario ("C") ingresa su información y hace clic en enviar, se muestra la información de B.Descubrí que el problema está en "getlastrow()" ya que la hoja de cálculo está actualizada después Se procesa el envío del formulario de correo electrónico.

¿Qué pasa con el código anterior?¿Cómo puedo solucionar esto?

ACTUALIZAR

Según los comentarios de @wchiquito, cambié el código a siguiente para que funcione.

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

Solución

Recuerde que el evento On form submit (Comprender los eventos) recibe un parámetro que tiene la siguiente estructura:

  • valores
  • rango
  • valores nombrados

y puedes hacer algo como:

function emailFormSubmission(e) {
    ...
    var row = e.range.getRow();
    ...
}

Pruebe el siguiente código para observar la estructura del parámetro. e:

function emailFormSubmission(e) {
    ...
    Logger.log(e);
    ...
}

ACTUALIZAR

Primero, disculpe mi confusión, les mostré la estructura de un Spreadsheet form submit event cuando realmente estás usando un Form submit event.

Efectivamente, un Form submit event tiene la siguiente estructura:

  • respuesta

Devolver un objeto de tipo FormResponse.

Por tanto, definiendo el evento: On submit form (Form submit event), puedes hacer algo como lo siguiente:

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());
  }
}

Sin embargo, el mensaje de confirmación configurado según los datos enviados como respuestas del formulario, no parece muy claro, se puede configurar el mensaje, pero no se mostrará para la respuesta activa, si no para la siguiente.

Otros consejos

Mi primera suposición son estas dos líneas aquí:

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.

Cuando usted llama getLastRow() en una hoja: obtendrás la última fila.Claro, pero considerando el orden de los eventos y cómo se procesan estos valores, necesitas un +1, para obtener el envío más reciente.Actualmente estás una fila por detrás cuando tu código se ejecuta para actualizar el mensaje de confirmación del formulario.

Así que simplemente cambia tu código a lo siguiente:

var emailid = theFormSheet.getRange(row+1,2,1,1).getValue();
var tool = theFormSheet.getRange(row+1,3,1,1).getValue();

En mi opinión, las hojas de cálculo son los servicios de Google más confusos.Cuando obtienes valores en la hoja de cálculo, se devuelven como un [] o [][] Dependiendo de cuál sea tu rango cuando llames getValues().Pero getRange() en un sheet comienza en el índice 1 (para que sea más fácil de leer el código, supongo).Muchas veces encuentro que tengo un error uno por uno debido a la forma en que se transmiten los datos.Solo ten esto en cuenta cuando trabajes con hojas de cálculo :)

Respuesta corta: quiero que desee no se puede hacer con las formas de Google.

Explicación: Form.setConfirmationMessage () Establece el mensaje de confirmación para el formulario que se almacena en el servidor, no para el formulario activo actual.Lo mismo se aplica, por ejemplo, para Form.Settitle ().El formulario activo no será modificado.Uno esperaría un comportamiento diferente para el mensaje de confirmación, pero ay, este no es el caso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top