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

如何用Google Apps Script实现Google表单手机号重复提交拦截?

问题分析与解决方案

你的代码执行成功但未实现预期功能,核心问题出在触发逻辑、错误处理方式和参数使用上,以下是具体分析和修正方案:

原代码的问题

  1. 触发时机滞后:onFormSubmit是表单提交完成后才触发,此时用户已经看到提交成功提示,再删除响应无法给用户实时反馈。
  2. 表单关闭逻辑错误:form.setCustomClosedFormMessage()会将整个表单置为关闭状态,导致所有用户都无法提交,完全不符合需求。
  3. 删除响应参数错误:form.deleteResponse(e.response)的参数应为响应ID,而非FormResponse对象,正确写法是form.deleteResponse(e.response.getId())。
  4. 遍历响应效率低下:当表单响应数量较多时,遍历所有响应会导致脚本运行缓慢甚至超时。

修正后的解决方案

我们可以通过Google表格(表单响应存储)或PropertiesService快速检查重复手机号,重复时删除响应并通过邮件通知提交者(Google表单无法在提交页面实时弹出自定义错误)。

方法一:结合表单关联的Google表格检查重复

假设表单已关联Google表格,步骤如下:

  1. 从表格URL中获取表格ID。
  2. 替换代码中的配置参数:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 16:17:10