如何通过Google Apps Script在邮件中添加按钮并将响应回传到Google Sheet
问题原因说明
所有主流邮件客户端都默认禁用HTML邮件内嵌的JavaScript代码,你给按钮绑定的onclick事件根本不会被执行,这是邮件客户端的通用安全限制,无法绕过。
可落地解决方案
你可以通过「Web App + 带参数的链接按钮」实现需求,具体步骤如下:
步骤1:新增Web App入口函数、修改写入逻辑
在你的.gs文件中新增doGet函数(Web App的固定入口),同时修改原来的响应写入逻辑,支持通过唯一ID定位要写入的行:
// Web App入口,接收用户点击按钮的请求 function doGet(e) { // 从URL参数中提取用户选择的结果、对应记录的唯一ID const userResponse = e.parameter.response === 'true'; const recordId = e.parameter.recordId; // 写入表格 writeResponseToSheet(userResponse, recordId); // 给用户返回提交成功的反馈页 return HtmlService.createHtmlOutput('<h3>提交成功,感谢你的反馈!</h3>'); } // 替换原来的myFunction,支持根据recordId定位写入位置 function writeResponseToSheet(response, recordId) { const ss = SpreadsheetApp.openById("替换为你的表格ID"); const trackingSheet = ss.getSheetByName('Tracking'); // 示例:你可以提前把每个提交记录的唯一ID存在A列,此处根据recordId匹配对应行 // const targetRow = trackingSheet.getRange("A:A").getValues().findIndex(row => row[0] == recordId) + 1; // 如果暂时不需要匹配,也可以保留你原来的固定单元格逻辑 const targetCell = trackingSheet.getRange("I12"); targetCell.setValue(response ? "Yes!" : "No"); }
步骤2:部署Web App获取访问地址
- 打开Apps Script项目,点击右上角「部署」->「新建部署」
- 点击设置图标选择「Web应用」
- 「执行身份」选择「我(你的账号邮箱)」
- 「有权访问的人」选择「任何人,甚至匿名用户」
- 点击部署,完成权限授权后复制生成的Web App访问地址,格式类似
https://script.google.com/macros/s/xxxx/exec
步骤3:修改邮件模板,把按钮替换为带参数的链接
修改checkIN.html,把原生button换成样式模拟成按钮的超链接,点击后直接跳转到Web App地址并携带参数:
<!DOCTYPE html> <html> <head> <base target="_top"> <style> .btn { color: white; width: 250px; padding: 15px 32px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; border-radius: 4px; } .btn-yes { background-color: #4CAF50; } .btn-no { background-color: #f44336; } </style> </head> <body> <p style="font-size:150%;">Good afternoon,<br><br> Yesterday you assigned <?= info.name ?> to academic recovery for <?= info.subject?>.<br> Did the student complete the assignment?</p> <!-- 替换href里的Web App地址为你自己部署的地址 --> <a href="https://script.google.com/macros/s/你的WebAppID/exec?response=true&recordId=<?= info.recordId ?>" class="btn btn-yes"> 是 </a> <a href="https://script.google.com/macros/s/你的WebAppID/exec?response=false&recordId=<?= info.recordId ?>" class="btn btn-no"> 否 </a> </body> </html>
步骤4:修改发件逻辑,携带记录ID
发邮件时给info对象加上recordId字段,用来定位对应用户的提交记录:
function emailTest() { var infoDict = { name: "Teacher", subject: "Computer Science", recordId: "123" // 替换为对应记录的唯一ID,可以是表单提交时间戳、自增ID等 }; sendEmail(infoDict); }
注意事项
- 修改Web App代码后需要重新部署新版本,否则修改不会生效
- 如果需要防止恶意提交,可以给参数加简单的签名校验,普通场景不需要额外处理
内容的提问来源于stack exchange,提问作者Teed Ferguson
相关产品推荐
相关产品推荐

