Получите два массива, сравните и удалите дубликаты в Google Apps Script - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть два списка в электронной таблице 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)

    }

Я запустил этот скрипт, но он не прошел. Два массива (existingCompanies и newCompanies) возвращаются правильно.

Однако сравнение между ними, похоже, не работает: оно всегда возвращает первый элемент массива newCompanies, независимо от того, существует ли он в existingCompanies.

Кроме того, я не уверен, как обеспечить, чтобы значения, введенные в array, не дублировались, если newCompanies содержит более одной записи, которой нет в existingCompanies.

Спасибо.

1 Ответ

0 голосов
/ 07 сентября 2018

Вы хотите получить элементы разности между existingCompanies и newCompanies. Если мое понимание вашего вопроса верно, как насчет этой модификации? Я думаю, что есть несколько решений для вашей ситуации. Поэтому, пожалуйста, подумайте об этом как об одном из них.

Очки модификации:

  • В случае, если ваш скрипт изменен, он выбирает элемент из newCompanies и проверяет, включен ли он в existingCompanies.
  • Если этот выбранный элемент не включен в existingCompanies, элемент помещается в array. В этой модификации я использовал true и false для проверки этого.

Этот поток повторяется до тех пор, пока все элементы в 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:

Как и другие модели, как насчет следующих 2 образцов? Стоимость процесса этих сценариев ниже, чем стоимость сценария, используемого для цикла.

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)

Если я неправильно понял ваш вопрос, пожалуйста, скажите мне. Я хотел бы изменить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...