Запросить 2 набора данных Таблиц и выявить расхождения - PullRequest
0 голосов
/ 28 мая 2020

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

a) определить недостающие значения ID;

b) согласовать различия в других полях, когда значения идентификаторов совпадают.

INPUT:
Таблица с 2 вкладками (tab1, tab2).
Идентификатор ключа в каждом столбце B (Btab1, Btab2)

  • Я хочу идентифицировать случаи, когда уникальное значение (B) находится в одном наборе данных, но не в другом (строки не в том же порядке)

  • Запуск функции & pu sh на вкладке вывода, если Btab1 не находится в tab2 || Btab2 отсутствует в tab1

  • Когда значение B находится на обеих вкладках (большую часть времени), я хочу идентифицировать случаи несоответствия данных в нескольких столбцах ...

  • Для всех экземпляров B, pu sh B и соответствующие столбцы ниже на вкладке вывода, если ...

    • Столбец M на вкладке1 не ' t соответствует столбцу E в tab2
    • Столбец P в tab1 <> столбец F в tab2
    • Столбец AN tab1 <> Столбец G tab2

ВЫВОД: вкладка, которая отображает проблемные области в наборах данных.
Первый столбец - это идентификатор ключа.
Второй столбец объясняет проблему с помощью текстовой строки

И снова проблема в том, что значения не отсортированы одинаково, и может быть небольшая разница в общем количестве строк

function compare() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
   ss.insertSheet(1);
   ss.getActiveSheet().setName('output');
  var sheet1 = ss.getSheetByName('sheet1');
  var sheet2 = ss.getSheetByName('sheet2');
  var sheet_output = ss.getSheetByName('output');


  var range1 = sheet1.getRange(1,1,sheet1.getLastRow(),sheet1.getLastColumn()).getValues(); 
  var output1 = [];
  var a1;
  var b1;
  var h1;
  var i1;
  var j1;
  var m1;
  var o1;
  var p1;
  var an1;
  var ao1;
  var x;

  var range2 = sheet2.getRange(1,1,sheet2.getLastRow(),sheet2.getLastColumn()).getValues(); 
  var output2 = [];
  var a2;
  var b2;
  var c2;
  var d2;
  var e2;
  var f2;
  var g2;
  var h2;
  var y;

  /// can i do for(x in range1; y in range2) { all in one function??  If so, what is the proper syntax?

  for(x in range1, y in range2) {
    a1 = range1[x][0];
    b1 = range1[x][1];
    h1 = range1[x][7];
    i1 = range1[x][8];
    j1 = range1[x][9];
    m1 = range1[x][12];
    o1 = range1[x][14];
    p1 = range1[x][15];
    an1 = range1[x][39];
    ao1 = range1[x][40];

    a2 = range2[y][0];
    b2 = range2[y][1];
    c2 = range2[y][2];
    d2 = range2[y][3];
    e2 = range2[y][4];
    f2 = range2[y][5];
    g2 = range2[y][6];
    h2 = range2[y][7];

    if (

      (b1 != b2) ||
      (m1 != e2) // etc etc etc
       )
    {

  //push to output
  }}

1 Ответ

1 голос
/ 29 мая 2020

Хотя ваш синтаксис for(x in range1, y in range2) не будет возвращать ошибку, он не даст вам желаемого результата ни в том случае, если строки находятся в разном порядке

Причина:

Во время каждого итерация как x, так и y изменится, например, если var range1 = [1,2,3] и var range2 = [4,5,6], ваш l oop будет повторяться 3 раза, а значения в вашем образце l oop итераций будут:

  1. итерация

range1[x] = 1 и range2[y] = 4

итерация

range1[x] = 2 и range2[y] = 5

итерация

range1[x] = 3 и range2[y] = 6

В этом случае вы не получите комбинацию

range1[x] = 1 и range2[y] = 4

или

range1[x] = 2 и range2[y] = 6

и так далее.

Вместо этого вам нужно использовать два вложенных цикла for, которые будут перебирать все возможные комбинации x и y:

 for(x in range1) {
    for(y in range2){
      ...
    } 
  }

Sidenote:

Даже если ваши строки будут в том же порядке, вам все равно нужно быть осторожным. Поскольку for(x in range1) в отличие от for(x = 0; x < range1.length; i++) не дает вам никакого контроля над тем, в какой папке l oop будет перебирать диапазон.

Теперь к вашему запросу для дубликатов

Возможный способ реализации функциональности не слишком сложным способом:

  • Определить логическую переменную и использовать ее для проверки каждого x либо у него есть дубликат
  • Если найден дубликат (для столбца B) - будут оцениваться дальнейшие критерии
  • Если две строки совпадают по всем критериям, внутренний l oop будет завершен с break, и функция перейти к следующему x
  • Если будут обнаружены строки с идентичными ключевыми идентификаторами, но расхождения в других столбцах - обе строки будут помещены на лист output для сравнения (это проще реализовать, чем указать, какие точно противоречит)
  • После этого внутренний l oop также будет закрыт
  • В других случаях выше duplicate будет установлено на true
  • Если уникальный идентификатор найдено в листе 1 (duplicate = false) - он будет немедленно помещен в output

Sample

function compare() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
   ss.insertSheet(1);
    ss.getActiveSheet().setName('output');
  var sheet1 = ss.getSheetByName('sheet1');
  var sheet2 = ss.getSheetByName('sheet2');
  var sheet_output = ss.getSheetByName('output');


  var range1 = sheet1.getRange(1,1,sheet1.getLastRow(),sheet1.getLastColumn()).getValues(); 
  var output1 = [];
  var b1;
  var m1;
  var p1;
  var an1;
  var x;

  var range2 = sheet2.getRange(1,1,sheet2.getLastRow(),sheet2.getLastColumn()).getValues(); 
  var output2 = [];
  var b2;
  var e2;
  var f2;
  var g2;
  var y;

  var array = [];
  for(x in range1) {
    var duplicate = false;
    for(y in range2){
      b1 = range1[x][1];
      m1 = range1[x][12];
      p1 = range1[x][15];
      an1 = range1[x][39];    

      b2 = range2[y][1];
      e2 = range2[y][4];
      f2 = range2[y][5];
      g2 = range2[y][6];

      if (        
        (b1 == b2)
      )
      {
        Logger.log("found");
        duplicate = true;
        if((m1 != e2)||
        (p1 != f2) ||
        (an1 != g2)){
          array.push(range1[x]);
          array.push(range2[y]);
        }
        break;          
      }
    } 
    if (duplicate == false){
      Logger.log("duplicate false");
      array.push(range1[x]);
    }
  }
  //push to output
  if(array[0]){
    sheet_output.getRange(sheet_output.getLastRow()+1, 1, array.length, array[0].length).setValues(array);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...