Accediendo a los datos ingresados por el usuario al enviarlos en formularios de Google
-
21-12-2019 - |
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());
}
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.