Skip to content

Instantly share code, notes, and snippets.

@chawel
Last active June 7, 2018 21:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chawel/c70d36ad83e09cb003a72103dec90292 to your computer and use it in GitHub Desktop.
Save chawel/c70d36ad83e09cb003a72103dec90292 to your computer and use it in GitHub Desktop.
Google Spreadsheet script: Create sheet with rows containing first occurrence of values in selected range
// Dodaje nową pozycję do menu
function onOpen() {
SpreadsheetApp.getUi().createAddonMenu()
.addItem('Copy to new sheet', 'copyUniques')
.addToUi();
}
// Funkcja pomocnicza porównująca 2 wartości
function isUnique(left, right) {
return left == right
}
// Funkcja do tworzenia nowych arkuszy
// dba o unikalną nazwę (nazwy arkuszy nie mogą się powtarzać)
function createNewSheet(name) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
if (ss.getSheetByName(name) == null) {
ss.insertSheet(name);
return name;
} else {
return createNewSheet(name + "(0)");
}
}
// Kopiowanie pierwszego wiersza ze źródłowego do
// docelowego arkusza
function copyFirstRow(srcSheetName, dstSheetName) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var srcSheet = ss.getSheetByName(srcSheetName);
var dstSheet = ss.getSheetByName(dstSheetName);
var width = srcSheet.getLastColumn();
var rangeToCopy = srcSheet.getRange(1, 1, 1, width);
rangeToCopy.copyTo(dstSheet.getRange(1, 1, 1, width));
}
// Funkcja odnajduje w danym zakresie, te które
// zawierają unikalne wartości
function findUniqueRanges(range) {
var uniqueValues = new Array();
var rangeArray = new Array();
var selectedCells = range.getValues();
var selectedRowsNumber = range.getNumRows();
for (var i = 0; i < selectedRowsNumber; ++i) {
// numerowanie wierszy i kolumn zaczyna się od 1
// inaczej niż w tablicach
var cell = range.getCell(i + 1, 1);
// Pomija puste komórki
if (cell.isBlank()) {
continue;
}
// Pobieramy wartość z komórki
var cellValue = cell.getValue();
var duplicate = false;
for (var j = 0; j < uniqueValues.length; ++j){
if (isUnique(cellValue, uniqueValues[j])) {
duplicate = true;
break;
}
}
// Jeżeli jest to pierwsze wystąpienie jakiejś wartości
// oznacz komórkę na czerwono, zachowaj wartość komórki do tablicy
// i zachowaj zakres (koordynaty) tej komórki
if (!duplicate){
cell.setBackground("red");
uniqueValues.push(cellValue);
rangeArray.push(cell);
}
}
// Zwróć koordynaty komórek z unikalnymi wartościami
return rangeArray;
}
// Główna funkcja
function copyUniques() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var activeSheet = SpreadsheetApp.getActiveSheet();
var activeSheetName = activeSheet.getName();
var selectedRange = ss.getSheetByName(activeSheetName).getActiveRange();
var uniqueRangeList = findUniqueRanges(selectedRange);
var newSheetName = createNewSheet(activeSheet.getName() + "_unique");
var newSheet = ss.getSheetByName(newSheetName);
copyFirstRow(activeSheetName, newSheetName);
for (var i = 0; i < uniqueRangeList.length; ++i) {
var uniqueRange = uniqueRangeList[i];
var uniqueRowLenght = uniqueRange.getWidth();
var uniqueRowValues = activeSheet.getSheetValues(uniqueRange.getRow(), 1, 1, activeSheet.getLastColumn());
newSheet.appendRow(uniqueRowValues[0]);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment