Те же значения не совпадают в условии - PullRequest
1 голос
/ 30 мая 2019

Это моя первая попытка в скриптах Google Sheets

Я пытаюсь сравнить каждую строку первого столбца на двух листах.

Если какое-либо значение на листе 1 отсутствует на листе 2, я бы добавил его в конец листа 2.

Это код, сравниваемые значения никогда не совпадают, я пробовал ==, ===, с и без toSting (). Я никогда не получаю флаг found=1, все значения в sheet1 col1 копируются в sheet2 col1.

var ui = SpreadsheetApp.getUi();
var ss = SpreadsheetApp.getActiveSpreadsheet();

function Prueba2() {
  var sheet = ss.getSheets()[0];
  var rangeData = sheet.getDataRange();
  sheet.getRange('A1').activate();

  var lastRow = rangeData.getLastRow();
  var searchRange = sheet.getRange(2,1, lastRow, 1);

  var sheet2 = ss.getSheets()[1];
  var rangeData2 = sheet2.getDataRange();
  var lastRow2 = rangeData2.getLastRow();
  var searchRange2 = sheet2.getRange(2,1, lastRow2, 1);

  var l1= searchRange.getLastRow();
  var l2= searchRange2.getLastRow();

  var rangeValues = searchRange.getValues();
  var rangeValues2 = searchRange2.getValues();

  var found=0;
  var arr = [];
  // Loop through array and if condition met
  for ( i = 0; i < lastRow - 1; i++){
    found=0;
    for ( j = 0 ; j < lastRow2 - 1; j++){
      var vi=rangeValues[i];
      var vj=rangeValues2[j];
      if(rangeValues[i].toString() === rangeValues2[j].toString()){
        found=1;     
        break; 
      }; 
    };
    if (found==0){
      Logger.log(rangeValues[i]);
      arr.push(rangeValues[i]); 
    };      
   };
  var toAddArray = [];
  for (k = 0; k < arr.length; ++k){
    toAddArray.push([arr[k]]);
  }

  sheet2.getRange(lastRow2+1, 1, arr.length, 1).setValues(toAddArray);
};

EDIT

Это сработало, но я не знаю, почему

for ( j = 0 ; j < lastRow2 - 1; j++){
  var vi=rangeValues[i].toString();
  var vj=rangeValues2[j].toString();
  //if(rangeValues[i] === rangeValues2[j]){
  if(vi===vj||vi==""){  
    found=1;     
    break; 
  }; 
};

1 Ответ

2 голосов
/ 30 мая 2019

Как насчет этой модификации? Значение, полученное с помощью getValues(), является двумерным массивом. Учитывая это, сценарий изменяется.

Шаблон 1:

Если ваш скрипт изменен, как насчет этой модификации?

От:

for ( i = 0; i < lastRow - 1; i++){
  found=0;
  for ( j = 0 ; j < lastRow2 - 1; j++){
    var vi=rangeValues[i];
    var vj=rangeValues2[j];
    if(rangeValues[i].toString() === rangeValues2[j].toString()){
      found=1;
      break; 
    }; 
  };
  if (found==0){
    Logger.log(rangeValues[i]);
    arr.push(rangeValues[i]);
  };      
 };

Кому:

for ( i = 0; i < lastRow - 1; i++){
  found=0;
  for ( j = 0 ; j < lastRow2 - 1; j++){
      // var vi=rangeValues[i]; // This is not used in this script.
      // var vj=rangeValues2[j]; // This is not used in this script.
    if(rangeValues[i][0].toString() === rangeValues2[j][0].toString()){ // Modified
      found=1;
      break; 
    }; 
  };
  if (found==1){ // Modified
    Logger.log(rangeValues[i][0]); // Modified
    arr.push(rangeValues[i][0]); // Modified
  };
 };
  • В вашей ситуации вы можете заменить if(rangeValues[i][0].toString() === rangeValues2[j][0].toString()){ на if(rangeValues[i][0] === rangeValues2[j][0]){.

Шаблон 2:

Как и другой шаблон, как насчет этой модификации?

От:

var found=0;
var arr = [];
// Loop through array and if condition met
for ( i = 0; i < lastRow - 1; i++){
  found=0;
  for ( j = 0 ; j < lastRow2 - 1; j++){
    var vi=rangeValues[i];
    var vj=rangeValues2[j];
    if(rangeValues[i].toString() === rangeValues2[j].toString()){
      found=1;     
      break; 
    }; 
  };
  if (found==0){
    Logger.log(rangeValues[i]);
    arr.push(rangeValues[i]); 
  };      
 };
var toAddArray = [];
for (k = 0; k < arr.length; ++k){
  toAddArray.push([arr[k]]);
}

sheet2.getRange(lastRow2+1, 1, arr.length, 1).setValues(toAddArray);

Кому:

var toAddArray = rangeValues.filter(function(e) {return rangeValues2.some(function(f) {return e[0] && f[0] && e[0] == f[0]})});
sheet2.getRange(lastRow2+1, 1, toAddArray.length, 1).setValues(toAddArray);

Примечание:

  • Причина того, что vi===vj вашего добавленного скрипта работает, заключается в следующем.
    • Когда запускаются rangeValues[i].toString() и rangeValues2[j].toString(), одномерный массив преобразуется в строку типа ["sample"] в "sample". По этому vi===vj работает.

Ссылки:

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

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