获取两个数组,比较并删除Google Apps脚本中的重复项

时间:2018-09-07 06:04:21

标签: arrays google-apps-script comparison

我在Google电子表格上有两个列表:“现有公司”和“新公司”。 我想将两者进行比较,找出“现有公司”中不存在“新公司”中的哪些唯一条目,获取这些条目并从“新公司”中删除所有其他条目。

我已经编写了以下脚本:

function grabNewCompanies() {

  // grab existing companies list from sheet into an array
  var sh = SpreadsheetApp.openById("sheetID").getSheetByName("sheetName")
  var row = sh.getDataRange().getLastRow()
  var existingCompanies = sh.getRange(2,1,row - 1,1).getValues()
  Logger.log(existingCompanies)

//grab new companies added
  var sh = SpreadsheetApp.openById("sheetID").getSheetByName("sheetName")
  var row = sh.getDataRange().getLastRow()
  var newCompanies = sh.getRange(2,4,row - 1, 1).getValues()
  Logger.log(newCompanies)

  var array = [];  
  for(i=0; i<newCompanies.length; i++) {
    for(j=0; j<existingCompanies.length; j++) {
      if(newCompanies[i][0] !== existingCompanies[j][0]) {
      array.push([newCompanies[i][0]]);
}

Logger.log(array)

    }

我已经运行了该脚本,但是失败了。 正确返回了两个数组(existingCompaniesnewCompanies)。

但是,两者之间的比较似乎不起作用:它总是返回newCompanies数组的第一个元素,无论它是否存在于existingCompanies中。

此外,如果array包含多个newCompanies中不存在的条目,我不确定如何确保推入existingCompanies的值不重复。

谢谢。

1 个答案:

答案 0 :(得分:1)

您要检索existingCompaniesnewCompanies之间的差异元素。如果我对您的问题的理解是正确的,那么此修改如何?我认为针对您的情况有几种解决方案。因此,请将此视为其中之一。

修改点:

  • 如果脚本被修改,它将从newCompanies中选取一个元素,并检查该元素是否包含在existingCompanies中。
  • 如果该选择的元素未包含在existingCompanies中,则将该元素推入array。在此修改中,我使用truefalse进行了检查。

重复此流程,直到检查newCompanies中的所有元素为止。

修改后的脚本1:

修改脚本后,如何处理?

从:
var array = [];  
for(i=0; i<newCompanies.length; i++) {
  for(j=0; j<existingCompanies.length; j++) {
    if(newCompanies[i][0] !== existingCompanies[j][0]) {
      array.push([newCompanies[i][0]]);
    }
  }
}
至:
var array = [];
for(i=0; i<newCompanies.length; i++) {
  var temp = false; // Added
  for(j=0; j<existingCompanies.length; j++) {
    if(newCompanies[i][0] === existingCompanies[j][0]) { // Modified
      temp = true; // Added
      break; // Added
    }
  }
  if (!temp) array.push([newCompanies[i][0]]); // Modified
}
Logger.log(array)

修改后的脚本2:

与其他模式一样,以下两个示例如何?这些脚本的处理成本低于使用for循环的脚本。

var array = newCompanies.filter(function(e) {return existingCompanies.filter(function(f) {return f[0] == e[0]}).length == 0});
Logger.log(array)

var array = newCompanies.filter(function(e) {return !existingCompanies.some(function(f) {return f[0] == e[0]})});
Logger.log(array)

如果我误解了您的问题,请告诉我。我想修改它。