Удалить дубликаты на нескольких листах - PullRequest
1 голос
/ 11 октября 2019

Я хочу удалить дубликаты на 2 разных листах.

У меня есть активный лист, и я хочу удалить дубликаты, которые уже существуют в моем листе «Черный список». Я хочу запустить этот процесс для столбца A и столбца B (или просто для любых значений на всех листах). Когда дубликат найден, я хочу оставить строку в такте, но заменить значение на '' (например, пустая ячейка).

У меня есть рабочая версия, которую я искажал вместе, но только для активного листа.

Обратите внимание, что я использую функцию findDuplicate, функцию removeDuplicate, которую я оставил там, чтобы ничего не испортить:)

// this is a Google Apps Script project

function onOpen() {
  var spreadsheet = SpreadsheetApp.getActive();
  var menuItems = [
    { name: 'Find duplicates...', functionName: 'findDuplicate' },
    { name: 'Remove duplicates...', functionName: 'removeDuplicate' }
  ];
  spreadsheet.addMenu('Duplicates', menuItems);
}

function removeDuplicate() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getActiveRange();
  var data = range.getValues();

  var rowNum = range.getRow();
  var columnNum = range.getColumn();
  var columnLength = data[0].length;

  var uniqueData = [];
  var duplicateData = [];

  // iterate through each 'row' of the selected range
  // x is
  // y is
  var x = 0;
  var y = data.length;

  // when row is
  while (x < y) {
    var row = data[x];
    var duplicate = false;

    // iterate through the uniqueData array to see if 'row' already exists
    for (var j = 0; j < uniqueData.length; j++) {
      if (row.join() == uniqueData[j].join()) {
        // if there is a duplicate, delete the 'row' from the sheet and add it to the duplicateData array
        duplicate = true;
        var duplicateRange = sheet.getRange(
          rowNum + x,
          columnNum,
          1,
          columnLength
        );
        duplicateRange.deleteCells(SpreadsheetApp.Dimension.ROWS);
        duplicateData.push(row);

        // rows shift up by one when duplicate is deleted
        // in effect, it skips a line
        // so we need to decrement x to stay in the same line
        x--;
        y--;
        range = sheet.getActiveRange();
        data = range.getValues();
        // return;
      }
    }

    // if there are no duplicates, add 'row' to the uniqueData array
    if (!duplicate) {
      uniqueData.push(row);
    }
    x++;
  }

}

function findDuplicate() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getActiveRange();
  var data = range.getValues();

  var rowNum = range.getRow();
  var columnNum = range.getColumn();
  var columnLength = data[0].length;

  var uniqueData = [];

  // iterate through each 'row' of the selected range
  for (var i = 0; i < data.length; i++) {
    var row = data[i];
    var duplicate = false;

    // iterate through the uniqueData array to see if 'row' already exists
    for (var j = 0; j < uniqueData.length; j++) {
      if (row.join() == uniqueData[j].join()) {
        // if there is a duplicate, highlight the 'row' from the sheet
        duplicate = true;
        var duplicateRange = sheet.getRange(
          rowNum + i,
          columnNum,
          1,
          columnLength
        );
        duplicateRange.setValue('');
      }
    }

    // if there are no duplicates, add 'row' to the uniqueData array
    if (!duplicate) {
      uniqueData.push(row);
    }
  }
}

Большое спасибо за вашу помощь! Я занимался этим несколько часов и решил, что мне следует просто спросить совета у экспертов:)

1 Ответ

1 голос
/ 11 октября 2019

Первые строки вашей функции removeDuplicate и findDuplicate, похоже, действительно указывают на то, что вы ссылаетесь на активную электронную таблицу / лист / диапазон

  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getActiveRange();
  var data = range.getValues();

Если вы хотите использовать одну и ту же функцию дляДля данной таблицы / листа / диапазона, которая не является активной, вам нужно будет использовать другие функции, кроме getActiveXXX ().

Например, чтобы получить лист с именем «Черный список», вы должны использовать sheet = spreadsheet.getSheetByName("Blacklist")(см. также https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#getsheetbynamename)

Если вы хотите получить доступ к определенному диапазону, который отличается от активного диапазона, вам следует использовать метод getRange (см. также https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#getrangea1notation) Обратите внимание, что метод getRange можно использовать вдругими способами, например getRange("A1:D4"), getRange(1, 1, 3, 3) (параметры, соответственно, startRow, startColumn, numRows, numColumns)

Кроме того, если вы не хотите жестко задавать последнюю строку ваших 2 столбцов, вы будетеСкорее всего, эта функция нужна для поиска последней строки в коде: https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#getlastrow (там также есть пример, показывающий, как использовать getRange () in комбинация с getLastRow ()).

Надеюсь, это поможет вам двигаться дальше. Обратите внимание, что я не проверял остальную часть вашего кода и просто предположил, что ваша логика дедупликации работает нормально, как вы упомянули об этом в своем комментарии.

Удачи!

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