2012-05-22 4 views
23

У меня есть простая форма Google, которая собирает данные и, используя AppScript, отправляет письма с подтверждением пользователям, которые его заполняют. После того, как пользователь отправит форму, при подтверждении, он/она увидит ссылку для редактирования своего ответа.Как добавить ссылку «Изменить ответ» на электронные письма Google Forms?

Я бы хотел включить эту ссылку в качестве части письма с подтверждением (прямо сейчас, он отображается только на странице.) Как я могу получить 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

ответ

18

Ответ на этот вопрос, который не был доступен @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(), чтобы я мог видеть, как все изменилось со временем. Я думаю, это сводится к тому, что отслеживание этого даст вам.

+1

Это полностью работает, и я [подробно описал это здесь] (http://stackoverflow.com/a/42211883/26510) –

-1

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

0

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

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

2

--edit теперь это возможно. См. Другие ответы.

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

Это невозможно, период.

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

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

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

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

+0

Спасибо. Я создал запрос функции. Надеюсь, что это пройдет ... Это становится чем-то раздражающим. http://code.google.com/p/google-apps-script-issues/issues/detail?id=1345&thanks=1345&ts=1337773007 – DashK

+0

Да, надеюсь. Но если это для вас несколько критично, я советую вам не ждать и просто идти с любым обходным путем. По моему опыту, такие запросы могут занять более года, чтобы «пройти». –

1

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

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

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

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

Jon

1

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

Send Confirmation Email with 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()); 
    } 

} 
+0

В этом ответе есть проблема с кодом. См. [Этот другой ответ] (http://stackoverflow.com/a/22434475/1595451). –

1

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

Для новичков, как и я: просто вставьте код андре для функции SendConfirmationMail(e) в редактор кода вашего электронного стола и установите триггер «on form submit», чтобы запустить его. Это в редакторе сценариев электронной таблицы, а не в редакторе скриптов.

Вам нужно взломать некоторые значения. Прочтите код. Для меня запутанной была необходимость заменить ********COLUMN SEQUENCE EX 14****** номером столбца листа, где вы хотите, чтобы URL-адреса редактирования заканчивались. Я использовал 39, который является одним столбцом больше, чем моя форма использовала.

Однако, я получил во время выполнения Probs в этой части:

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>"; 
     } 
    } 

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

+0

Следует использовать 'headers' вместо' columns'. –

2

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

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

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

+0

Отправленный пост в блоге - отличная находка. Спасибо, что разделили ссылку здесь. –

+1

рад, что это было полезно! – Von

 Смежные вопросы

  • Нет связанных вопросов^_^