Как сравнить элемент в массиве со всеми элементами в другом массиве и добавить его в shpreadsheet?

#javascript #arrays #google-apps-script #arraylist #multidimensional-array

Вопрос:

Я разрабатываю инструмент, и в настоящее время я столкнулся с проблемой. Я пишу код в GoogleAppScript (JavaScript), и у меня есть два столбца, в которых я собираю данные. В результате у меня есть два массива. Давайте позвоним им mainArray и checkArray

Мне нужен код, выполняющий эту логику:

  1. получение 1-го значения основного массива, т. е. основного массива[0]
  2. проверка значения, если оно равно checkArray[0], затем checkArray[1]… checkArray[i]
  3. если есть совпадение, то выбросьте его в мусорное ведро и перейдите в основной массив[1].
  4. Проверка MainArray[1] со всеми значениями из checkArray, как мы это сделали на стр. 2
  5. Если нет совпадения с какими-либо значениями из контрольного массива, добавьте эти значения в 3-й массив (finArray).

Я поступил как раз наоборот.

 for (var j=0; j<checkArr.length; j  ) {

     for(var i=0; i<mainArr.length; i  ) {
  if(mainArr[i][0]!==''){
    if(checkArr[j][0]==mainArr[i][0])
    {
        Logger.log('not in the list' mainArr[i][0])
        finArr.push(mainArr[i][0])
        break;
    }}
 

Но я не знаю, как заставить код работать так, как я описал выше.

Комментарии:

1. см.: Array#filter() , но похоже, что у вашего main и check массива есть вложенные массивы? Разместите образцы каждого массива для получения более конкретных ответов.

2. когда вы собираете данные из электронной таблицы в Google с помощью .getValues, вы получаете формат [[v1], [v2]]. const a = [‘a’, ‘b’, ‘c’]; const b = [‘c’, ‘a’, ‘d’]; пусть c = a.фильтр(word => b); После запуска кода, проверяющего массив a — мне нужно получить только значение «b», потому что у меня нет » b » во втором массиве

3. const c = a.filter(word => !b.includes(word));

4. getValues() вернет ли 2D массив, вы уверены, что пример с простыми массивами a и b соответствует вашей текущей ситуации?

Ответ №1:

  ` 
// The Arrays actually are one dimensional 
// I prefer to create a one dimensional array
// GetDataArray function creates one dimensional array
function GetDataArray(sht,rng) { 
    var Data = [] var i = 0; 
    Logger.log(' Sht Name %sn rng %s,', sht.getName(), rng) 
    sht.getRange(rng).getValues() .forEach( 
        function (row) { 
           row.forEach( function (cell) { 
             //Logger.log(cell); 
             Data[i  ] = cell }); } ); 
             return Data 
} //
 ......
var sht = SpreadsheetApp.getActiveSheet() 
var rngMain = ....// Provide the range 
var rngCheck = ... 
var checkArr = GetDataArray(sht, rngCheck) 
var mainArr = GetDataArray(sht, rngMain) 
var finArr = [] 

mainArr.forEach( function(cell) { 
    if (cell == '') continue 
    if (checkArr.indexOf(cell) != -1) finArr.push(cell)})
 

Ответ №2:

 function thefunc() {
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName('Sheet1');
  let vs1 = sh.getRange(1,1,sh.getLastRow(),1).getValues().flat();
  let vs2 = sh.getRange(1,2,sh.getLastRow(),1).getValues().flat();
  let d = 0;
  vs1.forEach((r,i) => {
   if(~vs2.indexOf(r[0])) {
     sh.deleteRow(i 1-d  );//delete row
   }
  });
}