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) }
额外优化说明
- 提升运行效率:把多次
getRange读取供应商数据改成一次性读取getDataRange,减少Google Apps Script的API调用次数(平台对调用次数有配额限制)。 - 避免新的引用错误:初始化供应商字段为空值/默认值,防止找不到匹配供应商时出现新的错误。
- 修复格式错误:把错误的颜色值
"3e01b84"修正为标准十六进制格式"#3e01b8"。 - 代码可读性优化:用模板字符串替代字符串拼接,让日期和地址的格式化更简洁。
其他检查点
- 确认QAR工作表中物品的起始行是第16行,如果你的实际起始行不同,修改
getRange(16, 1, ...)里的16为对应行号。 AddItem函数里如果未找到匹配的part,description和unitCost也会未定义,可以参考上面的方式初始化这两个变量,避免添加物品时出错。
内容的提问来源于stack exchange,提问作者Drewgoodwin
相关产品推荐
相关产品推荐

