25

我有一个简单的 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

4

9 回答 9

22

直到最近,@Henrique Abreu 的答案是正确的。谷歌似乎已经添加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()以便我可以看到事情随着时间的推移发生了怎样的变化。我想这归结为跟踪这将为您提供的价值。

于 2014-02-16T23:36:47.133 回答
2

这是一篇清晰的博客文章,它向您展示了如何一步一步地做到这一点,并解释了 AppsScripts 新手的幕后情况:

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

虽然您可以从此处提供的所有优秀答案中共同获得成功,但该帖子中的脚本对我来说效果最好。

于 2015-01-24T23:01:42.273 回答
2

--edit 这现在是可能的。查看其他答案。

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

这是不可能的,期间。

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

发送每个填充的表单链接并让用户重新发送它。你需要有某种控制字段(例如用户名),这样你就可以知道和删除/忽略他的旧提交。可能通过脚本自动执行。

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

最后,您可以在 Apps 脚本问题跟踪器上打开一个“增强请求”,然后等到他们和 Google 电子表格/表单团队一起开发解决方案。

于 2012-05-23T02:14:54.460 回答
2

如果您使用的是 Google Apps,您的回复者可以在那里编辑表单回复。

请参阅:如何编辑表单回复

于 2012-05-23T01:36:53.370 回答
1

这有帮助吗 - 我没有尝试过,但我前一段时间一直在寻找同样的东西并注意到了这一点。

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

那里的代码包含以下内容:

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

乔恩

于 2013-06-19T17:52:11.203 回答
1

试试这个:(学分不适合我,因为我合并了第三部分的两个解决方案)

来源:使用 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());
    }

}
于 2014-02-03T03:05:28.030 回答
1

太好了,脚本有效!谢谢。

对于像我这样的新手:只需将 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>"; 
        } 
    }

为我工作。

于 2014-03-16T08:03:55.783 回答
0

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

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

于 2012-05-23T01:15:49.287 回答
-1

我认为我们无法通过电子表格 API 访问该值(这意味着 Apps Script 也没有)。我能想到的最接近的是这个 feed中的“关键”值。你必须测试才能发现。除了直接访问电子表格 API 之外,我没有其他选择。因此,首先,您必须通过 api 使用获取最后一行?reverse=true&max-results=1

于 2012-05-23T01:07:38.187 回答