Google表单提交后自动发送指定文件夹附件至邮箱的脚本问题
解决方案:Google表单提交时自动发送指定文件夹内的所有PDF附件
嘿,这个需求完全可以实现!咱们先拆解你现有代码里的几个关键问题,再给你调整后的完整脚本:
现有代码的核心问题
- 变量作用域错误:你在
for循环里给intakenumber和emailaddress赋值,但循环结束后这两个变量只会保留最后一行的数据,而且邮件发送逻辑放在while循环里,会导致每个文件单独发一封邮件,不是把所有附件合并发送 - 文件夹查找局限:
getFolderByName()只会在脚本有权限访问的根目录里查找,如果你的目标文件夹在子目录中,就会找不到;而且如果有重名文件夹,它只会返回第一个匹配的,容易出错 - 冗余代码:
var attachment = (attachments)这一行完全没有作用,属于无效代码
修正后的完整脚本
function onFormSubmit(e) { // 从表单提交事件中获取输入值 var emailAddress = e.namedValues["email"][0]; var intakeNumber = e.namedValues["intake number"][0]; // 搜索整个Drive中名称匹配intake number的文件夹(支持子目录) var folders = DriveApp.searchFolders("title='" + intakeNumber + "'"); if (!folders.hasNext()) { Logger.log("未找到名称为" + intakeNumber + "的文件夹"); return; } var targetFolder = folders.next(); var pdfFiles = targetFolder.getFilesByType(MimeType.PDF); var attachments = []; // 收集文件夹内所有PDF文件作为附件 while (pdfFiles.hasNext()) { var file = pdfFiles.next(); attachments.push(file); // 直接推文件对象,无需转格式 Logger.log("已添加附件:" + file.getName()); } if (attachments.length === 0) { Logger.log("文件夹" + intakeNumber + "中没有PDF文件"); return; } // 发送邮件 var subject = "你的文档已送达"; var message = "您好,以下是对应intake number的所有文档附件,请查收。"; MailApp.sendEmail({ to: emailAddress, subject: subject, body: message, attachments: attachments }); Logger.log("邮件已成功发送至:" + emailAddress); }
关键改进说明
- 使用表单提交触发事件:改用
onFormSubmit(e)作为函数名,直接绑定Google表单的「提交时」触发器,不需要手动读取表格数据(避免表格行数错误的问题) - 更可靠的文件夹搜索:用
DriveApp.searchFolders()替代getFolderByName(),可以搜索整个Drive的所有文件夹(包括子目录),而且通过精确匹配标题避免重名问题 - 正确的附件收集逻辑:把邮件发送放在
while循环之外,确保每个收件人只收到一封包含所有PDF附件的邮件 - 错误处理:增加了文件夹不存在、文件夹内无PDF文件的判断,避免脚本崩溃,同时通过日志记录关键状态
配置步骤
- 打开你的Google表单对应的响应表格
- 点击顶部菜单「扩展程序」→「Apps脚本」
- 替换原有代码为上面的脚本
- 点击左侧「触发器」图标,添加一个新触发器:
- 选择函数:
onFormSubmit - 选择事件源:「表单提交」
- 选择事件类型:「来自表单的提交」
- 选择函数:
- 保存并授权脚本权限(首次运行需要授权)
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

