8

我已经使用 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); 
}

对此,我得到以下回复:->

您的脚本 Contact Us 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

4 回答 4

4

解决方法http://www.labnol.org/internet/google-docs-email-form/20884/ 您必须设置应用程序脚本才能将数据作为电子邮件转发。

于 2013-01-29T06:33:47.247 回答
2

我会指出上面的评论为我解决了这个问题:https ://stackoverflow.com/a/14576983/134335

我把那个帖子更进一步:

  • 我删除了正常的通知。应用程序脚本现在使通用文本变得多余且无用
  • 我修改了脚本以实际解析结果并相应地构建响应。
函数 sendFormByEmail(e)
{
  var toEmail = "changeme";
  变量名称 = "";
  变种电子邮件=“”;

  // 可选但更改以下变量
  // 为 Google Docs 电子邮件设置自定义主题
  var subject = "已提交 Google 文档表单";
  var 消息 = "";

  // 变量 e 将所有表单值保存在一个数组中。
  // 遍历数组并将值附加到正文。

  var s = SpreadsheetApp.getActiveSheet();
  var headers = s.getRange(1,1,1,s.getLastColumn()).getValues()[0];

  // 感谢 Henrique Abreu 修复了排序顺序
  for(标题中的var i){
    如果(标题[i] =“名称”){
      name = e.namedValues[headers[i]].toString();
    }
    if (headers[i] = "Email") {
      email = e.namedValues[headers[i]].toString();
    }
    if (headers[i] = "主题") {
      主题 = e.namedValues[headers[i]].toString();
    }
    if (headers[i] = "消息") {
      message = e.namedValues[headers[i]].toString();
    }
  }

  // 参见 https://developers.google.com/apps-script/reference/mail/mail-app#sendEmail(String,String,String,Object)
  var mailOptions = {
    姓名:姓名,
    回复:电子邮件,
  };

  // 这是 Google Apps Script 的 MailApp 服务
  // 发送电子邮件。您也可以在此处使用 GmailApp。
  MailApp.sendEmail(toEmail, 主题, 消息, mailOptions);

  // 观看以下视频了解详情
  // http://youtu.be/z6klwUxRwQI

  // 阿米特·阿加瓦尔 - www.labnol.org
}

示例中使用的脚本非常通用,但对更改非常有弹性,因为消息是作为提交的表单字段的键/值对构建的。

如果您使用我的脚本,则必须调整 for 循环 if 语句以逐字匹配您的字段。您还需要编辑 toEmail 变量。

再次感谢您的提问和回答。我正要放弃谷歌表单,因为一般的响应对于我想做的事情来说是远远不够的。

最后,针对上述实际问题,“toString of undefined”具体表示其中一个表单字段被提交为空白。如果我不得不猜测,我会说作者只将它用于需要所有字段的表单,或者会进行快速未定义检查。

像下面这样的东西会起作用:

for(标题中的var i){
  var formValue = e.namedValues[headers[i]];
  var formValueText = "";
  如果(typeof(formValue)!=“未定义”){
    formValueText = formValue.toString();
  }
  message += headers[i] + ' = '+ formvalueText + "\n\n";
}

我没有对此进行精确测试,但这是一种非常标准的方法,可以确保在尝试像 toString() 这样显然不起作用的方法之前定义对象。

这也可以解释 Jon Fila 的回答。该脚本盲目地假设响应中的所有标题行都是由表单发送的。如果不需要任何字段或电子表格中的字段不再存在于表单中,您将获得大量未定义的对象。

该脚本本可以编写得更好,但我不会责怪作者,因为它显然只是一个概念证明。他们提到了replyTo更正但没有给出任何实施示例的事实非常清楚。

于 2013-07-01T02:44:03.340 回答
0

如果这是 Google 表单,您的电子表格中是否有任何不在表单上的额外列?如果您删除那些额外的列,那么它开始为我工作。

于 2013-01-29T17:13:45.293 回答
-2

您不需要使用脚本。只需转到 Google 电子表格上的工具 >> 通知规则。每次更改文档时,您都可以在此处更改设置以接收包含所需信息的电子邮件。

于 2012-12-03T23:43:06.290 回答