You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行GAS函数时触发MailApp错误,求原因及解决方法

问题分析与修复方案

核心问题点

  1. 递归函数未正确调用:你写的(fldr);是无效调用,应该是getFiles(fldr);,否则遍历文件夹的逻辑根本没执行。
  2. 附件数组格式错误:values.join()会把二维数组里的所有元素(包括Blob对象)强制转为字符串,而MailApp.sendEmail的attachments参数需要的是Blob/File对象数组,不是字符串数组,这是触发错误的直接原因。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 18:01:06