如何在Google表格电子邮件中添加“修改回复”链接?

时间:2012-05-22 21:20:39

标签: google-apps-script google-form

我有一个简单的Google表单,用于收集数据,并使用AppScript向填写完成的用户发送确认电子邮件。用户提交表单后,在确认后,他/她将看到一个链接来编辑他/她的回复。

我想将该链接包含在确认电子邮件中(现在,它只显示在页面上。)如何获取用于编辑已提交回复的网址?

我可以通过SpreadsheetApp.getActiveSpreadsheet().getFormUrl()获取表单的链接。它为我提供了以下格式:https://docs.google.com/a/domain.com/spreadsheet/viewform?formkey=<formKey>

然而,链接不包括编辑密钥,用户需要编辑密钥来编辑他/她的响应。预期的网址应如下所示: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 个答案:

答案 0 :(得分:21)

@Henrique Abreu无法做到这一点的答案直到最近都是如此。 Google似乎已将getEditResponseUrl()添加到FormResponse类,因此可以使用此类代码获取一堆现有表单的编辑网址:

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()编辑现有响应或发送预填表单的相对优势,以便我可以看到事情随着时间的推移发生了变化。我想这归结为跟踪它将为您提供的价值。

答案 1 :(得分:2)

如果您使用的是Google Apps,则您的响应人员可以通过回复进行编辑。

请参阅:How to Edit Form Responses

答案 2 :(得分:2)

- 现在可以编辑。请参阅其他答案。

  

用户提交表单后,在确认后,他/她将看到一个链接   编辑他/她的回复。我希望将该链接包含在确认电子邮件中

这是不可能的,期间。

该链接无法在任何地方访问,无法猜测/构建它。但是,有一些可能适合你的解决方法(这里有一些建议我会重新说明),例如

发送按人口填写的表单链接,让用户重新发送。您需要拥有某种控制字段(例如用户名),因此您可以知道并删除/忽略他的旧提交。可能通过脚本自动生成。

您还可以开发和发布应用程序脚本GUI,并发送指向此应用程序脚本的链接以及您生成的参数,您可以在其中确定应编辑的条目。这种方法的缺点是,在Apps脚本上重新设计整个表单有点麻烦和过度。但同样,它也有效。

最后,你可以打开一个&#34;增强请求&#34;在Apps脚本issue tracker上等待他们和Google Spreadsheet / Forms团队聚在一起开发解决方案。

答案 3 :(得分:2)

这是一篇明确的博客文章,向您展示如何一步一步地完成这项工作,并解释了AppsScripts新手的内幕:

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

虽然你可以从这里提供的所有优秀答案中得到答案,但该帖子中的脚本对我来说效果最好。

答案 4 :(得分:1)

这有用吗 - 我没有尝试过,但我刚才也在寻找相同的东西并注意到了这一点。

从此页面 https://developers.google.com/apps-script/reference/forms/

那里的代码包含:

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

乔恩

答案 5 :(得分: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());
    }

}

答案 6 :(得分:1)

很好,脚本有效!感谢。

对于像我这样的新手:只需将函数SendConfirmationMail(e)的andre代码粘贴到电子表格的代码编辑器中,然后设置'on form submit'触发器即可运行它。这是在电子表格脚本编辑器中,而不是表单脚本编辑器。

你需要破解一些价值观。阅读代码。对我来说,令人困惑的是需要将********COLUMN SEQUENCE EX 14******替换为您希望编辑网址最终的工作表列号。我使用的是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>";
            }
        }

Dunno为什么,但我用它代替了它:

 for (var keys in columns) {
        var key = columns[keys];
        if ( e.namedValues[key]) {
        message += key + ' :: '+ e.namedValues[key] + "<br>"; 
        } 
    }

适合我。

答案 7 :(得分:0)

您可以尝试使用该电子邮件地址提供的值填充表单,而不是删除以前的答案...

这不是一个美丽的方式,但它可以工作......

答案 8 :(得分:-1)

我认为我们无法通过Spreadsheet API访问该值(这意味着Apps Script也没有)。我能想到的最接近的是this feed中的“关键”值。你必须测试才能发现。除了直接访问Spreadsheet API之外,没有其他我知道的替代方法。首先,您必须通过api使用?reverse=true&max-results=1

获取最后一行