我有一个调查,预计不会重复回复。似乎没有任何方法可以在Google表单控件中设置它,因此我需要编写一个脚本。如何确保每个唯一用户名只允许提交一次 Google 表单?
考虑一项具有简单选择的调查。如果一个人提交"选项A",然后重复调查以提交"选项B",我想忽略后一个提交;刚刚发送的选项 (B) 将从 Google 表格中删除。
您无法阻止用户多次提交,但正如您所说,您可以删除后续提交。
假设"用户名"被放在 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()
的最后一行,并处理差异,可以缓解这种担忧。
表单现在可以选择限制用户回答一个,但他们应该有一个 Google 帐户。你以编程方式设置这个 setLimitOneResponsePerUser(布尔值) 并使用hasLimitOneResponsePerUser()进行检查。