使用Google Apps Script编写库存自动提醒脚本遇到邮件发送异常问题
问题根源
你的代码核心问题是循环逻辑与变量作用域错误,具体如下:
- 遍历商品、遍历联系人的for循环结束后,
ItemName/ItemStock/Name/EmailAddress这些变量只会保留循环最后一行的取值 - 缺货判断和发邮件的逻辑写在了所有循环外面,全程只会执行1次,自然只能触发最后一个商品、最后一个联系人的邮件发送逻辑,甚至完全不触发
修正后可运行代码
function sendEmail() { var Spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var ContactSheet = Spreadsheet.getSheetByName('ContactSheet'); var ReorderSheet = Spreadsheet.getSheetByName('ReorderSheet'); var EmailSheet = Spreadsheet.getSheetByName('EmailSheet'); // 提前读取原始邮件模板,每次发邮件都从原始模板替换,避免占位符被覆盖失效 const originalSubject = EmailSheet.getRange(2,1).getValue(); const originalMessage = EmailSheet.getRange(2,2).getValue(); // 提前读取所有联系人存为数组,避免循环中重复读取工作表 const contactList = []; const contactLastRow = ContactSheet.getLastRow(); for(let j = 2; j <= contactLastRow; j++) { contactList.push({ name: ContactSheet.getRange(j,1).getValue(), email: ContactSheet.getRange(j,2).getValue() }) } // 逐行遍历商品,每一行单独判断是否需要补货 const reorderLastRow = ReorderSheet.getLastRow(); for(let i = 2; i <= reorderLastRow; i++) { const ItemName = ReorderSheet.getRange(i,1).getValue(); const ItemNumber = ReorderSheet.getRange(i,2).getValue(); const ItemManufacturer = ReorderSheet.getRange(i,3).getValue(); const ItemStock = ReorderSheet.getRange(i,4).getValue(); const ItemReorder = ReorderSheet.getRange(i,5).getValue(); // 缺货就给所有联系人发送对应商品的补货提醒 if (ItemStock < ItemReorder) { contactList.forEach(contact => { let finalSubject = originalSubject.replace("<item>",ItemName); let finalMessage = originalMessage.replace("<name>",contact.name) .replace("<item>",ItemName) .replace("<itemnumber>",ItemNumber) .replace("<manufacturer>",ItemManufacturer); MailApp.sendEmail(contact.email, finalSubject, finalMessage); }) } } }
额外优化建议
如果商品数据量超过50行,建议用getValues()批量读取整个工作表区域转为二维数组处理,减少脚本和工作表的交互次数,可大幅提升运行效率。
内容的提问来源于stack exchange,提问作者tbht
相关产品推荐
相关产品推荐

