Найти разницу между двумя массивами (отсутствующими значениями) в скрипте Google Apps - PullRequest
1 голос
/ 29 марта 2019

Попытка найти метод, который работает в скриптах Google Apps, сравнить два массива и найти значения, отсутствующие во втором массиве.

Я пробовал несколько подходов, но не могу найти тот, который работает в GAS. В настоящее время выполняется попытка с использованием цикла for () и indexOf ():

var ss = SpreadsheetApp.getActiveSpreadsheet();  
var sheet = ss.setActiveSheet(ss.getSheetByName('test'));

function TEST(){
  var lastRow = sheet.getLastRow();
  var orders = sheet.getRange(2,1,lastRow,1).getValues(); //[a,b,c,d]
  var products = sheet.getRange(2, 2,lastRow,1).getValues();  //[a, b]
  var missing = [];
  for ( var i = 0 ; i < Object.keys(orders).length; i++){
    if(products.indexOf(orders[i])<0){
      missing.push(orders[i]);};
  };
  Logger.log(missing); //expect [c, d]
   }

Исходная таблица имеет два столбца для сравнения и 3-й столбец, в котором должен храниться новый «отсутствующий» массив.

orders  products    missing
a       a           c
b       b           d
c       
d       

Я пробовал методы из нескольких других постов, но все используют функции, которые недоступны в Сценариях Google Apps.

Ответы [ 2 ]

1 голос
/ 29 марта 2019

Поиск недостающих заказов:

function findMissingOrders() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Sheet110');
  var orderA=sh.getRange(2,1,getColumnHeight(1)-1,1).getValues().map(function(r){return r[0];});
  var prodA=sh.getRange(2,2,getColumnHeight(2)-1,1).getValues().map(function(r){return r[0];});
  var missA=[];
  for(var i=0;i<orderA.length;i++) {
    var order=orderA[i];
    if(prodA.indexOf(orderA[i])==-1) {
      missA.push([orderA[i]]);
    }
  }
  if(missA.length>0) {
    sh.getRange(2,3,missA.length,1).setValues(missA);
  }
}

Вот функция getColumnHeight ():

function getColumnHeight(col,sh,ss){
  var ss=ss || SpreadsheetApp.getActive();
  var sh=sh || ss.getActiveSheet();
  var col=col || sh.getActiveCell().getColumn();
  var rg=sh.getRange(1,col,sh.getLastRow(),1);
  var vA=rg.getValues();
  while(vA[vA.length-1][0].length==0){
    vA.splice(vA.length-1,1);
  }
  return vA.length;
}

Электронная таблица до:

enter image description here

Электронная таблица после:

enter image description here

0 голосов
/ 29 марта 2019

Вы пытались использовать .filter() в переменной orders? Нечто подобное должно сработать:

var orders = sheet.getRange(2,1,lastRow,1).getValues().map(firstOfArray)
var products = sheet.getRange(2, 2,lastRow,1).getValues().map(firstOfArray)
var missing = orders.filter(missing)

function firstOfArray(array) {
   return array[0]
}
function missing(order) {
    return products.indexOf(order) === -1
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...