У меня есть таблица с некоторыми данными:
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