【问题标题】:Why is this comparison not working, using google aps scripts?为什么这种比较不起作用,使用谷歌应用程序脚本?
【发布时间】:2021-02-26 01:53:33
【问题描述】:

下面的代码没有给我预期的结果。
这是比较两个范围的行,虽然第二个范围的最后一行等于第一个范围的行,但它给我的结果是 false。

var entryValuesCom = sheet.getRange(7, 1, LastRowSource, 9).getValues();
var dbDataCom = dbSheet.getRange(2, 1, dbSheet.getLastRow(), 9).getValues();
var entryVlArray = new Array();
var dbArray = new Array();

for (var r = 0; r < entryValuesCom.length; r++) {
  if (entryValuesCom[r][0] != '' && entryValuesCom[r][5] != 'Daily Ledger Bal') {
    entryVlArray.push(entryValuesCom[r]);
  }
}
for (var a = 0; a < dbDataCom.length; a++) {
  if (dbDataCom[a][1] != '' && dbDataCom[a][8] == bank) {
    dbArray.push(dbDataCom[a]);
  }
}
var duplicate = false;
loop1:
for (var x = 0; x < entryVlArray.length; x++) {
  loop2:
  for (var j = 0; j < dbArray.length; j++) {
    if (JSON.stringify(entryVlArray) == JSON.stringify(dbArray)) {
      duplicate = true;
      break loop1;
    }
  }
}

以下是阵列如何出现的快照:

我已经尝试使用.join(),但仍然... 这是针对数千行的,所以这会在性能方面做得很好吗?

【问题讨论】:

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


【解决方案1】:

我相信你的目标如下。

  • 您想使用 Google Apps 脚本比较 entryVlArraydbArray 的数组。
  • entryVlArraydbArray之间存在重复行时,您要输出duplicate = true

修改点:

  • 当您的脚本被修改时,在if (JSON.stringify(entryVlArray) == JSON.stringify(dbArray)) {,所有的二维数组都会被比较。我认为这可能是您的问题的原因。从您的脚本中,我认为需要比较二维数组中的每个元素。

当以上几点反映到你的脚本中时,它变成如下。

修改脚本:

从:
var duplicate = false;
loop1:
for (var x = 0; x < entryVlArray.length; x++) {
  loop2:
  for (var j = 0; j < dbArray.length; j++) {
    if (JSON.stringify(entryVlArray) == JSON.stringify(dbArray)) {
      duplicate = true;
      break loop1;
    }
  }
}
到:
var duplicate = false;
for (var x = 0; x < entryVlArray.length; x++) {
  for (var j = 0; j < dbArray.length; j++) {
    if (JSON.stringify(entryVlArray[x]) == JSON.stringify(dbArray[j])) {
      duplicate = true;
      break;
    }
  }
}
console.log(duplicate)
  • 通过本次修改,当二维数组中的每个元素(一维数组)相同时,duplicate变为true

注意:

  • 作为其他方法,当准备一个用于搜索每个行值的对象时,我认为处理成本可能会降低一点。在这种情况下,脚本如下。请进行如下修改。

    • 发件人:

        var duplicate = false;
        loop1:
        for (var x = 0; x < entryVlArray.length; x++) {
          loop2:
          for (var j = 0; j < dbArray.length; j++) {
            if (JSON.stringify(entryVlArray) == JSON.stringify(dbArray)) {
              duplicate = true;
              break loop1;
            }
          }
        }
      
    • 收件人:

        var obj = entryVlArray.reduce((o, e) => Object.assign(o, {[JSON.stringify(e)]: true}), {});
        var duplicate = dbArray.some(e => obj[JSON.stringify(e)]);
      

参考资料:

补充:

关于your following 2nd question

太棒了!!!!有没有办法在弹出窗口中捕获这些重复项,使用 reduce() 和 some()?

当你想检索重复的行时,下面的脚本怎么样?在这种情况下,我认为filter()some() 有用。

修改脚本:

var obj = entryVlArray.reduce((o, e) => Object.assign(o, {[JSON.stringify(e)]: true}), {});
// var duplicate = dbArray.some(e => obj[JSON.stringify(e)]);
var duplicatedRows = dbArray.filter(e => obj[JSON.stringify(e)]);
console.log(duplicatedRows)
  • 在这个修改后的脚本中,您可以在日志中看到重复的行。

  • 关于a pop up,如果你想打开一个包含重复行的对话框,在var duplicatedRows = dbArray.filter(e =&gt; obj[JSON.stringify(e)]);这一行之后添加以下脚本如何?

      Browser.msgBox(JSON.stringify(duplicatedRows));
    

【讨论】:

  • 太棒了!!!!有没有办法在弹出窗口中捕获这些重复项,使用 reduce() 和 some()?
  • @Antonio Santos 感谢您的回复。我很高兴你的问题得到了解决。关于您的第二个问题,我又添加了一个示例脚本作为答案。你能确认一下吗?如果这不是您期望的方向,我深表歉意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-09
相关资源
最近更新 更多