从谷歌表单收集回复



我对谷歌脚本很陌生,正在尝试学习,但文档要么冲突,要么不存在,要么对我不起作用。

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

Flow-我已经通过编辑->当前项目的触发器->创建了一个新的触发器来设置触发器,在提交时它运行我的函数。应该发生的是(在脚本的后面(sendMail以我的身份向var"responsiver"发送一条邮件消息。然而,当我试图从脚本编辑器运行并填写测试表单提交(通过后者的电子邮件(时,我收到错误"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的方法getItemResponses((。

解决方案:

假设:

  • 您希望每次提交表单时都运行脚本(如果满足条件,则发送一封电子邮件(
  • 您已安装onFormSubmit触发器,该触发器已连接到您的表单

如果是这种情况,您应该使用触发器事件对象来获取FormResponse。你应该替换这个:

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

有了这个:

var formResponse = e.response;
var itemResponses = formResponse.getItemResponses();

更新:

你的表格没有5项,只有4项。第一项实际上是应答者电子邮件,因此,必须通过FormResponse.getRespondentEmail((进行检索。因此,itemResponses只能访问索引3,而不能访问索引4,并且itemResponses[4]未定义。这就是你新错误背后的原因。你应该这样做:

var respondent = formResponse.getRespondentEmail();
var district = itemResponses[0].getResponse();
var urgency = itemResponses[1].getResponse();
var type = itemResponses[2].getResponse();
var topic = itemResponses[3].getResponse();

参考:

  • 事件对象:表单提交
  • Form.getResponses((
  • FormResponse.getRespondentEmail((

虽然可以从表单本身做你想做的事情,但作为初学者来说会很困难,因为正如你所注意到的,没有太多的示例脚本可以完成。

从响应表中这样做会容易得多,而且有很多处理电子表格中表单数据的例子。

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

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);
}

最新更新