You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Google表单设置访问限制?代码调试与替代方案咨询

Google Forms 验证码验证方案(含代码修复)

一、现有代码的问题与修复

你的代码存在核心逻辑和效率问题,以下是修复方案:

问题点

  1. 验证码不匹配时直接关闭整个表单,导致所有用户无法提交,而非仅拒绝当前无效提交
  2. 读取整列数据包含大量空值,影响判断效率
  3. 未标记已使用的验证码,无法防止重复提交

修复后的代码

function checkCodes(e) {
  const formResponse = e.response;
  const itemResponses = formResponse.getItemResponses();
  const codeQuestionIndex = 0; 
  const submittedCode = itemResponses[codeQuestionIndex].getResponse().trim();

  // 打开验证码表格
  const sheet = SpreadsheetApp.openByUrl('你的表格链接');
  const codeSheet = sheet.getSheetByName('Sheet1');
  // 仅读取有数据的行,避免空值干扰
  const dataRange = codeSheet.getDataRange();
  const codesData = dataRange.getValues();
  
  let isValid = false;
  let usedRowIndex = -1;

  // 遍历验证码列表,同时检查是否已被使用(假设B列标记使用状态)
  for (let i = 1; i < codesData.length; i++) { // 跳过表头行
    const storedCode = codesData[i][0].trim();
    const isUsed = codesData[i][1];

    if (storedCode === submittedCode && !isUsed) {
      isValid = true;
      usedRowIndex = i + 1; // 转换为表格实际行号(从1开始)
      break;
    }
  }

  // 验证不通过则删除当前提交
  if (!isValid) {
    formResponse.setDestination(FormApp.DestinationType.NONE);
    formResponse.deleteResponse();
    // 可选:设置自定义错误提示
    const form = FormApp.getActiveForm();
    form.setCustomClosedMessage('验证码无效,请检查后重试');
  } else {
    // 标记当前验证码已使用
    codeSheet.getRange(usedRowIndex, 2).setValue(true);
  }
}

使用注意事项

  • 替换你的表格链接为实际Google Sheet URL
  • 在验证码表格的B列添加表头已使用,用于标记已验证的验证码
  • 给脚本绑定表单提交触发器:打开脚本编辑器→左侧「触发器」→添加触发器,选择checkCodes函数,触发事件选「表单提交」

二、非代码实现方案

如果不想编写代码,可选择以下方式:

  • 内置数据验证:在验证码输入框的「数据验证」中选择「从范围列表」,直接关联表格中的验证码列(无法防止重复使用,适合无重复限制场景)
  • 第三方插件:在Google Workspace Marketplace搜索「Form Verification」「Code Validator」类插件,多数支持验证码验证、重复提交限制,操作更简便

内容的提问来源于stack exchange,提问作者FanKey 89

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 02:20:04