如何阻止用户用不同邮箱重复填写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
相关产品推荐
相关产品推荐

