【问题标题】:Checking for duplicates using includes/indexOf doesnt work in Google App Script使用 include/indexOf 检查重复项在 Google App Script 中不起作用
【发布时间】:2021-08-25 07:16:40
【问题描述】:

我正在尝试从新数据的范围(数组)中查找重复项,并将它们标记为电子表格中的重复项,当现有数据可从另一个范围获得时。

但是,我的问题是,将新数据与现有数据列表进行比较的条件不起作用。我使用了 indexOf 并包含函数无济于事。

新数据示例(从 Logger 打印):

joNumRangeUploader:
77324,77320,77318,77341,77302,77267,76975,76576

现有列表示例数据(从 Logger 打印):

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);
    }
}

【问题讨论】:

  • 您使用应用程序脚本而不是公式或条件格式的任何原因?
  • 这可能是一种选择。我还没有这样做,但会尝试一下。要回答您的问题,主要原因是涉及到外部 google sheet。
  • 我看到您已经找到了另一个解决方案,但我认为最初的问题是 joNumRangeUploaderjoNumRangeMMICS 都是二维数组,您将它们视为简单数组(实际上您正在处理joNumRangeUploader 正确,但删除了第二个索引 [i][0] 因为另一个答案的建议 - 你不应该这样做)。无论如何,如果您在声明这两个数组时添加flat()(例如const joNumRangeUploader = uploaderSheet.getRange(UploaderFirstDataRow,joNumColUploader,uploaderRowCount,1).getValues().flat()),您的问题应该得到解决。
  • 此解决方案对您有用吗?在这种情况下,我会发布一个解释这一点的答案。
  • 嗨!这行得通!!!!将阵列展平将是最初的解决方案。不过,我有点喜欢通过简单的公式来减少脚本中的性能工作量。

标签: javascript google-apps-script google-sheets-api


【解决方案1】:

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

问题:

joNumRangeUploaderjoNumRangeMMICS 都是二维数组(getValues() 返回的内容),您将它们视为简单数组。

解决办法:

在调用getValues() 后使用flat() 来获取简单数组:

const joNumRangeUploader = uploaderSheet.getRange(UploaderFirstDataRow,joNumColUploader,uploaderRowCount,1).getValues().flat();
const joNumRangeMMICS    = mmicsSheet.getRange(2,joNumColSource,mmicsSheet.getLastRow(),1).getValues().flat();

【讨论】:

    【解决方案2】:

    这是因为当你声明dataToCheck 时你将它设置为joNumRangeUploader[i][0],而不是你应该将它设置为joNumRangeUploader[i],你试图访问一个整数中的第一个元素,它会返回NaN,它不会'不存在于joNumRangeMMICSjoNumRangeBAU

    【讨论】:

    • 我删除了 + 和 [0] 但它仍然不起作用。据我所知,Google 表格中的单个列范围有一个像这样的数组 [ [ ],[ ],[ ],[ ],[ ]...]
    • 这不是您在问题中所说的,但是..您可以尝试 console.log(dataToCheck) 以确保其实际值是多少
    【解决方案3】:

    解决方案:(原脚本)

    感谢@Iamblichus,扁平化现有列表数组完成了这项工作,因为 getValues() 总是创建一个二维数组。

    示例代码:

    joNumRangeUploader = uploaderSheet.getRange(UploaderFirstDataRow,joNumColUploader,uploaderRowCount,1).getValues().flat()
    

    替代方案:

    感谢@Dmitry Kostyuk 提出的包含公式的建议,我已经成功了。我使用来自外部 SS 的查询创建了一个单独的工作表,并在同一个电子表格中将公式引用到该工作表。

    使用的公式是:

    =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;
        });
    

    请注意,duplicateStatusRangeData[i] !== "DUPLICATE FOUND" 不起作用,因为 Google 表格 getValues() 函数如何为二维单列创建其数组,[ [ ] , [ ], [ ], ... ]。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 2017-12-31
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多