如何用Google Apps Script实现Google表单手机号重复提交拦截?
问题分析与解决方案
你的代码执行成功但未实现预期功能,核心问题出在触发逻辑、错误处理方式和参数使用上,以下是具体分析和修正方案:
原代码的问题
- 触发时机滞后:
onFormSubmit是表单提交完成后才触发,此时用户已经看到提交成功提示,再删除响应无法给用户实时反馈。 - 表单关闭逻辑错误:
form.setCustomClosedFormMessage()会将整个表单置为关闭状态,导致所有用户都无法提交,完全不符合需求。 - 删除响应参数错误:
form.deleteResponse(e.response)的参数应为响应ID,而非FormResponse对象,正确写法是form.deleteResponse(e.response.getId())。 - 遍历响应效率低下:当表单响应数量较多时,遍历所有响应会导致脚本运行缓慢甚至超时。
修正后的解决方案
我们可以通过Google表格(表单响应存储)或PropertiesService快速检查重复手机号,重复时删除响应并通过邮件通知提交者(Google表单无法在提交页面实时弹出自定义错误)。
方法一:结合表单关联的Google表格检查重复
假设表单已关联Google表格,步骤如下:
- 从表格URL中获取表格ID。
- 替换代码中的配置参数:
function onFormSubmit(e) { // 配置参数 const SHEET_ID = "你的表格ID"; const MOBILE_COLUMN = 2; // 手机号所在列,从1开始计数(第二个问题对应B列) const FORM = FormApp.getActiveForm(); const NEW_MOBILE = e.response.getItemResponses()[1].getResponse(); // 获取表格中所有已提交的手机号 const SHEET = SpreadsheetApp.openById(SHEET_ID).getSheets()[0]; const ALL_MOBILES = SHEET.getRange(2, MOBILE_COLUMN, SHEET.getLastRow()-1, 1).getValues().flat(); // 检查重复并处理 if (ALL_MOBILES.includes(NEW_MOBILE)) { // 删除重复响应 FORM.deleteResponse(e.response.getId()); // 若表单收集了邮箱,发送错误通知 const RESPONDER_EMAIL = e.response.getRespondentEmail(); if (RESPONDER_EMAIL) { MailApp.sendEmail({ to: RESPONDER_EMAIL, subject: "提交失败:手机号重复", body: `你提交的手机号${NEW_MOBILE}已存在,请更换手机号重新提交。` }); } } }
方法二:使用PropertiesService存储手机号(无需表格)
如果不想依赖表格,可用PropertiesService存储已提交的手机号,查询速度更快:
function onFormSubmit(e) { const FORM = FormApp.getActiveForm(); const NEW_MOBILE = e.response.getItemResponses()[1].getResponse(); const PROPERTIES = PropertiesService.getScriptProperties(); // 检查手机号是否已提交 if (PROPERTIES.getProperty(NEW_MOBILE)) { // 删除重复响应 FORM.deleteResponse(e.response.getId()); // 发送错误通知(若收集了邮箱) const RESPONDER_EMAIL = e.response.getRespondentEmail(); if (RESPONDER_EMAIL) { MailApp.sendEmail(RESPONDER_EMAIL, "提交失败:手机号重复", `你提交的手机号${NEW_MOBILE}已存在,请更换手机号重新提交。`); } } else { // 存储新提交的手机号 PROPERTIES.setProperty(NEW_MOBILE, "submitted"); } }
生效配置
确保给onFormSubmit函数配置表单提交触发器:打开Apps Script编辑器 → 点击左侧「触发器」图标 → 添加触发器,选择onFormSubmit,事件类型为「表单提交」。
内容的提问来源于stack exchange,提问作者Pabasara Wijesinghe
相关产品推荐
相关产品推荐

