使用 includes/indexOf 检查重复项在 Google App 脚本中不起作用
Checking for duplicates using includes/indexOf doesnt work in Google App Script
我正在尝试从新数据的范围(数组)中查找重复项,并在电子表格中将它们标记为重复项(当现有数据可从另一个范围获取时)。
但是,我的问题是将新数据与现有数据列表进行比较的条件不起作用。我用了 indexOf 和 includes 函数都没有用。
新数据示例(从记录器打印):
joNumRangeUploader:
77324,77320,77318,77341,77302,77267,76975,76576
现有列表示例数据(从记录器打印):
joNumRangeMMICS:
77123,77002,77020,77037,77041,77042,77125,75861,74869,74960,75971,76608,76508,77287,75192,75751,75397,75715,76609,76610,74910,74814,77158,75484,76358,75984,75932,75931,76940,76444,76682,76970,76910,76459,76974,76975,76576,
预期结果:
76975,76576 都应标记为重复项
实际结果:
但是,话又说回来,它们没有被标记,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();
let uniqueDataArray = new Array();
//go through joNumRangeUploader array and check for a duplicate; write to cell if duplicate
for(i=0; i < joNumRangeUploader.length; i++){
const dataToCheck = joNumRangeUploader[i][0];
let isUnique = true;
let fileSource = '';
//look for duplicates compating the dataToCheck to the 2 other indices
if(joNumRangeMMICS.includes(dataToCheck)){
fileSource = 'MMICS';
isUnique = false;
ui.alert("Duplicate found!"); //doesnt show in actual
}
else if(joNumRangeBAU.includes(dataToCheck) && isUnique === true){
fileSource = 'MASTERFILE';
isUnique = false;
ui.alert("Duplicate found!"); //doesnt show in actual
}
if (isUnique==true){
const pushRange = uploaderSheet.getRange((i+UploaderFirstDataRow),firstColUpload, 1, sourceColCount);
//push upload range to array
uniqueDataArray.push(pushRange.getValue());
//expected: Lx:ANx
}
else{
uploaderSheet.getRange( (i+UploaderFirstDataRow), statusCol, 1, 1).setValue("DUPLICATE " + fileSource);
}
}
这是因为当您声明 dataToCheck
时,您将其设置为 joNumRangeUploader[i][0]
,而不是您应该将其设置为 joNumRangeUploader[i]
,您正在尝试访问整数中的第一个元素将 return NaN
,joNumRangeMMICS
或 joNumRangeBAU
中不存在
解决方法:(原脚本)
感谢@Iamblichus,因为 getValues() 总是创建一个二维数组,所以展平现有列表数组完成了这项工作。
示例代码:
joNumRangeUploader = uploaderSheet.getRange(UploaderFirstDataRow,joNumColUploader,uploaderRowCount,1).getValues().flat()
选择:
感谢@Dmitry Kostyuk 建议包含公式,我已经成功了。我使用来自外部 SS 的查询创建了一个单独的 sheet,并在相同的价差 sheet.
中引用了该 sheet 的公式
使用的公式是:
=IF(IFNA(match($B13,Query!B:B,0),0)>0,"DUPLICATE FOUND","")
然后为了过滤不包含“DUPLICATE FOUND”的行,我使用了下面的代码并将其放入另一个数组中。
const uniqueDataArray = uploadRange.filter((data,i) => {
return duplicateStatusRangeData[i][0].includes("DUPLICATE FOUND")===false;
});
请注意,由于 Google sheets getValues() 函数的方式,duplicateStatusRangeData[i] !== "DUPLICATE FOUND" 不起作用为单列创建其数组,该列是 2D,[ [ ], [ ], [ ], ... ].
为了完整起见,我发布了您最初问题的解决方案(无法在两个数组之间找到重复项),即使您通过公式找到了解决方法。
问题:
joNumRangeUploader
和 joNumRangeMMICS
都是二维数组(getValues() returns),您将它们视为简单数组。
解决方案:
在调用 getValues()
之后使用 flat() 来获取简单数组:
const joNumRangeUploader = uploaderSheet.getRange(UploaderFirstDataRow,joNumColUploader,uploaderRowCount,1).getValues().flat();
const joNumRangeMMICS = mmicsSheet.getRange(2,joNumColSource,mmicsSheet.getLastRow(),1).getValues().flat();
我正在尝试从新数据的范围(数组)中查找重复项,并在电子表格中将它们标记为重复项(当现有数据可从另一个范围获取时)。
但是,我的问题是将新数据与现有数据列表进行比较的条件不起作用。我用了 indexOf 和 includes 函数都没有用。
新数据示例(从记录器打印):
joNumRangeUploader:
77324,77320,77318,77341,77302,77267,76975,76576
现有列表示例数据(从记录器打印):
joNumRangeMMICS:
77123,77002,77020,77037,77041,77042,77125,75861,74869,74960,75971,76608,76508,77287,75192,75751,75397,75715,76609,76610,74910,74814,77158,75484,76358,75984,75932,75931,76940,76444,76682,76970,76910,76459,76974,76975,76576,
预期结果:
76975,76576 都应标记为重复项
实际结果:
但是,话又说回来,它们没有被标记,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();
let uniqueDataArray = new Array();
//go through joNumRangeUploader array and check for a duplicate; write to cell if duplicate
for(i=0; i < joNumRangeUploader.length; i++){
const dataToCheck = joNumRangeUploader[i][0];
let isUnique = true;
let fileSource = '';
//look for duplicates compating the dataToCheck to the 2 other indices
if(joNumRangeMMICS.includes(dataToCheck)){
fileSource = 'MMICS';
isUnique = false;
ui.alert("Duplicate found!"); //doesnt show in actual
}
else if(joNumRangeBAU.includes(dataToCheck) && isUnique === true){
fileSource = 'MASTERFILE';
isUnique = false;
ui.alert("Duplicate found!"); //doesnt show in actual
}
if (isUnique==true){
const pushRange = uploaderSheet.getRange((i+UploaderFirstDataRow),firstColUpload, 1, sourceColCount);
//push upload range to array
uniqueDataArray.push(pushRange.getValue());
//expected: Lx:ANx
}
else{
uploaderSheet.getRange( (i+UploaderFirstDataRow), statusCol, 1, 1).setValue("DUPLICATE " + fileSource);
}
}
这是因为当您声明 dataToCheck
时,您将其设置为 joNumRangeUploader[i][0]
,而不是您应该将其设置为 joNumRangeUploader[i]
,您正在尝试访问整数中的第一个元素将 return NaN
,joNumRangeMMICS
或 joNumRangeBAU
解决方法:(原脚本)
感谢@Iamblichus,因为 getValues() 总是创建一个二维数组,所以展平现有列表数组完成了这项工作。
示例代码:
joNumRangeUploader = uploaderSheet.getRange(UploaderFirstDataRow,joNumColUploader,uploaderRowCount,1).getValues().flat()
选择:
感谢@Dmitry Kostyuk 建议包含公式,我已经成功了。我使用来自外部 SS 的查询创建了一个单独的 sheet,并在相同的价差 sheet.
中引用了该 sheet 的公式使用的公式是:
=IF(IFNA(match($B13,Query!B:B,0),0)>0,"DUPLICATE FOUND","")
然后为了过滤不包含“DUPLICATE FOUND”的行,我使用了下面的代码并将其放入另一个数组中。
const uniqueDataArray = uploadRange.filter((data,i) => {
return duplicateStatusRangeData[i][0].includes("DUPLICATE FOUND")===false;
});
请注意,由于 Google sheets getValues() 函数的方式,duplicateStatusRangeData[i] !== "DUPLICATE FOUND" 不起作用为单列创建其数组,该列是 2D,[ [ ], [ ], [ ], ... ].
为了完整起见,我发布了您最初问题的解决方案(无法在两个数组之间找到重复项),即使您通过公式找到了解决方法。
问题:
joNumRangeUploader
和 joNumRangeMMICS
都是二维数组(getValues() returns),您将它们视为简单数组。
解决方案:
在调用 getValues()
之后使用 flat() 来获取简单数组:
const joNumRangeUploader = uploaderSheet.getRange(UploaderFirstDataRow,joNumColUploader,uploaderRowCount,1).getValues().flat();
const joNumRangeMMICS = mmicsSheet.getRange(2,joNumColSource,mmicsSheet.getLastRow(),1).getValues().flat();