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

如何配置Google Forms发送含验证链接或验证码的确认邮件?

Google Forms 实现邮件验证的两种可行方案

Great question! Google Forms doesn't have built-in support for either of these verification flows, but you can absolutely build both using Google Apps Script—here's how to tackle each approach:

方案1:发送唯一验证链接(未点击则忽略响应)

这种方式需要通过Web App实现验证标记,核心思路是用户提交表单后先收到验证链接,点击后才标记响应为有效:

  • 第一步,在你的Google Form里添加一个必填的邮箱字段,确保能收集到用户的联系邮箱。
  • 打开表单的「脚本编辑器」(点击右上角三个点 > 脚本编辑器),创建一个新的脚本项目。
  • 编写两个核心函数:
    1. 表单提交处理函数:
      function onFormSubmit(e) {
        const response = e.response;
        const responseId = response.getId();
        const email = response.getItemResponses()[0].getResponse(); // 假设邮箱是第一个字段,可根据实际调整索引
        const verifyUrl = "https://script.google.com/macros/s/[你的Web App部署ID]/exec?responseId=" + responseId;
        
        // 发送验证邮件
        MailApp.sendEmail({
          to: email,
          subject: "请验证你的表单提交",
          body: "点击以下链接完成验证:\n" + verifyUrl
        });
      }
      
    2. Web App验证函数:
      function doGet(e) {
        const responseId = e.parameter.responseId;
        const sheet = SpreadsheetApp.openById("[你的关联SheetsID]").getActiveSheet();
        const rows = sheet.getDataRange().getValues();
        
        // 找到对应响应的行,标记验证状态
        for (let i = 1; i < rows.length; i++) {
          if (rows[i][0] === responseId) { // 假设响应ID在第一列,可根据实际调整
            sheet.getRange(i+1, rows[0].length + 1).setValue("已验证"); // 在新增列标记验证状态
            break;
          }
        }
        return HtmlService.createHtmlOutput("<h1>验证成功!</h1>");
      }
      
  • 部署Web App:点击「部署」>「新部署」,选择类型为「Web应用」,设置权限为「任何人,甚至匿名」(可根据需求调整),部署后复制Web App的URL,替换到上面脚本的verifyUrl中。
  • 设置触发器:在脚本编辑器里,点击「编辑」>「当前项目的触发器」,添加一个新触发器,选择onFormSubmit函数,触发事件为「表单提交」。
  • 后续处理:在关联的Google Sheets里,你可以通过过滤「验证状态」列,只处理标记为「已验证」的响应,相当于实现了「未点击则表单不生效」的效果。

方案2:发送验证码并在表单中输入验证(更简便)

这个方案不需要Web App,流程更直接,适合快速实现:

  • 在Google Form里添加两个必填字段:一个邮箱字段,一个「验证码」短文本字段。
  • 打开脚本编辑器,编写验证逻辑:
    // 存储验证码(带过期时间,比如15分钟)
    function getCodeStorage() {
      return PropertiesService.getScriptProperties();
    }
    
    // 表单提交时验证验证码
    function onFormSubmit(e) {
      const response = e.response;
      const itemResponses = response.getItemResponses();
      let email = "";
      let inputCode = "";
      
      // 获取邮箱和用户输入的验证码(根据字段标题调整判断逻辑)
      itemResponses.forEach(item => {
        if (item.getItem().getTitle() === "邮箱") email = item.getResponse();
        if (item.getItem().getTitle() === "验证码") inputCode = item.getResponse();
      });
    
      const storedCode = getCodeStorage().getProperty(email);
      const now = Date.now();
    
      if (!storedCode) {
        // 第一次提交,生成验证码并发送
        const code = Math.floor(100000 + Math.random() * 900000).toString();
        getCodeStorage().setProperty(email, `${code}:${now + 15*60*1000}`); // 15分钟过期
        
        MailApp.sendEmail({
          to: email,
          subject: "你的表单验证验证码",
          body: `你的验证码是:${code},15分钟内有效`
        });
    
        // 删除未验证的响应
        const sheet = SpreadsheetApp.openById("[你的SheetsID]").getActiveSheet();
        sheet.deleteRow(sheet.getLastRow());
        return;
      }
    
      // 验证验证码是否正确且未过期
      const [code, expireTime] = storedCode.split(":");
      if (inputCode === code && now < parseInt(expireTime)) {
        // 验证成功,删除存储的验证码
        getCodeStorage().deleteProperty(email);
        return;
      } else {
        // 验证失败,删除响应并提示
        MailApp.sendEmail({
          to: email,
          subject: "验证码错误或已过期",
          body: "请重新提交表单获取新的验证码"
        });
        const sheet = SpreadsheetApp.openById("[你的SheetsID]").getActiveSheet();
        sheet.deleteRow(sheet.getLastRow());
      }
    }
    
  • 设置触发器:同样添加「表单提交」触发器,绑定onFormSubmit函数。
  • 流程说明:用户第一次提交表单(仅填邮箱,验证码留空),脚本会发送验证码到邮箱并删除这次提交;用户收到验证码后,重新填写表单并输入正确的验证码,脚本验证通过后保留响应,否则删除并提示。

注意事项

  • 首次运行脚本时需要授权,按照提示完成权限验证即可。
  • 替换脚本中的[你的Web App部署ID]、[你的关联SheetsID]为实际的ID,ID可以从对应服务的URL中获取。
  • 验证码过期时间可以根据需求调整,避免滥用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:48:49