设置脚本以在电子邮件通知中包含Google文档表单数据

时间:2012-12-03 12:15:26

标签: email google-apps-script google-docs google-form

我使用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

有人能帮我解决这个问题吗?我猜我不会包含一些必要的数据,但老实说我没有任何线索。

4 个答案:

答案 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电子表格上的通知规则。在那里,您可以更改设置,以便在每次更改文档时接收包含所需信息的电子邮件。