Functies die het gebruik van de sheets ondersteunen
Zorgt ervoor dat alle data op een sheet gewist wordt, behalve de eerste rij, die als header rij wordt aanzien
InitSheet_("Sheet21");
/**
* Clear sheet except first row or create new one(empty)
*
* @param {string} Sheetname
* @customfunction
*/
function InitSheet_(sheetname) {
let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetname);
if (sheet == null) {
SpreadsheetApp.getActiveSpreadsheet().insertSheet(sheetname)
//SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetname).getRange(1,1).setValue(0);
SpreadsheetApp.flush();
sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetname);
}
let data = sheet.getDataRange();
let values = data.getValues();
// Extract headers
let headers = [[]]
headers[0] = values[0];
//Clear complete sheet
data.clearContent();
//put headers back
sheet.getRange(1, 1, 1, headers[0].length).setValues(headers);
//atomize actions.
SpreadsheetApp.flush();
}
Maakt een header rij in een sheet, waarbij de waardes meegegeven worden in een array
InitHeader_(["Group_name", "Group_email"],"GroupsList")
/**
* Create header row new sheet
*
* @param {Array} input colun headers as array of strings
* @param {string} sheetname in current spreadsheet
* @return
* @customfunction
*/
function InitHeader_(arr, sheetname) {
//create 2D array
let headers = [[]]
headers[0] = arr
let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetname);
sheet.getRange(1, 1, 1, arr.length).setValues(headers);
SpreadsheetApp.flush();
}
Sorteerd een sheet vanaf rij 2 waarbij je kan opgeven op welke kolom er moet gesorteerd worden.
Dit is de apps script tegenhanger van de SORT mogelijkheid binnen sheets.
/**
* SheetSort_(sheet,columnheader)
* Sort Sheet by column starting at row 2, without header
* @param {sheet} sheet, name of sheet in speadsheet
* @param {string} columheader, name of column
* @return {bool} true if ok
*
*/
function SheetSort_(sheet, columnheader) {
try {
//Lock access to vars/sheet from triggers
LockService.getScriptLock().waitLock(300000) //max 6min
let Sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheet);
Sheet.setFrozenRows(1)
let values = Sheet.getDataRange().getValues();
// Extract headers
var headers = values[0];
// find columnheader
let col = headers.indexOf(columnheader) + 1
Sheet.sort(col)
SpreadsheetApp.flush();
LockService.getScriptLock().releaseLock()
return true
} catch (e) {
SpreadsheetApp.flush();
LockService.getScriptLock().releaseLock()
Logger.log(e)
return false
}
}
Deze sorteerfunctie laat je toe om 2 kolommen te gebruiken, waarbij de eerste kolom de hoofdsortering is en de tweede binnen deze eerste.
Dit kan je verkrijgen door gebruik te maken van de range.sort>
Je kan zo ook de sortering in beide kolommen anders doen.
Het principe is bruikbaar wanneer je in een tabel sorteert op dubbels (key) en dan nog de hoogste waarde eruit wil halen (lastIndexOf)
var range = Sheet.getRange(2, 1, Sheet.getLastRow() - 1, Sheet.getLastColumn())
range.activate()
range.sort([{ column: col1, ascending: true }, { column: col2, ascending: true }])
Wanneer je datavalidatie wil gebruiken om in een sheet een user interface te maken met een selectielijst, kan je gebruik maken van deze functie.
De sheet,cell bepalen de plaats waar de dropdown zal komen.
De sourcesheet is de sheet van waaruit de lijst wordt samen terug te vinden in de kolom met titel label.
/**
* dropdown_
* get user list in dropdown menu
* @param {string} sheet, sheetname for dropdown menu
* @param {string} cell, cell for dropdown in sheet
* @param {string} sourcesheet, sheetname of sourse dropdown
* @param {string} label, name of lable of column for source dropdown
* FSQueryStudentScores(studentEmail, sheetname)
*/
function dropdown_(sheet, cell, sourcesheet, label) {
var ss = SpreadsheetApp.getActiveSpreadsheet()
//create grade sheet
if (ss.getSheetByName("Grade") == null) { ss.insertSheet("Grade") }
SpreadsheetApp.flush()
let Sourcesheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sourcesheet);
let Sheeto=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheet);
let DropDowncell = Sheeto.getRange(cell)
DropDowncell.setValue("")
let values = Sourcesheet.getDataRange().getValues();
// Extract headers
let headers = values[0];
// find columnheader
let col = headers.indexOf(label)+1
let firstRow = 2
let ListRange = Sourcesheet.getRange(firstRow, col,Sourcesheet.getLastRow() - firstRow + 1, col);
let rule= SpreadsheetApp.newDataValidation().requireValueInRange(ListRange).build();
DropDowncell.setDataValidation(rule)
SpreadsheetApp.flush()
}
Wist alle legen kolommen en rijen van een sheet, behalve als deze als frozen zijn ingesteld.
/**
* Trims all of the unused rows and columns outside of selected data range.
*/
function cropSheet(sheetname) {
const dataRange = SpreadsheetApp.getActive().getSheetByName(sheetname).getDataRange()
// const dataRange = SpreadsheetApp.getActiveSheet().getDataRange();
const sheet = dataRange.getSheet();
let numRows = dataRange.getNumRows();
let numColumns = dataRange.getNumColumns();
const maxRows = sheet.getMaxRows();
const maxColumns = sheet.getMaxColumns();
const numFrozenRows = sheet.getFrozenRows();
const numFrozenColumns = sheet.getFrozenColumns();
// If last data row is less than maximium row, then deletes rows after the last data row.
if (numRows < maxRows) {
numRows = Math.max(numRows, numFrozenRows + 1); // Don't crop empty frozen rows.
sheet.deleteRows(numRows + 1, maxRows - numRows);
}
// If last data column is less than maximium column, then deletes columns after the last data column.
if (numColumns < maxColumns) {
numColumns = Math.max(numColumns, numFrozenColumns + 1); // Don't crop empty frozen columns.
sheet.deleteColumns(numColumns + 1, maxColumns - numColumns);
}
}
Wanneer je de sheets als UI gebruikt en vanuit Apps Script het visuele conditioneel wil aanpassen, dan kan je gebruik maken van de tools die ook in de standaard werking vervat zitten.
Het toepassen van conditionele formatting, toekennen van kleuren bij bepaalde waardes etc, kan je enkel door het toevoegen van een set (array) van rules aan de sheet.
Hiervoor wordt er gebruik gemaakt van de SpreadsheetApp methode newConditionalFormatRule()
In volgende voorbeeld wordt de kolom E, na de header (vanaf E2) gekleurd door verschillende niveaus te controleren (tussen 0 en -3 en groter dan nul)>
Door de array te vullen met rules kan je nadien alle conditionele formattering in één keer activeren op de sheet.
Wil je de reeds manueel aangepaste settings hergebruiken, dan kan je de bestaande rules aanvullen, door deze eerst in te lezen (getConditionalFormatRules()).
Meer uitleg en variatie kan je vinden in: Class ConditionalFormatRuleBuilder
// conditional formatting
let Sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("RXcompare");
Sheet.clearConditionalFormatRules()
//Sheet.getConditionalFormatRules()
var rules = [];
rules.push(createRule(Sheet, "E2:E", "=AND($E2<0,$E2>-3)", "#b7e1cd"));
rules.push(createRule(Sheet, "E2:E", "=$E2>=0", "#cc0000"));
Sheet.setConditionalFormatRules(rules);
SpreadsheetApp.flush();
/**
* Conditional formatting sheet
* exp:createRule(sheet, "A1:NH", "=A$1=TODAY()", "#b7e1cd")
* @param{string} sheet, name of sheet
* @param{string} rangeNotation, notation of cell ranges
* @param {string} formula
* @param {color} color
*
*/
function createRule(sheet, rangeNotation, formula, color) {
var range = sheet.getRange(rangeNotation);
var rule = SpreadsheetApp.newConditionalFormatRule()
.whenFormulaSatisfied(formula)
.setBackground(color)
.setRanges([range])
.build();
return rule;
}
zie ook: Charts Service en Google Charts
het maken van graffieken aan de hand van data, kan ook vanuit Apps Script geautomatiseerd worden.
De bovenstaande service wordt gebruikt om de graffieken in een webpagina te gieten. (html5).
zie ook : Class EmbeddedColumnChartBuilder
Wanneer je echter in een sheet een chart wil tonen, dan maak je gebruik van de Embedded ChartBuilder Class van de Sheet API.
RADAR charts zijn een speciale vorm van charts, waarbij de datapunten verdeeld worden over een circle omtrek en de afstand tot het center de waarde bepaald.
De Options die je kan gebruiken binnen een chart zijn eindeloos: Chart Options
toast is een non disruptive notification in Sheets, waarmee je meldingen kan geven.
// Switch view to RXcompare
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sht = ss.getSheetByName('Sheet1');
ss.setActiveSheet(sht);
ss.toast('Sheet1 calculated');