我有一个简单的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
答案 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,则您的响应人员可以通过回复进行编辑。
答案 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