Last active
June 7, 2018 21:33
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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