每位用户只能提交一份Google表单

时间:2013-09-12 14:44:40

标签: google-apps-script google-sheets google-form

我的调查预计不会重复回复。似乎没有任何方法可以在Google Forms控件中设置它,因此我需要编写一个脚本。如何确保每个唯一用户名只允许一次Google表单提交?

考虑一个简单选择的调查。如果一个人提交“选择A”,然后重复调查提交“选择B”,我想不理会后者的提交;刚刚发送的选项(B)将从Google表格中删除。

2 个答案:

答案 0 :(得分:2)

您无法阻止用户多次提交,但正如您所说,您可以删除后续提交内容。

我们假设“用户名”放在B列中,带有该标题。如果您位于Google Apps域中,则可以选择自动收集用户名。在域名之外,您必须依赖一直填写用户名的受访者。

应在电子表格中将以下功能设置为已编程的表单提交事件触发器。收到新提交后,用户

function onFormSubmit (event) {
  var sheet = event.range.getSheet();
  var data = sheet.getDataRange().getValues();

  // Read usernames from column B, into string
  var userNames = sheet.getDataRange()
                       .offset(1, 1, sheet.getLastRow()-1,1)
                       .getValues()
                       .join();

  // Use a regex search to count occurrences of the current
  // username. There should be just 1.
  var re = new RegExp(event.namedValues["Username"], "g");
  var count = userNames.match(re).length;

  // Delete submission if user previously submitted.
  if (count != 1) {
    sheet.deleteRow(event.range.getRow());
  }
}

注意事项

  • 这将从电子表格中删除接受表单回复的条目;它不会影响附加到表单本身的响应,可通过Form.getResponses()获得。

  • 随着提交数量的增加,这将变慢。可以通过删除搜索先前提交的需要来优化它,例如通过缓存所有唯一的用户名。

  • 触发器功能接收的提交数据可能与读入data变量的电子表格版本不同步,这是一个眩光事件。结果是仍然可以允许重复的条目。通过将event.range的行号与.getDataRange()的最后一行进行比较,并处理差异,可以减轻这种担忧。

答案 1 :(得分:1)

Google表单现在可以选择限制用户的一个答案,但他们应该有一个Google帐户。你以编程方式设置了这个setLimitOneResponsePerUser(Boolean)  并使用hasLimitOneResponsePerUser()进行检查。