Удаление дубликатов в электронной таблице Google Sheets - PullRequest
0 голосов
/ 02 мая 2018

У меня есть таблица с некоторыми данными:

Staff No. - First Name - Last Name - Age
12345     - John       - Doe       - 29
12345     - John       - Doe       - 30
12456     - Jane       - Doe       - 29
12345     - John       - Doe       - 29

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

Мне нужно адаптировать следующий код для поиска значений в первом столбце (а не во всей строке), если совпадение найдено, добавьте строку во временный массив.

Другими словами, используя приведенные выше «Данные электронных таблиц» в качестве примера, мне нужно было бы иметь только первую запись для Джона Доу, возраст 29 лет, возвращенный в массив. Другие 2 записи для Джона До должны быть отброшены. (Сохраняя запись для Джейн Доу.)

Код:

function onOpen() {
    var ui = SpreadsheetApp.getUi();
    ui.createMenu('Duplicate Removal Tool')
        .addSubMenu(ui.createMenu('Commands').addItem('Remove Duplicates', 'removeDuplicates')).addToUi();
}

function removeDuplicates() {
    var ss = SpreadsheetApp.getActive() // Gets the Spreadsheet where the code is located in.
    var sheet = ss.getActiveSheet(); // Gets the Sheet the user is currently focused on.
    var data = sheet.getDataRange().getValues(); // Gets the values of the above sheet.
    var newData = new Array(); // Creates a temporary blank array.

    for (i in data) {

        var row = data[i] // Row Variable equals element of array for current iteration of loop.
        var duplicate = false; // Duplicate variable set to default on each iteration of outer loop.

        for (j in newData) {

            if (row.join() == newData[j].join()) { //Converts elements of the arrays to string and compare values.
                duplicate = true;
            }
        }
        if (!duplicate) {
            newData.push(row); // If rows do not match add current element in row array to newData array.
        }
    }


    sheet.clearContents(); // Clear the contents of the sheet
    sheet.getRange(1, 1, newData.length, newData[0].length) 
        .setValues(newData); // Write values of newData array to sheet.
}

Попытка № 2: Вот моя вторая попытка. Работает хорошо по большей части. Бросает строки вне связанной ошибки. Нет проблем, это легко исправить. Проблема с этой версией в том, что она достаточно хорошо работает на 50-100 записях. Возьмите до 500+ записей, и время исполнения уходит вверх:

function removeDuplicates() {
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getActiveSheet();
  var newData = []

  var i, j, outerLoopRow, innerLoopRow, lastRow;

  lastRow = sheet.getLastRow();

  for (i=1; i < lastRow; i++) {
    outerLoopRow = sheet.getRange(i, 1, 1, 1).getValue();

    if (i == lastRow) break


    for (j= i +1; j < lastRow+1; j++) {
      innerLoopRow = sheet.getRange(j,1,1,1).getValue()
      if (outerLoopRow == innerLoopRow){
        ss.deleteRow(j)
      }

   } // End of Inner Loop
  } // End of OuterLoop

} //End of Function

1 Ответ

0 голосов
/ 04 мая 2018

Ниже приведен код, который я использовал для получения желаемого результата. Объяснение того, как все это работает, находится в комментариях. Если кому-то нужна помощь, пожалуйста, напишите мне в личку, и я сделаю все возможное, чтобы помочь, где смогу.

//Add Menu to current Sheet
function onOpen(){
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Duplicate Removal Tool')
    .addSubMenu(ui.createMenu('Commands').addItem('Remove Duplicates', 'removeDuplicates')).addToUi();
}

function removeDuplicates() {
  // Insert Spreadsheet ID below
  // Insert name of Sheet in spreadsheet below
  var ss = SpreadsheetApp.openById("SPREADSHEET ID HERE");
  var sheet = ss.getSheetByName("SHEET NAME HERE");

  //Create Variables
  var array1, array2, array3, lastRow, i, j, k, rowToDelete, reverseArray;

  lastRow = sheet.getLastRow(); // Get last row in sheet with data
  array1 = sheet.getRange(2, 1, lastRow, 1).getValues(); // Get all values in column A
  array2 = array1 // Copy array1 (All values in A)
  array3 = [] // Create a blank array

  // Outer Loop - Perform Inner Loop for each value in array 1
  // Inner loop, compare first value against all other values in descending order.
  // If match is found, check if value already exists in array 3
  // If value does not exist, push the row number to array 3
  for (i = 0; i < array1.length; i++) {
    for (j = i + 1; j < array2.length; j++) {
      if (array1[i].join() == array2[j].join()) {
        if(array3.indexOf(j + 2) == -1)
          array3.push(j + 2)
      }
    } // End of Inner Loop
  } // End of Outer Loop

  //Sort Array 3 in numerical order.
  // Reverse array so highest value is first and lowest value is last
  // For each value in array 3, delete the row with corresponding number in array 3
  reverseArray = array3.sort(function (a, b) {  return a - b;  }).reverse()
  for (k = 0; k < array3.length; k++) {
    rowToDelete = reverseArray[k];
    ss.deleteRow(rowToDelete);
  }
}// End of Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...