Google apps script 从谷歌表单收集回复?

Google apps script 从谷歌表单收集回复?,google-apps-script,Google Apps Script,我对谷歌脚本非常陌生,并试图学习,但文档要么相互冲突,要么不存在,要么不适合我 我们的目标是创建一个脚本,该脚本可以收集来自谷歌表单的响应,并根据其中一个用户输入字段(用户可以在其中选择位置的下拉框)发送电子邮件。问题是我无法检索表单响应。我收到一个错误,“getItemResponses();”不是函数。我如何从表格中获得回复?所有其他的部分我都知道了 流-我已经设置了一个触发器,通过编辑->当前项目的触发器->创建一个新的触发器,在提交时它运行我的函数。应该发生的是(在脚本的后面)sendM

我对谷歌脚本非常陌生,并试图学习,但文档要么相互冲突,要么不存在,要么不适合我

我们的目标是创建一个脚本,该脚本可以收集来自谷歌表单的响应,并根据其中一个用户输入字段(用户可以在其中选择位置的下拉框)发送电子邮件。问题是我无法检索表单响应。我收到一个错误,“getItemResponses();”不是函数。我如何从表格中获得回复?所有其他的部分我都知道了

流-我已经设置了一个触发器,通过编辑->当前项目的触发器->创建一个新的触发器,在提交时它运行我的函数。应该发生的是(在脚本的后面)sendMail以我的身份向var“应答者”发送邮件消息。但是,在尝试从脚本编辑器运行并填写测试表单提交(通过后者上的电子邮件)时,我收到的错误“getItemResponses();”不是一个函数

谢谢你事先的帮助。请注意,我是谷歌脚本的新手

function sendEmails(e) {
  // Get active form and responses
  var formResponse = e.response;
  var itemResponses = formResponse.getItemResponses();

  // Assign responses to variables
  var respondent = itemResponses[0].getResponse();
  var district = itemResponses[1].getResponse();
  var urgency = itemResponses[2].getResponse();
  var type = itemResponses[3].getResponse();
  var topic = itemResponses[4].getResponse();

  // TAM email address.  Used in sendTo field later
  var sendTo = "person@email.com";

  MailApp.sendEmail(sendTo,"subject","message body");

  if(type == "Option 1") {
    MailApp.sendEmail(respondent,"subject","message body");
  }
}
问题:
form.getResponses()
返回一个
FormResponse
数组,如您所见。响应数组没有名为
getItemResponses()
的方法,这就是您编写代码失败的原因。您现在要做的是获取与表单对应的所有响应,而不是刚刚提交的响应

您应该改用单一的方法

解决方案: 假设:

  • 您希望每次提交表单时都运行脚本(如果满足条件,则发送电子邮件)
  • 您已安装连接到表单的
如果是这种情况,您应该使用触发器获取
FormResponse
。您应该替换此:

var form=FormApp.getActiveForm();
var formResponses=form.getResponses();
var itemResponses=formResponses.getItemResponses();
为此:

var formResponse=e.response;
var itemResponses=formResponse.getItemResponses();
更新: 您的表单没有5项,但有4项。第一项实际上是响应者电子邮件,因此,必须通过以下方式检索。因此,
itemResponses
只能访问索引3,而不能访问索引4,
itemResponses[4]
未定义。这就是你新错误背后的原因。您应该这样做:

var-responder=formResponse.getRespondentEmail();
var district=itemResponses[0]。getResponse();
var=itemResponses[1]。getResponse();
var type=itemResponses[2]。getResponse();
var topic=itemResponses[3]。getResponse();
参考:

虽然可以从表单本身做您想做的事情,但对于初学者来说,这将很困难,因为正如您所注意到的,没有太多的示例脚本可供编写

从回答表中可以更容易地做到这一点,并且有大量的示例用于处理电子表格中的表单数据

下面的示例是一个简单(未测试)脚本,用于在表单提交时发送回复

function onFormSubmit(e) {

  var ss = SpreadsheetApp.getActiveSpreadsheet();    
  var respSheet = ss.getSheetByName('Form responses 1');
  var rowIndx = e.range.getRow();

  var formData = respSheet.getRange(rowIndx, 1, 1, respSheet.getLastColumn()).getValues();

  var respondent = formData[0].getResponse();
  var district = formData[1].getResponse();
  var urgency = formData[2].getResponse();
  var type = formData[3].getResponse();
  var topic = formData[4].getResponse();

  MailApp.sendEmail(respondent, district + ' ' + topic, "Your reply was recieved and is being processed");

  respSheet.getRange(rowIndx, 5).setValue('Email send to ' + respondent);

}

我认为提供当前脚本和复制问题的流程将帮助用户考虑解决方案。函数sendmails(e){//Get active form and responses var form=FormApp.getActiveForm();var formResponses=form.getResponses();var itemResponses=formResponses.getItemResponses();//将响应分配给变量var-responder=itemResponses[0]。getResponse();var-district=itemResponses[1]。getResponse();var-urrency=itemResponses[2]。getResponse();var-type=itemResponses[3]。getResponse();var-topic=itemResponses[4]。getResponse();}抱歉,不确定如何添加代码块……感谢您的回复。你能在你的问题中添加脚本吗?因为在评论中很难看到脚本。您可以通过编辑您的问题。您能否提供复制问题的详细流程?例如,如何运行函数
sendmails(e)
?添加了代码!所以剧本的另一部分只是一些学区和员工信息/电子邮件,我不想花时间删掉。最大的问题是,我收到的“getItemResponses();”不是一个函数,因此我无法提取用户的电子邮件和其他信息,这些信息是脚本未来将依赖的(并且可以工作)-使用Google Sheet对其进行测试非常感谢这很有意义!我已经根据你的建议进行了更改,这克服了这个问题,但现在打开了一个不同的问题。我收到一个错误“TypeError:无法读取未定义的属性'getResponse'”错误是由我的原始代码的第8行引起的-数组对象似乎未定义?(正在尝试添加代码)'var responder=itemResponses[0].getResponse();'@GabrielCirtwell您是否尝试过记录
itemsresponses
?你得到了什么?另外,你能分享你正在工作的文件的一份经过消毒的副本(没有敏感信息),这样我就可以尝试重现这种行为吗?@lamblichus。我编辑了我的帖子来提供所有的代码(意识到很多都是我试图与其他人合作的评论,所以我只是删除了不必要的评论,并对需要做的小事情进行了清理)。我还没有尝试登录,但现在将尝试登录。谢谢你的回复,我会回复你的asap@GabrielCirtwell我的意思是分享表格本身。这就是问题所在。您安装了一个附加到此表单的
onFormSubmit
触发器,而不是表单将响应发送到的电子表格,对吗?如果你能分享的话,我会尝试模仿你的行为,希望能找出失败的地方。就是这样!不知道为什么我的表单第一次不能工作-创建了一个新表单,复制/粘贴了原始代码,现在就可以工作了!非常感谢。标记y