如何通过Google Apps Script实现邮件中Approve/Reject审批超链接功能?
嘿,我来帮你搞定这个审批按钮的问题!用Google Apps Script完全能实现这个需求,下面是一步步的实操方案,贴合你的场景:
整体思路
核心是把「Approve/Reject」按钮做成带参数的Web App链接,经理点击后触发脚本:更新Google Sheet里的审批状态,再自动给下一层审批节点发邮件通知。
1. 先整理你的Google Sheet结构
假设你已经有Form提交的详情列(比如提交时间、提交人信息等),建议在Sheet末尾加两列:审批状态(待审批/已批准/已拒绝)和审批人,用来记录审批结果和操作人。
2. 写个生成专属审批链接的函数
我们需要给每一条新提交生成唯一的批准/拒绝链接,链接里要带上这条记录的行号(或者你可以用唯一ID,更稳妥)和审批动作类型。
function generateApprovalLinks(rowNum) { // 后面部署Web App后,把这里替换成实际的Web App URL const webAppUrl = "https://script.google.com/macros/s/你的WebApp部署ID/exec"; // 生成带参数的链接:行号+审批动作 const approveLink = `${webAppUrl}?row=${rowNum}&action=approve`; const rejectLink = `${webAppUrl}?row=${rowNum}&action=reject`; return { approve: approveLink, reject: rejectLink }; }
3. 修改Form提交触发的邮件脚本
你已经能提取提交详情,现在把生成的审批链接做成邮件里的按钮(用HTML邮件更美观),发给经理:
function onFormSubmit(e) { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const rowNum = sheet.getLastRow(); // 刚提交的那条记录的行号 // 提取提交详情(根据你的Sheet列调整,这里是示例) const timestamp = e.values[0]; const submitterName = e.values[1]; // 其他提交字段...比如提交内容、附件链接等,按需添加 // 生成审批按钮链接 const links = generateApprovalLinks(rowNum); // 经理的邮箱地址 const managerEmail = "manager@yourcompany.com"; // 构造HTML邮件,把链接做成按钮样式 const htmlBody = ` <p>嗨,有新的提交需要你审批:</p> <ul> <li>提交时间:${timestamp}</li> <li>提交人:${submitterName}</li> <!-- 这里加其他提交详情字段 --> </ul> <p>点击下方按钮完成审批:</p> <a href="${links.approve}" style="padding: 8px 16px; background: #4CAF50; color: white; text-decoration: none; border-radius: 4px;">Approve</a> <a href="${links.reject}" style="margin-left: 10px; padding: 8px 16px; background: #f44336; color: white; text-decoration: none; border-radius: 4px;">Reject</a> `; // 发送邮件给经理 MailApp.sendEmail({ to: managerEmail, subject: "新提交审批请求", htmlBody: htmlBody }); }
4. 写处理审批请求的核心函数
当经理点击链接时,Web App会触发这个函数,它要做三件事:解析链接参数、更新Sheet、给下一层审批人发邮件:
function doGet(e) { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const rowNum = parseInt(e.parameter.row); const action = e.parameter.action; // 检查参数是否合法 if (!rowNum || !action) { return ContentService.createTextOutput("参数错误,请检查链接是否正确").setMimeType(ContentService.MimeType.TEXT); } // 更新Sheet里的审批状态和审批人 const approvalStatus = action === "approve" ? "已批准" : "已拒绝"; const approver = Session.getActiveUser().getEmail(); // 获取点击链接的用户邮箱(需要权限) // 假设倒数第二列是「审批状态」,最后一列是「审批人」,根据你的Sheet调整列号 sheet.getRange(rowNum, sheet.getLastColumn()-1).setValue(approvalStatus); sheet.getRange(rowNum, sheet.getLastColumn()).setValue(approver); // 提取提交详情,用来给下一层审批人发通知 const submitDetails = sheet.getRange(rowNum, 1, 1, sheet.getLastColumn()-2).getValues()[0]; const timestamp = submitDetails[0]; const submitterName = submitDetails[1]; // 下一层审批人的邮箱 const nextApproverEmail = "next-approver@yourcompany.com"; // 构造给下一层的通知邮件 const nextHtmlBody = ` <p>您好,以下提交已完成一级审批:</p> <ul> <li>提交时间:${timestamp}</li> <li>提交人:${submitterName}</li> <li>审批结果:${approvalStatus}</li> <li>审批人:${approver}</li> </ul> <!-- 如果需要二级审批,这里可以继续生成类似的审批按钮链接,重复前面的逻辑 --> `; // 发送通知邮件 MailApp.sendEmail({ to: nextApproverEmail, subject: `提交审批结果:${approvalStatus}`, htmlBody: nextHtmlBody }); // 返回给经理的审批成功提示页面 return ContentService.createHtmlOutput(` <h3>审批成功!</h3> <p>你已将该提交标记为${approvalStatus},通知邮件已发送给下一层审批节点。</p> `).setMimeType(ContentService.MimeType.HTML); }
5. 部署成Web App(关键步骤!)
这步没做好,链接点了也没用:
- 打开Google Apps Script编辑器,点击右上角「部署」→「新部署」
- 类型选「Web应用」
- 执行权限选「任何人,甚至匿名」(如果要限制只有公司内部人员能访问,选「仅限组织内用户」,但匿名模式更方便测试)
- 点击「部署」,复制生成的Web App URL,替换到
generateApprovalLinks函数里的webAppUrl - 第一次部署会提示授权,跟着步骤完成就行(要允许脚本访问你的Sheet和邮件)
6. 设置Form提交触发器
让脚本自动在Form提交时运行:
- 在脚本编辑器左侧点「触发器」图标
- 添加触发器:选择
onFormSubmit函数,事件源选「电子表格」,事件类型选「表单提交」 - 保存触发器,这样每次有人提交Form,就会自动给经理发审批邮件
一些小提示
- 权限问题:确保脚本有MailApp发送邮件和SpreadsheetApp读写Sheet的权限,第一次运行会提示授权
- 安全验证:如果不想随便有人点链接,可以在
doGet函数里加判断,比如检查当前用户邮箱是否是经理的邮箱,防止无关人员操作 - 用唯一ID代替行号:如果Sheet里会插入/删除行,行号可能变,建议给每条提交生成一个UUID作为唯一标识,存在Sheet里,链接里传这个ID更稳妥
内容的提问来源于stack exchange,提问作者Damon Lim
相关产品推荐
相关产品推荐

