Как добавить ссылку «Изменить ответ» в электронные письма 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>

Спасибо за помощь в продвижении!

Отредактировано:

Добавлена функция запроса на это:http://code.google.com/p/google-apps-script-issues/issues/detail?id=1345&thanks=1345&ts=1337773007

Ответы на вопрос(9)

Отлично, скрипт работает! Благодарю.

Для новичков, таких как я: просто вставьте код andre для функцииSendConfirmationMail(e) в редактор кода вашей электронной таблицы и установите "в форме отправки"; триггер, чтобы запустить его. Это в редакторе сценариев электронных таблиц, а не в редакторе сценариев форм.

Вам нужно взломать некоторые значения. Прочитайте код. Для меня непонятной была необходимость заменить********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>"; 
        } 
    }

Работает для меня.

 20 авг. 2015 г., 04:48
Должен быть использованheaders вместоcolumns.

Помогает ли это - я не пробовал, но некоторое время назад искал то же самое и заметил это.

С этой страницы https://developers.google.com/apps-script/reference/forms/

код оттуда содержит это:

Logger.log('Published URL: ' + form.getPublishedUrl());
Logger.log('Editor URL: ' + form.getEditUrl());

Джон

Я не думаю, что у нас есть доступ к тому, что это значение, через API Spreadsheet (что означает, что у скрипта Apps его тоже нет). Самым близким, что я могу придумать, был бы «ключ»; значение вэтот канал, Вы должны проверить, чтобы выяснить это. Нет другой известной мне альтернативы, кроме прямого доступа к API Spreadsheet. Итак, во-первых, вам нужно получить последний ряд с помощью API?reverse=true&max-results=1

Если вы используете Службы Google, ваши респонденты могут редактировать там ответы.

Увидеть:Как редактировать ответы формы

--edit this is now possible. See other answers.

After user submits the form, on confirmation, s/he will see a link to edit his/her response. I'd like to include that link as a part of the confirmation email

Это невозможно, точка.

Эта ссылка нигде не доступна, и ее невозможно угадать / построить. Но есть некоторые обходные пути, которые могут вас устроить (некоторые предложили здесь, что я перефразирую), например,

Отправьте ссылку на заполненную форму и попросите пользователя повторно отправить ее. Вам необходимо иметь какое-то поле управления (например, имя пользователя), чтобы вы могли знать и удалять / игнорировать его более старые сообщения. Возможно автоматически через скрипт.

Вы также можете разработать и опубликовать графический интерфейс приложения-скрипта и отправить ссылку на этот скрипт приложения, а также сгенерированный вами параметр, где вы сможете определить, какую запись вы должны редактировать. Недостатком этого подхода является то, что несколько громоздким и излишним является перепроектирование всей формы в скрипте приложений. Но опять же, это работает.

Наконец, вы можете открыть «Запрос на улучшение». в скрипте приложенийтрекер и подождите, пока они и команда Google Spreadsheet / Forms соберутся вместе, чтобы разработать решение.

 23 мая 2012 г., 13:46
Да, я тоже надеюсь. Но если это несколько критично для вас, я советую вам не ждать и просто идти с любым обходным путем. Исходя из моего опыта, подобные запросы могут занять более года, чтобы "пройти".
 DashK23 мая 2012 г., 13:39
Благодарю. Я создал запрос функции. Надеюсь, что это пройдет ... Это немного раздражает, смеется.code.google.com/p/google-apps-script-issues/issues/…

Вы можете попытаться заполнить форму значениями, указанными с этого адреса электронной почты, чем удалить предыдущие ответы ...

это не красивый способ, но он может работать ...

Вот четкое сообщение в блоге, которое показывает вам, как сделать это шаг за шагом, и объясняет, что происходит под капотом для новичков в AppsScripts:

http://securitasdato.blogspot.com/2014/11/sending-confirmation-emails-from-google.html

В то время как все вместе вы можете получить ответы на все замечательные ответы, представленные здесь, сценарий этого поста работал лучше всего для меня

 21 авг. 2015 г., 05:55
рад, что это было полезно!
 20 авг. 2015 г., 04:49
Упомянутый пост в блоге - отличная находка Спасибо, что поделились ссылкой здесь.
Решение Вопроса

Ответ, что это не было возможно @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());
 }
}

Чтобы сделать это автоматически по электронной почте пользователю, когда он отвечает, можно добавить триггер при отправке формы. Поскольку ситуация, с которой я работаю, не требует, чтобы люди входили в систему с учетной записью приложения, я не имею доступа к адресу электронной почты автоматически, поэтому у меня есть текстовый вопрос, который фиксирует адрес электронной почты пользователя.

Он задает вопрос о том, является ли редактирование форм тем, что вы хотите. Я столкнулся с относительными преимуществами редактирования существующего ответа или отправки предварительно заполненной формы с использованиемtoPrefilledUrl() так что я могу видеть, как все изменилось с течением времени. Я предполагаю, что это сводится к ценности, которую обеспечит отслеживание.

 13 февр. 2017 г., 20:21
Это полностью работает, и яdetailed it in a slightly different way here

Попробуйте это: (Кредиты не для меня, потому что я объединяю два решения третьей части)

Источник:Отправить подтверждение по электронной почте с помощью форм 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());
    }

}
 20 авг. 2015 г., 04:46
В этом ответе есть проблема с кодом. Увидетьthis other answer.

Ваш ответ на вопрос