Google Apps Script中使用includes/indexOf做重复校验失效问题求助
问题根因
- Google Apps Script 中
Range.getValues()返回的是二维数组,结构为[[行1列1值], [行2列1值], ...],你直接对二维数组调用includes(单个值),是在判断数组中是否有和这个值全等的元素,而数组里的元素都是一维数组,永远不可能和数字/字符串全等,所以判断永远不生效。 - 还可能存在数据类型不一致的问题,比如单元格里的值是字符串格式的数字,和你比对的数字类型不一样,也会导致全等判断失败。
修复方案
//get values into array const joNumRangeUploader = uploaderSheet.getRange(UploaderFirstDataRow,joNumColUploader,uploaderRowCount,1).getValues(); const joNumRangeMMICS = mmicsSheet.getRange(2,joNumColSource,mmicsSheet.getLastRow(),1).getValues(); const joNumRangeBAU = bauSheet.getRange(2,joNumColSource,bauSheet.getLastRow(),1).getValues(); // 把二维数组拍平为一维Set,统一转成字符串格式避免类型差异导致匹配失败 const mmicsSet = new Set(joNumRangeMMICS.flat().map(item => String(item))); const bauSet = new Set(joNumRangeBAU.flat().map(item => String(item))); let uniqueDataArray = new Array(); //遍历新数据检查重复,重复则标记单元格 for(i=0; i < joNumRangeUploader.length; i++){ const dataToCheck = String(joNumRangeUploader[i][0]); // 统一转成字符串比对 let isUnique = true; let fileSource = ''; if(mmicsSet.has(dataToCheck)){ fileSource = 'MMICS'; isUnique = false; ui.alert("Duplicate found!"); } else if(bauSet.has(dataToCheck)){ fileSource = 'MASTERFILE'; isUnique = false; ui.alert("Duplicate found!"); } if (isUnique){ const pushRange = uploaderSheet.getRange((i+UploaderFirstDataRow),firstColUpload, 1, sourceColCount); uniqueDataArray.push(pushRange.getValue()); } else{ uploaderSheet.getRange( (i+UploaderFirstDataRow), statusCol, 1, 1).setValue("DUPLICATE " + fileSource); } }
补充说明
Array.flat()可以把二维数组降为一维,直接拿到所有单元格的原始值- 统一转成字符串是为了避免单元格格式导致的类型差异,比如有的单元格是数字格式
76975,有的是字符串格式"76975",直接全等判断会不匹配 - 用
Set存储比对库,查询时间复杂度是O(1),相比每次用includes遍历数组的O(n),数据量越大性能优势越明显
内容的提问来源于stack exchange,提问作者plaridel1
相关产品推荐
相关产品推荐

