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

Google Apps Script采购单生成工具报错:Uncaught ReferenceError: Quantity is not defined 排查求助

解决Google Apps Script中Uncaught ReferenceError: quantity is not defined的问题

嗨,我看到你在开发采购单生成工具时遇到了这个引用错误,咱们直接拆解问题并修复:

错误根源

你遇到的Uncaught ReferenceError: quantity is not defined,核心问题出在createPO函数的这段代码里:

var totalPrice = quantity * unitPrice;

quantity和unitPrice是AddItem函数里的局部变量,createPO函数的作用域根本访问不到它们。而且这段计算逻辑的顺序也错了——你先给totalPO赋值了还未定义的subTotal,再声明subTotal,完全颠倒了。

修复方案

我们需要在createPO函数里重新读取QAR工作表中已添加的所有物品数据,循环计算每个物品的总价并累加得到小计。同时还要修复几个潜在的小问题(比如颜色值格式错误、未处理供应商未匹配的情况)。

以下是修复后的完整createPO函数:

function createPO() { 
  // 定义所有活动工作表
  var ss = SpreadsheetApp.getActiveSpreadsheet(); 
  var poSheet = ss.getSheetByName("QAR");
  var vendorSheet = ss.getSheetByName("VENDORS");
  var settingSheet = ss.getSheetByName("SETTINGS");
  var printSheet = ss.getSheetByName("PRINT QAR");

  // 获取基础数据
  var name = poSheet.getRange(6,2).getValue();
  var invoice_number = poSheet.getRange(7,2).getValue();
  var ship_date = poSheet.getRange(8,2).getValue();
  var ship_via = poSheet.getRange(9,2).getValue();
  var terms = poSheet.getRange(10,2).getValue();
  var ship_and_handle = poSheet.getRange(11,2).getValue();
  var po_number = settingSheet.getRange(1,2).getValue();
  var next_po_number = po_number + 1;
  settingSheet.getRange(1,2).setValue(next_po_number);

  // 初始化供应商字段,避免未找到匹配项时出现引用错误
  var companyName = "";
  var streetAddress = "";
  var city = "";
  var state = "";
  var zip = "";
  var phone_number = "";
  var email = "";
  var tax_rate = 0;

  // 获取供应商数据(优化:一次性读取所有数据,减少API调用次数)
  var vendorData = vendorSheet.getDataRange().getValues();
  for(var i = 1; i < vendorData.length; i++) { // 从第2行开始(数组索引为1)
    if(name == vendorData[i][0]) {
      companyName = vendorData[i][1];
      streetAddress = vendorData[i][2];
      city = vendorData[i][3];
      state = vendorData[i][4];
      zip = vendorData[i][5];
      phone_number = vendorData[i][6];
      email = vendorData[i][7];
      tax_rate = vendorData[i][8];
      break; // 找到匹配项后跳出循环,提升效率
    }
  }

  // 生成采购单日期
  var currentDate = new Date();
  var currentMonth = currentDate.getMonth()+1;
  var currentYear = currentDate.getFullYear();
  var date = `${currentMonth}/${currentDate.getDate()}/${currentYear}`;

  // 填充PRINT QAR工作表的基础信息
  printSheet.getRange('B19').setValue(name).setFontFamily('Roboto').setFontSize(10).setFontWeight("bold").setFontColor("#ce1212");
  printSheet.getRange('B20').setValue(companyName).setFontFamily('Roboto').setFontSize(10).setFontColor("#ce1212");
  printSheet.getRange('B21').setValue(streetAddress).setFontFamily('Roboto').setFontSize(10).setFontColor("#ce1212");
  printSheet.getRange('B22').setValue(`${city}, ${state} ${zip}`).setFontFamily('Roboto').setFontSize(10).setFontColor("#ce1212");
  printSheet.getRange('B23').setValue(phone_number).setFontFamily('Roboto').setFontSize(10).setFontColor("#ce1212");
  printSheet.getRange('B24').setValue(email).setFontFamily('Roboto').setFontSize(10).setFontColor("#ce1212");
  printSheet.getRange('B12').setValue(date).setFontFamily('Roboto').setFontSize(10).setFontColor("#ce1212");
  printSheet.getRange('D12').setValue(invoice_number).setFontFamily('Roboto').setFontSize(10).setFontColor("#ce1212");
  printSheet.getRange('F12').setValue(po_number).setFontFamily('Roboto').setFontSize(10).setFontColor("#ce1212");
  printSheet.getRange('B15').setValue(ship_date).setFontFamily('Roboto').setFontSize(10).setFontColor("#ce1212");
  // 修复颜色值格式错误:原"3e01b84"改为标准十六进制格式"#3e01b8"
  printSheet.getRange('D15').setValue(ship_via).setFontFamily('Roboto').setFontSize(10).setFontColor("#3e01b8");
  printSheet.getRange('F15').setValue(terms).setFontFamily('Roboto').setFontSize(10).setFontColor("#3e01b8");
  printSheet.getRange('H28').setValue(ship_and_handle).setFontFamily('Roboto').setFontSize(10).setFontColor("#ce1212");
  printSheet.getRange('H29').setValue(tax_rate).setFontFamily('Roboto').setFontSize(10).setFontColor("#ce1212");

  // 计算采购单总价(假设物品从QAR工作表第16行开始,C列是数量,D列是单价)
  var subTotal = 0;
  var lastItemRow = poSheet.getLastRow();
  if(lastItemRow >= 16) { // 确保存在物品行
    var itemsRange = poSheet.getRange(16, 1, lastItemRow - 15, 4);
    var itemsData = itemsRange.getValues();
    
    itemsData.forEach(function(row) {
      var quantity = row[2];
      var unitCost = row[3];
      if(quantity && unitCost) { // 跳过空行或无效数据
        subTotal += quantity * unitCost;
      }
    });
  }
  var totalPO = subTotal;

  // 调用采购单日志函数
  POLog(po_number, name, date, ship_date, totalPO)
}

额外优化说明

  1. 提升运行效率:把多次getRange读取供应商数据改成一次性读取getDataRange,减少Google Apps Script的API调用次数(平台对调用次数有配额限制)。
  2. 避免新的引用错误:初始化供应商字段为空值/默认值,防止找不到匹配供应商时出现新的错误。
  3. 修复格式错误:把错误的颜色值"3e01b84"修正为标准十六进制格式"#3e01b8"。
  4. 代码可读性优化:用模板字符串替代字符串拼接,让日期和地址的格式化更简洁。

其他检查点

  • 确认QAR工作表中物品的起始行是第16行,如果你的实际起始行不同,修改getRange(16, 1, ...)里的16为对应行号。
  • AddItem函数里如果未找到匹配的part,description和unitCost也会未定义,可以参考上面的方式初始化这两个变量,避免添加物品时出错。

内容的提问来源于stack exchange,提问作者Drewgoodwin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 20:28:14