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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 21:45:03