如何配置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里添加一个必填的邮箱字段,确保能收集到用户的联系邮箱。
- 打开表单的「脚本编辑器」(点击右上角三个点 > 脚本编辑器),创建一个新的脚本项目。
- 编写两个核心函数:
- 表单提交处理函数:
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 }); } - 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
相关产品推荐
相关产品推荐

