Google скрипт - скрипт сравнения не работает - PullRequest
0 голосов
/ 22 марта 2020

Я создаю сценарий для сравнения значения 2 в другой электронной таблице, если значение на листе A отсутствует на листе B, оно будет скопировано в следующую пустую строку листа B, а для l oop - до последнего значения в листе A. Просто есть проблема, хотя значение на листе A = лист B, скрипт не пропустит это значение, все равно запишите его в лист B. Пожалуйста, посмотрите мой скрипт и дайте мне несколько идей. Я новичок в Gscript, просто нужны инструкции от всех.

Лист данных A - слева и лист B:

Data sheet A - left & sheet B

function Compare() {

  var ss      = SpreadsheetApp.openById('Link sheet B');
  var hss     = ss.getSheetByName('2');


  var ds      = SpreadsheetApp.openById('Link sheet A');
  var dds     = ds.getSheetByName('Data');

  var cmpcol  = "A";
  var cmpdds  = dds.getRange(cmpcol+"1").getColumn();
  var cmphss  = hss.getRange(cmpcol+"1").getColumn();
  var ddsmrw  = dds.getLastRow();
  var hssmrw  = hss.getLastRow();
    Logger.log(cmpdds,cmphss,ddsmrw,hssmrw);

  var ddsval  = dds.getRange(3,cmpdds,ddsmrw,1).getValues();
  var hssval  = hss.getRange(2,cmphss,hssmrw,1).getValues();
    Logger.log(ddsval);
    Logger.log(hssval);

  for (i=0; i <= ddsmrw; i++){
    var dvalue  = ddsval[i];
    Logger.log(dvalue);

    for (j=0; j <= hssmrw; j++){
      var hvalue = hssval[j];
      Logger.log(hvalue);
      if (hvalue == dvalue){
        break;}

      else {
        hss.getRange('A' + ((hssmrw+1))).setValue(dvalue);
        hssmrw++;
        Logger.log(hssmrw);
        break;
        }
      }
    }

  }

1 Ответ

0 голосов
/ 23 марта 2020

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

Итак, есть A лист и B лист. Мы получаем оба из них и затем используем indexOf, чтобы найти значения A в B.

function Compare() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();

  var aSheet = ss.getSheetByName("A");
  var bSheet = ss.getSheetByName("B");

  var cmpcol  = "A";

  var colA  = aSheet.getRange(cmpcol+"1").getColumn();
  var colB  = bSheet.getRange(cmpcol+"1").getColumn();

  var lstRowA  = aSheet.getLastRow();
  var lstRowB  = bSheet.getLastRow();

  // Usage of `flat` to get a single array instead of Object[][]
  var aValues  = aSheet.getRange(3,colA,lstRowA,1).getValues().flat();
  var bValues  = bSheet.getRange(2,colB,lstRowB,1).getValues().flat();

  Logger.log(aValues);
  Logger.log(bValues);

  for(var i=0; i<aValues.length; i++){

    // Value from A that we have to look in B
    var aValue = aValues[i];

    // Usind `indexOf` to look in B array
    var indx = bValues.indexOf(aValue, 0);
    Logger.log(indx);

    // What to do when the value in A does NOT exist in B
    if(indx == -1){
      bSheet.appendRow([aValue]);
    }

    // Skip loop when the value in A exists in B
    else{
      continue
    }
  }
}

Также как getValues возвращает массив массива (Object[][]) Я использовал flat, чтобы иметь возможность использовать indexOf.

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