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

如何阻止用户用不同邮箱重复填写Google表单?脚本报错排查

问题解决与脚本修正

错误根源

Cannot read properties of null (getSheetByName) 报错的核心原因是:你的表格只有名为elections的工作表,但脚本里硬编码了"Form Responses 1"作为表名,导致getSheetByName找不到对应工作表,返回null后调用后续方法自然触发错误。

修正后的完整可运行脚本

function onFormSubmit(e) {
    // 获取表单响应对象
    var formResponse = e.response;
    // 补全原脚本缺失的表单实例
    var form = FormApp.getActiveForm();
    // 获取短答栏提交的姓名(假设为第一个表单项目)
    var submittedName = formResponse.getItemResponses()[0].getResponse();

    // 关联表格与指定工作表
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheetByName("elections");
    if (!sheet) throw new Error("未找到名为elections的工作表");

    // 获取已提交的所有姓名(跳过表头,假设首行为表头)
    var existingNames = sheet.getRange(2, 1, sheet.getLastRow() - 1, 1)
                             .getValues()
                             .flat(); // 转为一维数组简化查找

    // 当前新提交记录的行号(表单提交的新数据默认在最后一行)
    var newRow = sheet.getLastRow();

    // 检查姓名重复并处理
    if (existingNames.includes(submittedName)) {
        // 删除重复的新提交记录
        sheet.deleteRow(newRow);
        // 设置重复提交提示(注意:此操作会临时关闭表单,若要仅提示当前用户,建议改用表单前置验证)
        form.setCustomClosedFormMessage("该姓名已投票,请勿重复提交");
        // 可选:自动重新开放表单(示例为5分钟后)
        // Utilities.sleep(300000);
        // form.setAcceptingResponses(true);
    }
}

关键修正与优化点

  • 表名匹配:将getSheetByName参数改为实际表名elections,解决null报错问题。
  • 补全表单实例:新增FormApp.getActiveForm(),修复原脚本form变量未定义的问题。
  • 逻辑修正:原脚本循环删除旧行是错误逻辑,改为删除刚提交的重复新行(旧行是合法的首次提交)。
  • 效率优化:跳过表头行,将二维姓名数组转为一维,用includes快速检查重复。

额外优化建议

如果不想因重复提交关闭整个表单影响其他用户,推荐改用表单前置验证:

  • 打开表单的短答栏设置,选择「数据验证」→「自定义公式」
  • 输入公式:=COUNTIF(elections!A:A, A1)=1(A列为姓名存储列,A1为当前输入框)
  • 设置错误提示文本:「该姓名已投票,请勿重复提交」

这种方式能在用户提交前就拦截重复,体验更友好。

内容的提问来源于stack exchange,提问作者Benjamin Yankey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 06:32:48