как вернуть значения из списка, которых нет в другом списке, с помощью скрипта Google - PullRequest
2 голосов
/ 14 июля 2020

У меня два списка. Первый список содержит имена всех текущих сотрудников, а второй список содержит имена всех нынешних и прошлых сотрудников.

Мне нужно разработать сценарий, который возвращает все прошлые имена с информацией, связанной с ними во втором списке. Я написал этот код, который сопоставляет все текущие имена с их текущей информацией, но не могу понять, как сделать обратное.

function current(){

  var app = SpreadsheetApp;
 
 var activeSheet = app.getActiveSpreadsheet();

  var issued = app.getActiveSpreadsheet().getSheetByName("Issued");

  var waiting = app.getActiveSpreadsheet().getSheetByName("Waiting for Inventory");

  var active = app.getActiveSpreadsheet().getSheetByName("Active Officers");
  
 for (var j = 2; j<100; j++){ 
  
  var officer = issued.getRange(j,11).getValue();
 
  for(var i = 2; i<70; i++){ 

    var officerList = active.getRange(i, 2).getValue();

     if (officer === ""){
       continue; 
      }

     if (officer === officerList){
      var rowInfo = issued.getRange(j,1,1,12).getValues();
      var lastrow = waiting.getLastRow();
      waiting.getRange(lastrow+1,1,1,12).setValues(rowInfo);
      }
    }
  }
}

1 Ответ

0 голосов
/ 14 июля 2020

Самый простой способ узнать о существовании строки в массиве - использовать indexOf()

  • Он вернет вам -1, если значения не найдены
  • Получить всех офицеров из active и преобразовать значения в массив 1D с помощью flat ()
  • Получить всех офицеров из issued с помощью getValues ( более эффективен, чем несколько запросов с getValue и l oop через них
  • Для этой настройки нужен только один for l oop вместо двух, что значительно ускорит ваш код

Пример:

function current(){
  
  var app = SpreadsheetApp;
  
  var activeSheet = app.getActiveSpreadsheet();
  
  var issued = app.getActiveSpreadsheet().getSheetByName("Issued");
  
  var waiting = app.getActiveSpreadsheet().getSheetByName("Waiting for Inventory");
  
  var active = app.getActiveSpreadsheet().getSheetByName("Active Officers");
  
  var officerList = active.getRange(2, 2, 69, 1).getValues().flat();
  var officers = issued.getRange(2,11,99,1).getValues();
  Logger.log(officerList);
  for (var j = 0; j < 99; j++){     
    var officer = officers[j][0];
    if (officerList.indexOf(officer) ==-1){
      Logger.log("officer " + officer + " from Issued does not exist in Active Officers");
      var rowInfo = issued.getRange(j+2,1,1,12).getValues();
      var lastrow = waiting.getLastRow();
      waiting.getRange(lastrow+1,1,1,12).setValues(rowInfo);
    }
  }
}
...