运行GAS函数时触发MailApp错误,求原因及解决方法
问题分析与修复方案
核心问题点
- 递归函数未正确调用:你写的
(fldr);是无效调用,应该是getFiles(fldr);,否则遍历文件夹的逻辑根本没执行。 - 附件数组格式错误:
values.join()会把二维数组里的所有元素(包括Blob对象)强制转为字符串,而MailApp.sendEmail的attachments参数需要的是Blob/File对象数组,不是字符串数组,这是触发错误的直接原因。 - Blob收集逻辑混乱:原代码试图把文件名替换成Blob,但二维数组的嵌套循环会导致重复匹配覆盖,且最后没有正确提取出所有Blob。
修正后的代码
var c = sheet.getRange(6,2,lastValue.length-5,1); var fldr = DriveApp.getFolderById(folderId); var values = c.getValues().flat(); // 把二维数组转成一维,方便后续匹配 var attachments = []; // 专门用来收集Blob的数组 // 递归遍历文件夹及子文件夹 var getFiles = function getFiles(folder) { // 先遍历子文件夹 var folders = folder.getFolders(); while(folders.hasNext()) { getFiles(folders.next()); } // 遍历当前文件夹的文件 var files = folder.getFiles(); while (files.hasNext()) { var f = files.next(); var fileName = f.getName(); // 检查当前文件名是否在目标列表里 if (values.includes(fileName.replace('.pdf', ''))) { attachments.push(f.getBlob()); } } }; // 正确调用递归函数 getFiles(fldr); // 发送邮件,直接传attachments数组 MailApp.sendEmail(emails, emailSubject, emailBody, {attachments: attachments});
关键优化说明
- 用
flat()把从Sheet获取的二维数组转成一维,简化文件名匹配逻辑 - 单独创建
attachments数组收集符合条件的Blob,避免原数组被污染 - 递归调用改为标准写法,确保所有子文件夹都被遍历到
- 匹配文件名时,先去掉
.pdf后缀再和Sheet里的内容对比,避免格式不一致导致匹配失败
内容的提问来源于stack exchange,提问作者half amused
相关产品推荐
相关产品推荐

