【问题标题】:Storing all forms answers in one single file将所有表单答案存储在一个文件中
【发布时间】:2021-10-12 07:24:08
【问题描述】:

我正在尝试将用户提交的表单中的每个响应存储在 AppScript 中。 我正在使用此代码,但出现错误:

'TypeError: id_form.getResponses is not a function'

我的代码:

//store answers in one file

编辑:

function setDestination_responses(form) {
  var id_form = FormApp.openById(form.getId());
  var spreadsheet_responses = SpreadsheetApp.openById('1TX4GOsihKuXFhbZMhtFWPYmGwrxii0XhyGhyTKzPKhc');

  var sheet_spreadsheet_responses = spreadsheet_responses.getSheets()[0];
  var titles = id_form.getItems().map(e => e.getTitle());
  var formResponses = id_form.getResponses();
  var values = formResponses.map(f => f.getItemResponses().reduce((o, i) => {
    var r = i.getResponse();
    return Object.assign(o, {[i.getItem().getTitle()]: Array.isArray(r) ? r.join(",") : r});
  }, {})).map(o => titles.map(t => o[t] || ""));

  if (values.length==0) {console.log(`VALUES EQUAL TO 0 ${values}`)} 
  else{sheet_spreadsheet_responses.getRange(sheet_spreadsheet_responses.getLastRow() + 1, 1, values.length, values[0].length).setValues(values)};
}

【问题讨论】:

  • 我觉得应该是form.getResponses()
  • 好吧,脚本现在不会引发错误,但没有答案存储在我的电子表格中。有什么我想念的吗?
  • 做一些基本的调试。 console.log(formResopnses)
  • 您正在尝试从表单 id 中读取,它是一个字符串,而您应该从 Form 对象中读取

标签: javascript google-apps-script google-sheets google-forms


【解决方案1】:

修改点:

  • getResponses() 返回 FormResponse 对象。在您的情况下,我认为需要使用 getItemResponses() 检索响应值。
  • 在循环中使用appendRow时,处理成本会变高。 Ref

当这些点反映到你的脚本中时,它变成如下。

修改脚本:

function myFunction() {
  var id_form = FormApp.openById(form.getId());
  var spreadsheet_responses = SpreadsheetApp.openById('1X1rhvgTfFq0-SoecLcgDP1Zu8x93Vba0EKMTBkRFJcw');
  var sheet_spreadsheet_responses = spreadsheet_responses.getSheets()[0];
  var titles = id_form.getItems().map(e => e.getTitle());
  var formResponses = id_form.getResponses();
  var values = formResponses.map(f => f.getItemResponses().reduce((o, i) => {
    var r = i.getResponse();
    return Object.assign(o, {[i.getItem().getTitle()]: Array.isArray(r) ? r.join(",") : r});
  }, {})).map(o => titles.map(t => o[t] || ""));
  sheet_spreadsheet_responses.getRange(sheet_spreadsheet_responses.getLastRow() + 1, 1, values.length, values[0].length).setValues(values);
}
  • 当您运行此脚本时,系统会从 Google 表单中检索所有回复,并将它们附加到电子表格的第一张表中。
  • 关于var id_form = FormApp.openById(form.getId());,在您的脚本中,form 可能与FormApp.openById(form.getId()) 相同。
  • 在 Google 表单中,当提交空答案时,问题没有价值。因此,需要考虑这一点。因此,首先,从项目中检索标题,并使用项目标题创建值。我认为这可能很重要。

参考资料:

【讨论】:

  • 谢谢!解释得很好!
  • TypeError:无法读取未定义的属性“长度”。为什么我会收到此错误?它指向 values.length。是不是因为我们需要将参数“value”粘贴到函数中?
  • @alb 感谢您的回复。我带来的不便表示歉意。关于Cannot read property 'length' of undefined. Why am I getting this error?,在这种情况下,我认为values 可能没有任何价值。例如,将if (values.length == 0) return; 放在sheet_spreadsheet_responses.getRange(,,,) 行之前怎么样?如果您想查看,可以通过console.log(values)进行。
  • 好的!我根据您的建议编辑了帖子,但在提交回复时,电子表格中没有任何内容被注销。 JS还是太新手了,抱歉
  • @alb 感谢您的回复。关于I edited the post with your suggestion, but nothing is written off in the spreadsheet when submitting responses.,在这种情况下,我认为是因为values 是空的。通过if (values.length == 0) return;,脚本完成。当您检查console.log(values) 时,您得到了什么结果?很遗憾,我不知道您的 Google 表单。所以我无法明确回答你目前的情况。这是因为我的技术不好。对此我深表歉意。
猜你喜欢
  • 2012-12-23
  • 2016-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 2019-01-24
  • 2013-04-14
相关资源
最近更新 更多