【问题标题】:Allowing only one answer in Google forms在 Google 表单中只允许一个答案
【发布时间】:2021-03-04 01:48:00
【问题描述】:

您好,我想创建一个可以收集学生数据的 Google 表单, 而且我想设法让我的学生一次只能输入一个答案

例如我想在询问录取号码的问题中使用这种方法,录取号码是一个唯一的号码,不会重复。因此,如果学生输入了已经输入的录取号码,我希望他们看到一条错误消息“录取号码已被使用”

【问题讨论】:

  • 你为什么不亲自给/发送录取号码给每个人?然后,您可以丢弃任何迟于第一个提交的提交。
  • 我猜学生在回复表格时不需要登录谷歌?否则,只需检查表单设置上的Limit to 1 response。如果不是这种情况,您还可以使用 Apps 脚本 onFormSubmit 触发器来编辑输入 admission number 的项目的响应验证,将刚刚输入的准入编号添加为对将来的提交无效。如果您认为有帮助,我会考虑发布一个解释这一点的答案。
  • " 您还可以使用 Apps 脚本 onFormSubmit 触发器来编辑输入录取编号的项目的响应验证,"这是个好主意,您能详细解释一下吗
  • 我发布了一个答案,解释了如何做到这一点。如果它对你有用,请告诉我。

标签: google-sheets google-api google-forms uniqueidentifier


【解决方案1】:

问题:

避免针对特定表单项使用相同的值提交多个表单响应。

工作流程:

  • 为了避免提交某些响应,您必须对Admission number 项使用某种数据验证,如Set rules for your form 所示。
  • 每次提交表单响应时都应更新此数据验证,因为新提交的Admission number 应在以后的响应中被禁止。
  • 为了在每次提交表单时更新此验证,您可以使用 Apps 脚本 onFormSubmit() 触发器,然后在每次提交表单时触发一个函数。我们称这个函数为updateDataValidation
  • onFormSubmit 触发器可以手动安装,在these stepsprogrammatically 之后,通过执行下面代码示例中的函数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

【讨论】:

  • 哎呀,我无法按照您的@lamblichus 说明完成我的工作,我是 Google 脚本和编码的新手,所以您能否更简单地给我一些说明。一步一步,你能清楚地告诉我应该在代码中替换哪些部分我应该创建2个脚本吗? 1个带有onFormSubmit(),另一个带有您提供的代码??不清楚,能不能解释的更清楚一点
  • @AshirwadaManamudali 只需要一个脚本,您可以在其中添加我提供的代码。所以请执行以下操作:(1) 复制我提供的代码,(2) 运行createTrigger 一次(这将安装onFormSubmit 触发器 - 每当提交表单时都会触发 updateDataValidation - 没有额外的代码必要的)。如果您需要更多说明或详细信息,请告诉我。
  • 感谢您的回复,我应该用问题替换 Item Title 吗?有没有地方可以添加我的表单 ID 是1FAIpQLSdVIS7-lLBkoLsAlzzm0XWyMiOD2FvvdUc6uj5aWTqRBsZTWQ
  • 我应该替换哪些项目才能自定义代码以根据我的表单工作
  • @AshirwadaManamudali 如果你的脚本是bound 到你的Form,你不需要指定ID:FormApp.getActiveForm() 指的是脚本绑定到的Form。您只需将 itemTitle(当前为 Admission number,参见函数 updateDataValidation 的第 2 行)替换为表单中项目的名称。此外,如果脚本未绑定到表单,而是独立的,则应将 FormApp.getActiveForm() 的两个实例替换为 FormApp.openById("YOUR_FORM_ID")
猜你喜欢
  • 2021-05-02
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 2022-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多