【问题标题】:Allow only one Google Form submission per user每位用户仅允许提交一份 Google 表单
【发布时间】:2013-09-12 14:44:40
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    让我们假设“用户名”放置在 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() 中的最后一行并处理差异,可以缓解这种担忧。

    【讨论】:

      【解决方案2】:

      Google 表单现在可以选择限制用户回答一个问题,但他们应该有一个 Google 帐户。您可以以编程方式设置此setLimitOneResponsePerUser(Boolean) 并通过hasLimitOneResponsePerUser() 进行检查。

      【讨论】:

        猜你喜欢
        • 2015-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-25
        • 1970-01-01
        • 2011-06-18
        • 1970-01-01
        • 2016-09-23
        相关资源
        最近更新 更多