Как добавить ссылку "Редактировать ответ" в электронные письма 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
9 ответов
ответ, что это было невозможно @Henrique Abreu, был правдой до недавнего времени. Google, кажется, добавил getEditResponseUrl() до FormResponse class и с этим становится возможным использовать такой код, чтобы получить 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());
 }
}
чтобы сделать это автоматически по электронной почте пользователю, как они отвечают, можно добавить триггер на форму отправки. Поскольку ситуация, с которой я работаю, не требует, чтобы люди входили в систему с помощью учетная запись apps у меня нет доступа к адресу электронной почты автоматически, поэтому у меня есть текстовый вопрос, который фиксирует адрес электронной почты пользователя.
он задает вопрос о том, является ли редактирование форм тем, что вы хотите. Я боролся с относительными преимуществами редактирования существующего ответа или отправки предварительно заполненной формы с помощью toPrefilledUrl() чтобы я мог видеть, как все изменилось с течением времени. Я думаю, это сводится к значению, которое отслеживание этого обеспечит вы.
Если вы используете Google Apps, ваши ответчики могут редактировать там ответы.
посмотреть: Как редактировать ответы формы
--edit теперь это возможно. См. другие ответы.
после того, как пользователь отправит форму, при подтверждении, он увидит ссылку на отредактируйте его / ее ответ. Я хотел бы включить эту ссылку в подтверждение по электронной почте
Это невозможно, точка.
эта Ссылка недоступна нигде, и ее нельзя угадать/построить. Но есть некоторые обходные пути, которые могут вам подойти (некоторые предположили, что я re-phrase), например
отправьте ссылку на заполненную форму и попросите пользователя повторно отправить ее. Вам нужно будет иметь какое-то поле управления (например, имя пользователя), чтобы вы могли знать и удалять/игнорировать его старые отправки. Возможно автоматически через скрипт.
вы также можете разработать и опубликовать графический интерфейс apps-script и отправить ссылку на этот скрипт apps плюс параметр, который вы создаете, где вы можете определить, какую запись вы должны изменить. Недостатком этого подхода является то, что несколько громоздко и излишне перепроектировать всю форму в скрипте приложений. Но опять же, это работает.
наконец, вы можете открыть "запрос на улучшение" в скрипте приложений проблема tracker и ждать, пока они и Google Таблицы / формы команды соберутся вместе, чтобы разработать решение.
вот четкое сообщение в блоге, которое показывает вам, как это сделать шаг за шагом и объясняет, что происходит под капотом для новичков AppsScripts:
http://securitasdato.blogspot.com/2014/11/sending-confirmation-emails-from-google.html
хотя в совокупности вы можете получить там все отличные ответы, представленные здесь, сценарий с этого поста работал лучше всего для меня.
помогает ли это - я не пробовал его, но я искал то же самое некоторое время назад и заметил это.
С этой страницы https://developers.google.com/apps-script/reference/forms/
код оттуда содержит следующее:
Logger.log('Published URL: ' + form.getPublishedUrl());
Logger.log('Editor URL: ' + form.getEditUrl());
Йон
отлично, скрипт работает! Спасибо.
для новичков, таких как я: просто вставьте код Андре для функции SendConfirmationMail(e) в редакторе кода электронной таблицы и установите триггер "on form submit" для его запуска. Это в Редакторе сценариев электронных таблиц, а не в Редакторе сценариев формы.
вам нужно взломать некоторые значения. Прочтите код. Для меня запутанной была необходимость заменить ********COLUMN SEQUENCE EX 14****** с номером столбца листа, где вы хотите, чтобы URL-адреса редактирования заканчивались. Я использовал 39, который является одним столбцом больше, чем моя форма использовала.
тем не менее, я получил проблемы выполнения в этой части:
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>"; 
        } 
    }
работает для меня.
попробуйте это: (кредиты не для меня, потому что я объединить два решения третьей части)
источник: отправить подтверждение по электронной почте с Google Forms
/* 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());
    }
}
вы можете попытаться заполнить форму значениями, заданными с этого адреса электронной почты, чем удалить предыдущие ответы ...
Это не красивый способ, но он работает ...
Я не думаю, что у нас есть доступ к тому, что это значение через API электронных таблиц (что означает, что у скрипта приложений его тоже нет).  Самое близкое, что я могу придумать, - это значение " key " в корм.  Хотя, чтобы это выяснить, нужно пройти тест.  Нет другой альтернативы, которую я знаю, кроме прямого доступа к API электронных таблиц.  Итак, сначала вам нужно будет получить последнюю строку через api use ?reverse=true&max-results=1