如何修改Google Apps Script使多附件名匹配对应单元格值?
问题解决:为邮件附件设置对应工作表的单元格名称
问题场景
发送带多附件的邮件时,两个附件名称完全相同。虽然工作表HANG III,IV-Q.1和HANG II-Q.1的I6单元格值不同,但最终只有HANG II-Q.1对应的附件名是正确的,需要让每个附件名称对应各自工作表的I6单元格值。
原代码问题分析
在forEach循环中,连续两次给name变量赋值,第二次的赋值直接覆盖了第一次,导致无论处理哪个工作表的导出链接,附件名都会被设置为HANG II-Q.1的I6值。此外,MailApp.sendEmail(message)语句写在了sendtwo函数外部,会导致执行报错。
修改后的代码
function sendtwo() { const ss = SpreadsheetApp.getActiveSpreadsheet(); // 关联工作表名称与对应的导出URL const sheetUrlPairs = [ { sheetName: "HANG III,IV-Q.1", url: `https://docs.google.com/spreadsheets/d/${ss.getId()}/export?format=xlsx&gid=${ss.getSheetByName("HANG III,IV-Q.1").getSheetId()}` }, { sheetName: "HANG II-Q.1", url: `https://docs.google.com/spreadsheets/d/${ss.getId()}/export?format=xlsx&gid=${ss.getSheetByName("HANG II-Q.1").getSheetId()}` } ]; const urlA = []; sheetUrlPairs.forEach(pair => { const params = { method: "GET", headers: { authorization: `Bearer ${ScriptApp.getOAuthToken()}` } }; // 根据当前工作表名称获取对应I6单元格值作为附件名 const name = `${ss.getSheetByName(pair.sheetName).getRange('I6').getValue()}.xlsx`; urlA.push(UrlFetchApp.fetch(pair.url, params).getBlob().setName(name)); }); const date = Utilities.formatDate(new Date(), "GMT+7", "dd-MM-yyyy") const message = { to: "example@gmail.com", subject: `Example Subject ${date}`, body: "Lorem ipsum...", name: "Example Name", attachments: urlA }; // 将邮件发送逻辑移至函数内部 MailApp.sendEmail(message); } function onOpen() { const ui = SpreadsheetApp.getUi(); ui.createMenu("Example Menu").addItem("Example Item", "sendtwo").addToUi(); }
关键修改点
- 将工作表名称和导出URL封装为对象数组,明确两者对应关系
- 循环时根据当前对象的
sheetName获取对应I6单元格值,避免变量覆盖 - 把
MailApp.sendEmail(message)移动到sendtwo函数内部,确保能正确读取message并执行发送
内容的提问来源于stack exchange,提问作者English for kids
相关产品推荐
相关产品推荐

