求助:Google Apps Script邮件自动化脚本报错及功能实现问题
问题与解决方案
错误原因分析
你代码第13行报错,是因为folderId填的是文件夹名称「TestFolder」,但DriveApp.getFolderById()需要的是Google Drive文件夹的唯一ID,不是名称。文件夹ID是Drive地址栏里folders/后面的一串字符,比如https://drive.google.com/drive/folders/123abcXYZ...中的123abcXYZ...。
匹配需求的修正代码
以下代码完全实现你要的自动化功能:Drive上传符合格式的文件时自动触发,匹配文件名前8位与Sheet「代码」列,发送带附件的邮件。
// 触发函数:当监控文件夹有文件新增时自动运行 function onFileUpload(e) { // 配置参数:替换成你的实际信息 const CONFIG = { folderId: "替换成你的监控文件夹ID", // 必须填文件夹唯一ID,不是名称 sheetName: "RecipientList", // 你的收件人列表Sheet名称 emailSubject: "新文件已上传", emailMessage: "对应你的文件已上传,附件为该文件。" }; // 仅处理新增文件 const file = e; if (!file || file.changeType !== "add") return; const fileName = file.name; // 提取文件名前8位代码,检查格式是否符合要求 const fileCode = fileName.substring(0, 8); if (!/^[A-Za-z0-9]{8}_/.test(fileName)) return; // 读取Sheet数据,构建「代码→邮箱」的映射表 const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(CONFIG.sheetName); const data = sheet.getDataRange().getValues(); const codeToEmail = {}; // 假设Sheet第1列是「代码」,第2列是「邮箱地址」;若列位置不同,修改索引(0对应第1列,1对应第2列) for (let i = 1; i < data.length; i++) { // 跳过表头行 const code = data[i][0].toString().trim(); const email = data[i][1].toString().trim(); if (code && email) codeToEmail[code] = email; } // 匹配代码并发送带附件的邮件 if (codeToEmail[fileCode]) { const targetEmail = codeToEmail[fileCode]; const driveFile = DriveApp.getFileById(file.id); GmailApp.sendEmail( targetEmail, CONFIG.emailSubject, CONFIG.emailMessage, { attachments: [driveFile] } ); } }
使用步骤
- 获取文件夹ID:打开要监控的Drive文件夹,复制地址栏中
folders/后面的字符,替换代码里的folderId值。 - 适配Sheet列:确保Sheet第1列是「代码」(8位字符),第2列是「邮箱地址」;如果列位置不同,修改代码中
data[i][0]和data[i][1]的索引。 - 设置自动触发器:
- 打开脚本编辑器,点击左侧「触发器」图标
- 点击「添加触发器」,配置如下:
- 选择函数:
onFileUpload - 选择事件源:「从Drive」
- 选择事件类型:「文件创建」
- 保存并完成权限授权
- 选择函数:
额外说明
- 脚本只会处理文件名以「8位字母数字+下划线」开头的文件(如
ABC12345_RestoftheFilename.pdf),不符合格式的文件会自动跳过。 - 首次运行需要授权Google Workspace相关权限,按页面提示操作即可。
内容的提问来源于stack exchange,提问作者Sellie42
相关产品推荐
相关产品推荐

