Как добавить ссылку "Изменить ответ" на электронные письма Google Forms?
У меня есть простая форма Google, которая собирает данные и, используя AppScript, отправляет письма с подтверждением пользователям, которые его заполняют. После того, как пользователь отправит форму, при подтверждении, он/она увидит ссылку для редактирования своего ответа.
Я хотел бы включить эту ссылку в электронное письмо с подтверждением (прямо сейчас, оно отображается только на странице.) Как я могу получить URL-адрес для редактирования представленного ответа?
Я могу получить ссылку на форму через SpreadsheetApp.getActiveSpreadsheet().getFormUrl()
. Он дает мне следующий формат: https://docs.google.com/a/domain.com/spreadsheet/viewform?formkey=<formKey>
Однако ссылка не содержит ключ редактирования, который требуется пользователям для редактирования его/ее ответа. Ожидаемый URL-адрес должен выглядеть следующим образом: https://docs.google.com/a/domain.com/spreadsheet/viewform?formkey=<formKey>&edit=<editKey>
Спасибо за помощь заранее!
-K
Отредактировано:
Добавлен запрос функции: http://code.google.com/p/google-apps-script-issues/issues/detail?id=1345&thanks=1345&ts=1337773007
Ответы
Ответ 1
Ответ, что это было невозможно для @Henrique Abreu, было правдой до недавнего времени. Google, похоже, добавил getEditResponseUrl()
в класс FormResponse, и с этим становится возможным использовать код, например чтобы получить URL-адрес редактирования для кучи существующих форм:
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());
}
}
Чтобы автоматически отправлять электронную почту пользователю, поскольку они отвечают, можно добавить триггер для формы submit. Поскольку Ситуация, с которой я работаю, не требует, чтобы люди регистрировались в учетной записи приложений, у меня нет доступа к электронному адресу автоматически, поэтому у меня есть текстовый вопрос, который фиксирует адрес электронной почты пользователя.
Он задает вопрос о том, нужно ли редактировать формы. Я боролся с относительными преимуществами редактирования существующего ответа или отправки предварительно заполненной формы с помощью toPrefilledUrl()
, чтобы я мог видеть, как все изменилось со временем. Я думаю, это сводится к тому, что отслеживание этого даст вам.
Ответ 2
Если вы используете Google Apps, ваши ответчики могут редактировать ответы на них.
Смотрите: Как отредактировать ответы формы
Ответ 3
- теперь это возможно. См. Другие ответы.
После того, как пользователь отправит форму, при подтверждении, он/она увидит ссылку на отредактируйте его ответ. Я хотел бы включить эту ссылку в электронное письмо с подтверждением
Это невозможно, период.
Эта ссылка недоступна нигде, и ее невозможно угадать/построить. Но, есть некоторые обходные пути, которые могут вам подойти (некоторые предложили здесь, что я буду перефразировать), например
Отправьте ссылку для каждой заполненной формы и попросите пользователя повторно отправить ее. Вам нужно иметь какое-то поле управления (например, имя пользователя), чтобы вы могли знать и удалять/игнорировать его старые сообщения. Возможно, автоматически через script.
Вы также можете разработать и опубликовать графический интерфейс apps- script и отправить ссылку на эти приложения script плюс параметр, который вы создаете, где вы можете определить, какую запись вы должны редактировать. Нижняя сторона этого подхода заключается в том, что он несколько громоздкий и излишний, чтобы перепроектировать всю форму в приложениях script. Но опять же, это работает.
Наконец, вы можете открыть "Запрос на улучшение" в приложении script отслеживать проблемы и подождать, пока они и команда Google Spreadsheet/Forms собраться вместе, чтобы разработать решение.
Ответ 4
Вот четкое сообщение в блоге, в котором показано, как это делается шаг за шагом, и объясняет, что происходит под капотом для новичков AppsScripts:
http://securitasdato.blogspot.com/2014/11/sending-confirmation-emails-from-google.html
В то время как все вместе вы можете получить оттуда все превосходные ответы, приведенные здесь, script из этого сообщения работал лучше всего для меня.
Ответ 5
Помогает ли это - я не пробовал, но я искал одно и то же, и заметил это.
С этой страницы
https://developers.google.com/apps-script/reference/forms/
код содержит:
Logger.log('Published URL: ' + form.getPublishedUrl());
Logger.log('Editor URL: ' + form.getEditUrl());
Джон
Ответ 6
Попробуйте: (Кредиты не для меня, потому что я объединять два решения третьей части)
Источник: Отправить подтверждение с помощью 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 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 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 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());
}
}
Ответ 7
Отлично, script работает! Спасибо.
Для новичков, таких как я: просто вставьте код andre для функции SendConfirmationMail(e)
в свой редактор кода электронной таблицы и установите триггер "on form submit", чтобы запустить его. Это в редакторе таблиц script, а не в редакторе script.
Вам нужно взломать некоторые значения. Прочтите код. Для меня путаница заключалась в необходимости заменить ********COLUMN SEQUENCE EX 14******
номером столбца листа, где вы хотите, чтобы URL-адреса редактирования заканчивались. Я использовал 39, который является одним столбцом больше, чем моя форма использовала.
Однако в этой части я получил проблемы с runtime:
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>";
}
}
Не знаю почему, но я заменил его на это:
for (var keys in columns) {
var key = columns[keys];
if ( e.namedValues[key]) {
message += key + ' :: '+ e.namedValues[key] + "<br>";
}
}
Работает для меня.
Ответ 8
вы можете попробовать заполнить форму со значениями, указанными на этом адресе электронной почты, чем удалить предыдущие ответы...
Это не прекрасный способ, но он может работать...
Ответ 9
Я не думаю, что у нас есть доступ к тому, что это значение через API таблиц (что означает, что у приложений Script тоже нет). Ближайшим, о котором я могу думать, будет "ключевое" значение в этот фид. Вы должны были бы проверить, чтобы узнать об этом. Нет другой альтернативы, которую я знаю, кроме как напрямую обращаться к API-интерфейсу Spreadsheet. Итак, во-первых, вам нужно будет получить последнюю строку через api use ?reverse=true&max-results=1