apps_script/util.js (89 lines of code) (raw):
/**
* Copyright 2024 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
function cleanKey(str) {
if (!str) str = "";
return lower(sepArray(str, ":").join("."));
}
function lower(str) {
if (!str) str = "";
return rpSpaces(rmBracket(str)).toLowerCase();
}
function rpSpaces(str) {
if (!str) str = "";
return str.trim().replace(/\s+/g, "_");
}
function rmBracket(str) {
if (!str) str = "";
return str.replace(/\s*\(.*\)/, "").trim();
}
function sepArray(str, sep = ",") {
if (!str) str = "";
return str
.split(sep)
.map((value) => value.trim())
.filter((value) => value);
}
function mapData([headers, values], modifyEntry = () => {}) {
const data = values
.map((row) => {
let obj = {};
if (row.every((str) => !str)) {
return {};
}
headers.forEach((header, index) => {
obj[header] = row[index];
});
if (modifyEntry) {
obj = modifyEntry(obj);
}
return obj;
})
.filter((obj) => !!obj && Object.keys(obj).length > 0);
return data;
}
function readVerticalRange(rangeName, keyMap = {}, skipHeader = true) {
sheet = SpreadsheetApp.getActiveSpreadsheet();
range = sheet.getRangeByName(rangeName);
var values = range.getValues();
data = {};
if (skipHeader) values = values.slice(1);
for (const row of values) {
key = cleanKey(row[0]);
key = keyMap[key] || key;
if (key) {
data[key] = row.slice(1);
}
}
return data;
}
function readNamedRange(rangeName, keyMap = {}) {
sheet = SpreadsheetApp.getActiveSpreadsheet();
range = sheet.getRangeByName(rangeName);
if (!range) {
return [[], [], rangeName];
}
var values = range.getValues();
let headers = values[0];
let rangeValue = values.slice(1);
const newheaders = headers.map((key) => {
key = cleanKey(key);
return keyMap[key] || key;
});
return [newheaders, rangeValue];
}
function writeRange(data, tname) {
sheet = SpreadsheetApp.getActiveSpreadsheet();
range = sheet.getRangeByName(tname);
wRow = range.getRow() + 1;
wCol = range.getColumn();
writeRange = range
.getSheet()
.getRange(wRow, wCol, data.length, data[0].length);
writeRange.setValues(data);
}
function clearContentColumn(rangeTitle, rowLength) {
sheet = SpreadsheetApp.getActiveSpreadsheet();
range = sheet.getRangeByName(rangeTitle);
wRow = range.getRow() + 1;
wCol = range.getColumn();
clearRange = range.getSheet().getRange(wRow, wCol, rowLength, 1);
clearRange.clearContent();
}