google-apps-script - formularios - google form script examples
¿Cómo agregar el enlace "Editar respuesta" a los correos electrónicos de Google Forms? (9)
¡Genial, el script funciona! Gracias.
Para los novatos, como yo: simplemente pegue el código de andre para la función SendConfirmationMail(e)
en el editor de código de su hoja de cálculo y configure el activador ''on form submit'' para ejecutarlo. Eso está en el editor de script de hoja de cálculo, no en el editor de script de formulario.
Debes hackear algunos valores. Lee el código Para mí, la confusión fue la necesidad de reemplazar ********COLUMN SEQUENCE EX 14******
con el número de la columna de la hoja donde desea que terminen las URL de edición. Usé 39, que es una columna más de lo que mi formulario estaba gastando.
Sin embargo, tengo problemas de tiempo de ejecución en esta parte:
for (var i in headers) {
value = e.namedValues[headers[i]].toString();
// Do not send the timestamp and blank fields
if ((i !== "0") && (value !== "")) {
message += headers[i] + '' :: '' + value + "<br>";
}
}
No sé por qué, pero lo reemplacé con esto:
for (var keys in columns) {
var key = columns[keys];
if ( e.namedValues[key]) {
message += key + '' :: ''+ e.namedValues[key] + "<br>";
}
}
Funciona para mi.
Tengo un formulario de Google simple que recopila datos y, usando AppScript, envía correos electrónicos de confirmación a los usuarios que lo completan. Después de que el usuario envía el formulario, al confirmarlo, verá un enlace para editar su respuesta.
Me gustaría incluir ese enlace como parte del correo electrónico de confirmación (ahora mismo, solo aparece en la página). ¿Cómo puedo obtener la URL para editar una respuesta enviada?
Puedo obtener el enlace al Formulario a través de SpreadsheetApp.getActiveSpreadsheet().getFormUrl()
. Me da el siguiente formato: https://docs.google.com/a/domain.com/spreadsheet/viewform?formkey=<formKey>
Sin embargo, el enlace no incluye la tecla de edición, que es necesaria para que los usuarios editen su respuesta. La URL esperada debe tener el siguiente aspecto: https://docs.google.com/a/domain.com/spreadsheet/viewform?formkey=<formKey>&edit=<editKey>
¡Gracias por la ayuda por adelantado!
-K
Editado:
Se ha agregado una solicitud de función en esto: http://code.google.com/p/google-apps-script-issues/issues/detail?id=1345&thanks=1345&ts=1337773007
¿Esto ayuda? No lo he intentado pero estaba buscando lo mismo hace un tiempo y noté esto.
Desde esta página https://developers.google.com/apps-script/reference/forms/
el código de allí contiene esto:
Logger.log(''Published URL: '' + form.getPublishedUrl());
Logger.log(''Editor URL: '' + form.getEditUrl());
Jon
Aquí hay una publicación clara en el blog que le muestra cómo hacerlo paso a paso y explica qué está pasando bajo el capó para los novatos de AppsScripts:
http://securitasdato.blogspot.com/2014/11/sending-confirmation-emails-from-google.html
Si bien, en conjunto, puede obtenerse de todas las excelentes respuestas proporcionadas aquí, el guión de esa publicación funcionó mejor para mí.
La respuesta de que esto no fue posible por @Henrique Abreu fue verdad hasta hace muy poco. Google parece haber agregado getEditResponseUrl()
a la clase FormResponse y con eso se hace posible usar código como este para obtener la URL de edición para un grupo de formularios existentes:
function responseURL() {
// Open a form by ID and log the responses to each question.
var form = FormApp.openById(''1gJw1MbMKmOYE40Og1ek0cRgtdofguIrAB8KhmB0BYXY''); //this is the ID in the url of your live form
var formResponses = form.getResponses();
for (var i = 0; i < formResponses.length; i++) {
var formResponse = formResponses[i];
Logger.log(formResponse.getEditResponseUrl());
}
}
Para que envíe automáticamente un correo electrónico al usuario a medida que responden, se podría agregar un desencadenador al enviar el formulario. Como la situación con la que estoy trabajando no requiere que las personas inicien sesión con una cuenta de aplicaciones, no tengo acceso a una dirección de correo electrónico automáticamente, así que tengo una pregunta de texto que captura la dirección de correo electrónico del usuario.
Hace la pregunta sobre si la edición de los formularios es lo que quieres. He estado lidiando con las ventajas relativas de editar una respuesta existente o enviar un formulario prellenado usando toPrefilledUrl()
para que pueda ver cómo han cambiado las cosas con el tiempo. Supongo que esto se reduce al valor que el seguimiento le proporcionará.
No creo que tengamos acceso a ese valor a través de la API de Spreadsheet (lo que significa que Apps Script tampoco la tiene). Lo más cercano que puedo pensar sería el valor "clave" en este feed . Tendrás que probar para averiguarlo. No hay otra alternativa que yo sepa aparte de acceder directamente a la API de Spreadsheet. Entonces, primero, tendrías que obtener la última fila a través del uso de la API ?reverse=true&max-results=1
Pruebe esto: (Los créditos no son para mí, porque fusiono dos soluciones de la tercera parte)
Fuente: Enviar correo electrónico de confirmación con Formularios de Google
/* Send Confirmation Email with Google Forms */
function Initialize() {
var triggers = ScriptApp.getScriptTriggers();
for (var i in triggers) {
ScriptApp.deleteTrigger(triggers[i]);
}
ScriptApp.newTrigger("SendConfirmationMail")
.forSpreadsheet(SpreadsheetApp.getActiveSpreadsheet())
.onFormSubmit()
.create();
}
function SendConfirmationMail(e) {
var form = FormApp.openById(''***YOUR FORM CODE***'');
//enter form ID here
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(''***SHEET NAME***'');
//Change the sheet name as appropriate
var data = sheet.getDataRange().getValues();
var urlCol = ***************COLUMN SEQUENCE EX 14******; // column number where URL''s should be populated; A = 1, B = 2 etc
var responses = form.getResponses();
var timestamps = [], urls = [], resultUrls = [], url;
for (var i = 0; i < responses.length; i++) {
timestamps.push(responses[i].getTimestamp().setMilliseconds(0));
urls.push(responses[i].getEditResponseUrl());
}
for (var j = 1; j < data.length; j++) {
resultUrls.push([data[j][0]?urls[timestamps.indexOf(data[j][0].setMilliseconds(0))]:'''']);
url = resultUrls[i-1]
}
sheet.getRange(2, urlCol, resultUrls.length).setValues(resultUrls);
try {
var ss, cc, sendername, subject, headers;
var message, value, textbody, sender;
// This is your email address and you will be in the CC
cc = Session.getActiveUser().getEmail();
// This will show up as the sender''s name
sendername = "****YOUR NAME******";
// Optional but change the following variable
// to have a custom subject for Google Docs emails
subject = "Registro de Oportunidade submetido com sucesso";
// This is the body of the auto-reply
message = "Nós recebemos seu registro de oportunidade.<br>Muito Obrigado!<br><br>";
ss = SpreadsheetApp.getActiveSheet();
headers = ss.getRange(1, 1, 1, ss.getLastColumn()).getValues()[0];
// This is the submitter''s email address
sender = e.namedValues["********COLUMN NAME OF DESTINATION E-MAIL************"].toString();
for (var i in headers) {
value = e.namedValues[headers[i]].toString();
// Do not send the timestamp and blank fields
if ((i !== "0") && (value !== "")) {
message += headers[i] + '' :: '' + value + "<br>";
}
}
message += "<br>Link to edit" + '' :: '' + url + "<br>";
textbody = message.replace("<br>", "/n");
GmailApp.sendEmail(sender, subject, textbody,
{cc: cc, name: sendername, htmlBody: message});
} catch (e) {
Logger.log(e.toString());
}
}
Si está usando Google Apps, los que responden pueden editar respuestas de formularios.
puede intentar completar un formulario con los valores proporcionados desde esa dirección de correo electrónico antes que eliminar las respuestas anteriores ...
no es una manera hermosa, pero puede funcionar ...
--edito esto ahora es posible. Ver otras respuestas
Después de que el usuario envía el formulario, al confirmarlo, verá un enlace para editar su respuesta. Me gustaría incluir ese enlace como parte del correo electrónico de confirmación
Eso no es posible, punto.
Ese enlace no es accesible en ninguna parte y no se puede adivinar / construir. Pero hay algunas soluciones alternativas que pueden serle útiles (algunas sugieren aquí que voy a volver a formularlas), por ejemplo
Envíe un enlace de formulario por cada usuario y haga que el usuario lo vuelva a enviar. Debería tener algún tipo de campo de control (por ejemplo, el nombre de usuario), para que pueda conocer y eliminar / ignorar sus envíos anteriores. Posiblemente automáticamente a través de un script.
También puede desarrollar y publicar una GUI de aplicaciones-script y enviar un enlace a este script de aplicaciones más un parámetro que genere donde puede determinar qué entrada debe editar. La desventaja de este enfoque es que es algo engorroso y excesivo rediseñar todo el formulario en Apps Script. Pero de nuevo, funciona.
Por último, puede abrir una "Solicitud de mejora" en el rastreador de problemas de Apps Script y esperar hasta que ellos y el equipo de Google Spreadsheet / Forms se reúnan para desarrollar una solución.