我使用googledocs设置了一个表单。我只想将输入表格的实际数据通过电子邮件发送给我,而不是通知回复表明表格已经完成。
我没有代码等方面的技能或经验,但我确信我可以对此进行排序。我花了几个小时+几个小时没有运气。
我的表格非常基本。它有5个字段。其中4个只是文本响应,还有一个多项选择。
我在网上找到了这个tute(http://www.labnol.org/internet/google-docs-email-form/20884/),我想这总结了我正在尝试做的事情,但还没有能够让它发挥作用。
从这个网站我输入以下代码:
function sendFormByEmail(e)
{
var email = "reports.mckeir@gmail.com";
var subject = "Google Docs Form Submitted";
var s = SpreadsheetApp.getActiveSheet();
var headers = s.getRange(1,1,1,s.getLastColumn()).getValues()[0];
var message = "";
for(var i in headers)
message += headers[i] + ' = '+ e.namedValues[headers[i]].toString() + "\n\n";
MailApp.sendEmail(email, subject, message);
}
对此,我得到以下回复: - >
您的脚本,联系我们Form Mailer,最近未能成功完成。故障摘要如下所示。要配置此脚本的触发器,或更改接收未来失败通知的设置,请单击此处。
脚本由文档100%Club使用。
详细说明:
Start Function Error Message Trigger End
12/3/12 11:06 PM sendFormByEmail TypeError: Cannot call method "toString" of undefined. (line 12) formSubmit 12/3/12 11:06 PM
有人能帮我解决这个问题吗?我猜我不会包含一些必要的数据,但老实说我没有任何线索。
答案 0 :(得分:4)
解决方法http://www.labnol.org/internet/google-docs-email-form/20884/ 您必须设置应用脚本以将数据转发为电子邮件。
答案 1 :(得分:2)
我会指出上面的评论为我解决了这个问题:https://stackoverflow.com/a/14576983/134335
我把这篇文章更进了一步:
function sendFormByEmail(e) { var toEmail = "changeme"; var name = ""; var email = ""; // Optional but change the following variable // to have a custom subject for Google Docs emails var subject = "Google Docs Form Submitted"; var message = ""; // The variable e holds all the form values in an array. // Loop through the array and append values to the body. var s = SpreadsheetApp.getActiveSheet(); var headers = s.getRange(1,1,1,s.getLastColumn()).getValues()[0]; // Credit to Henrique Abreu for fixing the sort order for(var i in headers) { if (headers[i] = "Name") { name = e.namedValues[headers[i]].toString(); } if (headers[i] = "Email") { email = e.namedValues[headers[i]].toString(); } if (headers[i] = "Subject") { subject = e.namedValues[headers[i]].toString(); } if (headers[i] = "Message") { message = e.namedValues[headers[i]].toString(); } } // See https://developers.google.com/apps-script/reference/mail/mail-app#sendEmail(String,String,String,Object) var mailOptions = { name: name, replyTo: email, }; // This is the MailApp service of Google Apps Script // that sends the email. You can also use GmailApp here. MailApp.sendEmail(toEmail, subject, message, mailOptions); // Watch the following video for details // http://youtu.be/z6klwUxRwQI // By Amit Agarwal - www.labnol.org }
示例中使用的脚本非常通用,但对更改非常有弹性,因为消息是作为提交的表单字段的键/值对构建的。
如果你使用我的脚本,你必须调整for循环if语句以逐字地匹配你的字段。您还需要编辑toEmail变量。
再次感谢您提出问题和答案。我正打算抛弃谷歌表格,因为通用的回应永远不足以满足我的目的。
最后,为了回应上面的实际问题,“toString of undefined”具体意味着其中一个表单字段被提交为空白。如果我不得不猜测,我会说作者只将这个用于需要所有字段的表格,或者快速的未定义检查已经到位。
以下内容可行:
for(var i in headers) { var formValue = e.namedValues[headers[i]]; var formValueText = ""; if (typeof(formValue) != "undefined") { formValueText = formValue.toString(); } message += headers[i] + ' = '+ formvalueText + "\n\n"; }
我没有对此进行过精确测试,但这是一种非常标准的方法,可以在尝试像toString()之类的方法之前确定对象的定义,但这显然无效。
这也可以解释Jon Fila的答案。该脚本盲目地假定响应中的所有标题行都是由表单发送的。如果不需要任何字段,或者电子表格中包含不再包含在表单中的字段,您将获得大量未定义的对象。
脚本可以编码得更好,但我不会对作者提出错误,因为它显然只是一个概念证明。事实上,他们提到了回复,但没有给出任何实施例子,这一点非常清楚。
答案 2 :(得分:0)
如果这是Google表单,您的电子表格中是否有任何不在表单上的列?如果你删除那些额外的列,那么它就开始为我工作了。
答案 3 :(得分:-2)
您不需要使用脚本。只需转到工具>>您的Google电子表格上的通知规则。在那里,您可以更改设置,以便在每次更改文档时接收包含所需信息的电子邮件。