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

Google Apps Script表单重复邮箱校验失效问题排查

Google表单重复邮箱校验失效问题排查与修复

问题描述

编写了一段Google Apps Script脚本,期望实现两项表单提交校验:

  1. 禁止已提交过的邮箱再次提交;
  2. 当表单响应数达到100条时,停止接受新提交。
    但实际运行时,邮箱重复校验功能无法正常生效。

失效原因分析

  1. 校验时机错误:onSubmit事件是在表单已经成功保存响应后才触发的。此时再抛出错误或关闭表单,已经无法阻止这条重复的提交被记录,用户实际已经提交成功,达不到“阻止重复提交”的目的。
  2. 遍历逻辑混乱:原代码遍历所有响应时,逐个提取邮箱并实时检查临时列表emailList,这会导致:
    • 历史中已存在的重复邮箱会在遍历到第二个重复项时触发错误,而非针对本次新提交的校验;
    • 新提交的重复邮箱只有在遍历到它时才会被检测到,但此时提交已经完成。
  3. 未精准定位当前提交:没有单独提取本次提交的邮箱,而是无差别遍历所有响应,逻辑冗余且无法针对当前提交做精准校验。

修复后的代码

function onSubmit(e) {
  var form = FormApp.getActiveForm();
  var responses = form.getResponses();
  var currentResponse = e.response;
  var currentEmail = null;

  // 提取本次提交的邮箱字段内容
  var itemResponses = currentResponse.getItemResponses();
  for (var j = 0; j < itemResponses.length; j++) {
    var itemResponse = itemResponses[j];
    if (itemResponse.getItem().getTitle() === "Email Address") {
      currentEmail = itemResponse.getResponse();
      break;
    }
  }

  if (!currentEmail) {
    throw new Error("未找到指定的邮箱字段");
  }

  // 检查历史响应中是否已存在该邮箱(排除本次提交)
  var emailExists = false;
  for (var i = 0; i < responses.length - 1; i++) {
    var response = responses[i];
    var historyItemResponses = response.getItemResponses();
    for (var k = 0; k < historyItemResponses.length; k++) {
      var historyItemResponse = historyItemResponses[k];
      if (historyItemResponse.getItem().getTitle() === "Email Address") {
        if (historyItemResponse.getResponse() === currentEmail) {
          emailExists = true;
          break;
        }
      }
    }
    if (emailExists) break;
  }

  // 处理重复邮箱情况
  if (emailExists) {
    form.setAcceptingResponses(false);
    // 删除本次重复提交的响应(需授权)
    var destinationId = form.getDestinationId();
    if (destinationId) {
      var sheet = SpreadsheetApp.openById(destinationId).getActiveSheet();
      sheet.deleteRow(sheet.getLastRow());
    }
    throw new Error("该邮箱已提交过表单,无法重复提交");
  }

  // 处理响应数上限情况
  if (responses.length >= 100) {
    form.setAcceptingResponses(false);
    throw new Error("表单已达到最大提交次数限制");
  }
}

关键修复说明

  • 利用事件对象e直接获取本次提交的响应,精准提取当前邮箱,避免冗余遍历;
  • 检查历史响应时排除本次提交,确保校验的是“历史已存在”的邮箱;
  • 新增重复提交响应的删除逻辑,弥补onSubmit事件触发时机的滞后性;
  • 调整校验顺序,优先处理邮箱重复问题,再检查响应数上限。

额外注意事项

  • 该脚本需要设置为可安装触发器(而非简单绑定脚本的默认触发器),否则可能没有权限删除表单响应;
  • 确保表单中邮箱字段的标题与代码中的"Email Address"完全一致(大小写、空格均需匹配);
  • 官方推荐更稳定的无脚本方案:在表单设置中开启“收集电子邮件地址”,并勾选“允许每个用户提交一次”,可直接实现重复邮箱拦截。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:38:20