问题描述
嗨,我想创建一个可以收集学生数据的 Google 表单, 而且我想做出一种方法让我的学生一次只能输入一个答案
例如我想在要求录取号码的问题中使用这种方法,录取号码是一个不会重复的唯一号码。因此,如果学生输入已经输入的录取编号,我希望他们看到“录取编号已被使用”的错误消息
解决方法
问题:
避免针对特定表单项提交多个具有相同值的表单响应。
工作流程:
- 为了避免提交某些响应,您必须对
Admission number
项使用某种数据验证,如 Set rules for your form 所示。 - 每次提交表单响应时都应更新此数据验证,因为在以后的响应中应禁止新提交的
Admission number
。 - 为了在每次提交表单时更新此验证,您可以使用 Apps 脚本 onFormSubmit() 触发器,然后它会在每次提交表单时触发一个函数。我们将此函数称为
updateDataValidation
。 -
onFormSubmit
触发器可以在 these steps 或 programmatically 之后手动安装,方法是执行一次以下代码示例中的函数createTrigger
。
每次 updateDataValidation
触发时,它应该执行以下操作:
- 查找您的
Admission number
项目之前的所有回复。您可以先通过 Form.getResponses() 检索所有表单回复,然后通过检查商品的标题找到与您的商品相关的回复(请参阅 Item.getTitle())。 - 将上一步中检索到的录取号码数组转换为可用于数据验证的正则表达式模式,如下所示:
^{number1}$|^{number2}$|^{number3}$...
。 - 使用 TextValidation 更新商品的验证规则。
代码示例:
function updateDataValidation(e) {
const itemTitle = "Admission number"; // Name of the form item. Change accordingly
const errorMessage = "The admission number has been already used.";
const form = e ? e.source : FormApp.getActiveForm();
const responses = form.getResponses();
const admissionNumbers = responses.map(response => {
return response.getItemResponses().find(itemResponse => {
return itemTitle === itemResponse.getItem().getTitle();
});
}).map(itemResponse => itemResponse.getResponse());
const numbersPattern = admissionNumbers.map(number => `^${number}\$`).join("|");
const item = form.getItems().find(item => item.getTitle() === itemTitle);
let validation = FormApp.createTextValidation()
.setHelpText(errorMessage)
.requireTextDoesNotMatchPattern(numbersPattern)
.build();
item.asTextItem().setValidation(validation);
}
function createTrigger() {
const form = FormApp.getActiveForm();
ScriptApp.newTrigger('updateDataValidation')
.forForm(form)
.onFormSubmit()
.create();
}
注意事项:
- 在上面的代码示例中,假定项目
Admission number
被命名为Admission number
。如果不是这种情况,请从代码中更改它。 - 在上面的代码示例中,假定项
Admission number
是一个文本项,例如Short answer
。