如何修改Google Apps Script实现表单提交者Gmail创建邮件草稿?
问题分析
你的脚本当前使用Google Forms的onFormSubmit触发器,这个触发器以表单所有者的账户权限在服务器端运行,所以调用GmailApp.createDraft时,操作的始终是你的Gmail账户,而非提交表单的用户账户。要实现草稿创建在用户自己的邮箱,必须让脚本获得用户的OAuth授权,在用户的上下文环境中执行。
解决方案
我们需要调整流程,让提交表单的用户主动触发授权流程,在自己的账户下运行脚本。具体步骤如下:
1. 配置OAuth权限范围
打开脚本编辑器的appsscript.json文件(如果没显示,点击「查看」→「显示清单文件」),添加必要的权限:
{ "oauthScopes": [ "https://www.googleapis.com/auth/gmail.compose", "https://www.googleapis.com/auth/drive.readonly", "https://www.googleapis.com/auth/forms.currentonly" ] }
2. 修改脚本代码
更新脚本,添加Web App入口函数,让用户可以通过链接触发草稿创建逻辑:
// Web App入口,处理用户的GET请求 function doGet(e) { // 从URL参数中获取表单提交的内容 var headerContent = e.parameter.header; var replyToEmail = e.parameter.replyTo; // 参数校验 if (!headerContent || !replyToEmail) { return ContentService.createTextOutput("错误:缺少必要的参数"); } try { // 创建草稿 createDraft(headerContent, replyToEmail); return ContentService.createTextOutput("成功!邮件草稿已创建在你的Gmail账户中"); } catch (err) { return ContentService.createTextOutput("创建失败:" + err.message); } } // 保留原有的草稿创建逻辑 function createDraft(headerContent, replyToEmail) { var officeEmailTemplate = getHTMLFromDrive(); officeEmailTemplate = officeEmailTemplate.replace('$$$BODY_REPLACE', "<enter message body here>"); officeEmailTemplate = officeEmailTemplate.replace('$$$TITLE_REPLACE', headerContent); GmailApp.createDraft('', '', '', { htmlBody: officeEmailTemplate, replyTo: replyToEmail }); } // 保留原有的模板读取逻辑 function getHTMLFromDrive() { var fileId = 'my-google-drive-template-ID'; // 替换为你的模板文件ID var file = DriveApp.getFileById(fileId); var htmlContent = file.getBlob().getDataAsString(); return htmlContent; } // 表单提交后,给用户发送包含创建链接的邮件 function onFormSubmit(e) { var formResponses = e.response.getItemResponses(); var headerContent = ''; var replyToEmail = ''; for (var i = 0; i < formResponses.length; i++) { var itemResponse = formResponses[i]; var questionTitle = itemResponse.getItem().getTitle(); if (questionTitle === 'Header content') { headerContent = encodeURIComponent(itemResponse.getResponse()); } else if (questionTitle === 'Reply to email address') { replyToEmail = encodeURIComponent(itemResponse.getResponse()); } } // 替换为你的Web App部署地址 var webAppUrl = "https://script.google.com/macros/s/你的Web App ID/exec?header=" + headerContent + "&replyTo=" + replyToEmail; // 给提交表单的用户发送邮件,引导创建草稿 GmailApp.sendEmail( e.response.getRespondentEmail(), "请创建你的邮件草稿", "点击下方链接完成授权并创建草稿:\n" + webAppUrl ); }
3. 部署为Web App
- 在脚本编辑器中,点击「部署」→「新部署」。
- 类型选择「Web应用」。
- 执行方式选择「以访问该Web应用的用户身份执行」(这是核心,确保脚本用用户的权限运行)。
- 访问权限选择「任何人,甚至匿名」(如果是域内使用,可选择「组织内任何人」)。
- 点击部署,复制生成的Web App URL,替换到
onFormSubmit函数中的webAppUrl变量。
4. 调整模板文件权限
确保你的HTML模板文件在Google Drive中的权限设置为**「任何人可查看」**,否则用户无法读取模板内容。
5. 测试流程
用户提交表单后,会收到一封包含链接的邮件,点击链接后会跳转到授权页面,授权完成后脚本会在用户的账户下创建邮件草稿,最终草稿会出现在用户自己的Gmail草稿箱中。
内容的提问来源于stack exchange,提问作者Riccardo
相关产品推荐
相关产品推荐

