使用 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 NaNjoNumRangeMMICSjoNumRangeBAU

中不存在

解决方法:(原脚本)

感谢@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,[ [ ], [ ], [ ], ... ].

为了完整起见,我发布了您最初问题的解决方案(无法在两个数组之间找到重复项),即使您通过公式找到了解决方法。

问题:

joNumRangeUploaderjoNumRangeMMICS 都是二维数组(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();