Google Apps Script数组匹配时if函数失效及循环条件问题求助
问题1:数组对比时IF条件不触发
你通过getValues()获取到的是二维数组,比如sourceProductID[i]的实际结构是["ID值"](一个包含单个元素的数组),而非直接的ID字符串/数值。用===对比两个数组对象时,即使内部元素相同,因对象引用不同也会判定为不相等,导致IF条件永远不成立。
解决办法:取数组的第一个元素进行对比,修改IF语句为:
if(destinationProductID[j][0] === sourceProductID[i][0]){ Logger.log("Product already in Inventory"); }
问题2:用sourceLastRow作为循环条件无日志,改用.length正常
原因分析
- sourceLastRow计算逻辑与实际数据不匹配:
你用sourceLastRow = sourceSheet.getLastRow()-1的前提是表头在第1行、数据从第2行开始,但如果出现以下情况,会导致循环范围错误:- 工作表第1行是空行(表头在第2行),此时
getLastRow()返回数据最后行号,减1后会比实际数据行数少,循环可能直接不执行; - 数据行存在空白行,
getLastRow()返回最后一个有内容的行号,减1后的值小于getRange实际获取的数组长度(getRange会按你指定的行数取值,哪怕中间有空白行)。
- 工作表第1行是空行(表头在第2行),此时
- 数组.length是可靠的遍历依据:
getValues()返回的数组长度,就是你通过getRange指定的行数(或实际存在的有效行数,取两者较小值),直接用它作为循环条件,能保证遍历到数组的所有元素。
解决办法
要么修正sourceLastRow的计算逻辑,确保和实际数据行数一致;要么直接用数组.length作为循环条件(更推荐,避免计算错误)。
如果表头确实在第1行,可修正sourceLastRow的计算:
var sourceLastRow = sourceSheet.getLastRow(); sourceLastRow = sourceLastRow >= 2 ? sourceLastRow - 1 : 0;
但更简单可靠的方式是直接使用sourceProductID.length,因为它直接对应你获取到的数组元素数量。
修正后的完整代码示例
function addStock() { var activeSpreadSheet = SpreadsheetApp.getActive(); var sourceSheet = activeSpreadSheet.getSheetByName('Stock Updater'); var destinationSheet = activeSpreadSheet.getSheetByName('Stock Record'); var sourceLastRow = sourceSheet.getLastRow()-1; var sourceProductID = sourceSheet.getRange(2,2,sourceLastRow,1).getValues(); var destinationLastRow = destinationSheet.getLastRow()-1; var destinationProductID = destinationSheet.getRange(2,2,destinationLastRow,1).getValues(); var i, j; // 使用数组.length作为循环条件 for(i=0;i<sourceProductID.length;i++){ Logger.log("SourceProductID: "+sourceProductID[i][0]); // 取数组第一个元素 for(j=0;j<destinationProductID.length;j++){ Logger.log("DestinationProductID:"+destinationProductID[j][0]); // 取数组第一个元素 if(destinationProductID[j][0] === sourceProductID[i][0]){ Logger.log("Product already in Inventory"); } } } for(a=0;a<5;a++){ for(b=0;b<5;b++){ if(a==b){ Logger.log("Match found"); } } } }
内容的提问来源于stack exchange,提问作者Bibek Bhattarai
相关产品推荐
相关产品推荐

