【问题标题】:Collect Responses From Google Form?从 Google 表单收集回复?
【发布时间】:2020-03-22 23:18:35
【问题描述】:

我对 Google Scripts 很陌生,并且正在尝试学习,但文档要么有冲突,要么不存在,要么不适合我。

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

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

提前感谢您的帮助。请再次注意,我是 Google Scripts 的新手。

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

【问题讨论】:

  • 我认为提供您当前的脚本和复制问题的流程将有助于用户思考解决方案。
  • function sendEmails(e) { // 获取活动表单和响应 var form = FormApp.getActiveForm(); var formResponses = form.getResponses(); var itemResponses = formResponses.getItemResponses(); // 将响应分配给变量 var respondent = itemResponses[0].getResponse(); var 区 = itemResponses[1].getResponse(); var urgency = itemResponses[2].getResponse(); var type = itemResponses[3].getResponse(); var topic = itemResponses[4].getResponse(); }
  • 抱歉,不知道如何添加代码块...
  • 感谢您的回复。您可以在问题中添加脚本吗?因为很难在评论中看到脚本。您可以通过the edit button 编辑您的问题。您能否提供复制问题的详细流程?比如你如何运行函数sendEmails(e)?
  • 添加了代码!所以脚本的另一部分只有一堆学区和员工信息/电子邮件,我不想花时间剪掉。最大的问题是我收到“getItemResponses();”不是一个函数,所以我无法提取用户的电子邮件和脚本未来将依赖(并且有效)的其他信息 - 使用 Google 表格对其进行了测试

标签: google-apps-script


【解决方案1】:

问题:

form.getResponses() 返回一个FormResponse 的数组,如您所见here。响应数组没有名为getItemResponses() 的方法,这就是您编码失败的原因。您现在所做的是获取与表单相对应的所有响应,而不是刚刚提交的响应。

您应该使用来自单个 FormResponse 的方法 getItemResponses()。

解决办法:

假设:

  • 您希望脚本在每次提交表单时运行(如果满足条件,则发送电子邮件)。
  • 您已安装一个onFormSubmit trigger,连接到您的表单。

如果是这种情况,您应该使用触发器event object 来获取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();

参考:

【讨论】:

  • 非常感谢,这是有道理的!我已根据您的建议进行了更改,并且克服了这个问题,但现在打开了一个不同的问题。我收到错误“TypeError:无法读取未定义的属性'getResponse'”错误是由我的原始代码的第 8 行引起的 - 似乎数组对象未定义? (尝试添加代码)'var respondent = itemResponses[0].getResponse();'
  • @Gabriel Cirtwell 你试过记录itemResponses吗?你得到什么?另外,您能否分享您正在处理的文件的经过清理的副本(不含敏感信息),以便我可以尝试重现此行为?
  • @lamblichus。我编辑了我的帖子以提供所有代码(意识到其中很多是我试图与其他人合作的 cmets,所以我只是删除了不必要的 cmets 并清理了需要做的小部分)。我还没有尝试记录,但现在会这样做。感谢您的回复,我会尽快回复您
  • @Gabriel Cirtwell 我的意思是分享表格本身。这就是问题所在。您安装了一个附加到此表单的onFormSubmit 触发器,而不是表单发送响应的电子表格,对吧?如果您可以分享它,我会尝试重现您的行为,并希望找出失败的原因。
  • 就是这样!不知道为什么我的表格第一次不起作用 - 制作了一个新表格,复制/粘贴原始代码,它现在可以工作了!谢谢!现在将您的答案标记为正确
【解决方案2】:

虽然可以从表单本身做您想做的事情,但作为初学者会很困难,因为您注意到没有很多示例脚本可以使用。

从响应表中执行此操作会容易得多,并且有很多用于处理电子表格中的表单数据的示例。

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

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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多