Сравнение двух столбцов в одной строке для первого значения, которое не соответствует - PullRequest
0 голосов
/ 18 мая 2019

У меня есть два листа, один - это зеркальный лист, «Лист2», который я использую для хранения значений другого листа, «Лист1».Моя цель - иметь функцию сравнения двух листов на предмет различий.Лучший способ, которым я мог придумать, - это сравнить столбец A из Sheet1 с столбцом A из Sheet2.Я нашел несколько функций, которые сравнивали 2 столбца, но он выполнил поиск значений из одного столбца и нашел его в другом столбце.Или возвращая все значения в тех ячейках, которые имели совпадающее значение, независимо от того, в какой строке оно было. Но я не хочу, чтобы значения в ячейках были обязательно.Я хочу найти первую строку, где два столбца перестают совпадать.Я довольно новичок в Javascript, поэтому я все еще не могу понять весь материал for (var j = 0; j < range.length; j++).

Но я уверен, что мне нужно знать, как использовать его для нужной мне функции.Вот то, что я попытался использовать, но вместо того, чтобы дать мне диапазоны строк, он дал мне массив значений, которые были одинаковыми, если я изменил его на if(lookup[i][0]!==range[j][0]){, он дал мне все возможные комбинации, которые не были сопоставлены.Это из stackoverflow.com / questions / 42044903

function findDifference() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s=ss.getSheetByName("Sheet1")
  var lr=s.getLastRow()
  var lookup = s.getRange(2,1,lr-1,2).getValues();
  var s1=ss.getSheetByName("Sheet2") 
  var lr1=s1.getLastRow()
  var range = s1.getRange(2,1,lr1-1,2).getValues();
  var lookupRange = [];
  for (var i = 0; i < lookup.length; i++) {
     for (var j = 0; j < range.length; j++) {
     var  test=lookup[i][0]
         if(lookup[i][0]!==range[j][0]){
           lookupRange.push([range[j][0],range[j][1],lookup[i][0],lookup[i][1],]);
     }}}
   s1.getRange(10,1,lookupRange.length,4).setValues(lookupRange); 
}

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

var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s1=ss.getSheetByName("Sheet1")
  var s2=ss.getSheetByName("Sheet2")
var ColumnA1 = s1.getRange('A:A').getValues()
var ColumnA2 = s2.getRange('A:A').getValues()
var Row = Function()
///Some function I can't think of using where
if(ColumnA1 + Row !== ColumnA2 + Row){
???.getRow()
}

1 Ответ

0 голосов
/ 18 мая 2019

Код, который вы имели, был «своего рода» полезным, но он не решил ваш конкретный вопрос. С другой стороны, ваш if(ColumnA1 + Row !== ColumnA2 + Row){ тоже не очень помог.

К сожалению, вам НЕОБХОДИМО "осмыслить целое для (var j = 0; j

В следующем ответе есть три основных элемента.

  • установочный лист1 и получение данных
  • установочный лист2 и получение данных
  • цикл по строкам и сравнение значения в данной строке от одного листа к другому.

  • оператор for обозначает цикл

  • i это просто переменная счетчика
  • i=0 означает, что начальное значение равно нулю. В массивах javascript ноль всегда является первым установленным значением.
  • i < Sheet1Data.length указывает, сколько раз цикл будет работать. В этом случае он будет работать, пока я меньше числа строк в массиве. Помните, я начинаю с нуля, так что «меньше чем» общее количество строк будет в порядке.
  • i++ означает, что каждый раз, когда код повторяется, он увеличивает i на единицу. Итак, я начинаю с 0, затем 1, 2, 3 и т. Д.

Как найти первую строку, в которой два столбца перестают совпадать

  • Просмотр журналов (Просмотр> Журналы).

Вы можете увидеть в строках 32 и 38 кода Logger.log операторы. Они записывают номер строки и соответствуют ли значения строки на каждом листе.


function so56195933() {
  // setup Spreadsheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // setup Sheet1
  var s1 = ss.getSheetByName("Sheet1")
  var s1LastRow = s1.getLastRow();
  //Logger.log("DEBUG: Sheet 1 Last row = "+s1LastRow);
  var Sheet1DataRange = s1.getRange(1,1,s1LastRow);
  var Sheet1Data = Sheet1DataRange.getValues();
  //Logger.log("DEBUG: Sheet 1 data range = "+Sheet1DataRange.getA1Notation());
  var Sheet1length = Sheet1Data.length;
  //Logger.log("DEBUG: Sheet1 length = "+Sheet1length);

  // setup Sheet2
  var s2=ss.getSheetByName("Sheet2") 
  var s2LastRow=s2.getLastRow();
  //Logger.log("DEBUG: Sheet 2 Last row = "+s2LastRow);
  var Sheet2DataRange = s2.getRange(1,1,s2LastRow);
  var Sheet2Data = Sheet2DataRange.getValues();
  //Logger.log("DEBUG: Sheet 2 data range = "+Sheet2DataRange.getA1Notation());
  var Sheet2length = Sheet2Data.length;
  //Logger.log("DEBUG: Sheet2 length = "+Sheet2length);

  // Loop through rows compare value per each sheet
  for (var i = 0; i < Sheet1Data.length; i++) {
    var s1data = Sheet1Data[i][0];
    var s2data = Sheet2Data[i][0];
    //Logger.log("DEBUG: Line: "+i+", s1data: "+s1data+" Vs s2data: "+s2data);
    if (s1data !=s2data){
      // sheets values don't balance
      Logger.log("Line: "+i+". Sheets are NOT equal. Sheet1 = "+s1data+", Sheet2 = "+s2data);
      return false;
    }
    else
    {
      // sheets values balance
      Logger.log("Line: "+i+". Sheets are equal, value: "+s1data);
    }
  }
}

Это мои тестовые данные

My Test Data

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