update 1904141128
This commit is contained in:
@@ -1,504 +0,0 @@
|
||||
/**
|
||||
* Updated: 2019-04-12
|
||||
*/
|
||||
|
||||
|
||||
/** Descriptions **/
|
||||
|
||||
function RangeDescription(value, row, column, desc) {
|
||||
/*
|
||||
* arguments: [value[, row[, column[, desc]]]]
|
||||
*
|
||||
* value -> any type
|
||||
* row -> integer (>0)
|
||||
* column -> integer (>0)
|
||||
* desc -> object containing full range description to override default settings
|
||||
*
|
||||
*/
|
||||
|
||||
var tag = 'range',
|
||||
sheetName = '',
|
||||
row = (row && typeof row == 'number') ? row : 1,
|
||||
column = (column && typeof column == 'number') ? column : 1,
|
||||
height = 1, width = 1,
|
||||
mustMerge = true, // options: true, false, 'vertically', 'across'
|
||||
wrapStrategy = SpreadsheetApp.WrapStrategy.CLIP,
|
||||
numberFormat = '@',
|
||||
background = '#efefef',
|
||||
validation = null,
|
||||
value = (value) ? value : '',
|
||||
protection = false, // options: true, false, 'warning'
|
||||
unprotected = false;
|
||||
|
||||
if (desc) {
|
||||
if (isPropDefined(desc, 'tag')) tag = desc.tag;
|
||||
if (desc.hasOwnProperty('sheetName') && typeof desc.sheetName == 'string') sheetName = desc.sheetName;
|
||||
if (desc.hasOwnProperty('row') && typeof desc.row == 'number') row = desc.row;
|
||||
if (desc.hasOwnProperty('column') && typeof desc.column == 'number') column = desc.column;
|
||||
if (desc.hasOwnProperty('height') && typeof desc.height == 'number') height = desc.height;
|
||||
if (desc.hasOwnProperty('width') && typeof desc.width == 'number') width = desc.width;
|
||||
if (isPropDefined(desc, 'mustMerge')) mustMerge = desc.mustMerge;
|
||||
if (isPropDefined(desc, 'wrapStrategy')) wrapStrategy = desc.wrapStrategy;
|
||||
if (isPropDefined(desc, 'numberFormat')) numberFormat = desc.numberFormat;
|
||||
if (isPropDefined(desc, 'background')) background = desc.background;
|
||||
if (isPropDefined(desc, 'validation')) validation = desc.validation;
|
||||
if (isPropDefined(desc, 'value')) value = desc.value;
|
||||
|
||||
if (isPropDefined(desc, 'protection')) protection = desc.protection;
|
||||
if (isPropDefined(desc, 'unprotected')) unprotected = desc.unprotected;
|
||||
}
|
||||
|
||||
function Border() {
|
||||
|
||||
var top = null, left = null, bottom = null, right = null,
|
||||
vertical = null, horizontal = null,
|
||||
color = null, style = null;
|
||||
|
||||
if (desc && isPropDefined(desc, 'border')) {
|
||||
var border = desc.border;
|
||||
if (isPropDefined(border, 'top')) top = border.top;
|
||||
if (isPropDefined(border, 'left')) left = border.left;
|
||||
if (isPropDefined(border, 'bottom')) bottom = border.bottom;
|
||||
if (isPropDefined(border, 'right')) right = border.right;
|
||||
if (isPropDefined(border, 'vertical')) vertical = border.vertical;
|
||||
if (isPropDefined(border, 'horizontal')) horizontal = border.horizontal;
|
||||
if (isPropDefined(border, 'color')) color = border.color;
|
||||
if (isPropDefined(border, 'style')) style = border.style;
|
||||
}
|
||||
|
||||
this.top = top;
|
||||
this.left = left;
|
||||
this.bottom = bottom;
|
||||
this.right = right;
|
||||
this.vertical = vertical;
|
||||
this.horizontal = horizontal;
|
||||
this.color = color;
|
||||
this.style = style;
|
||||
|
||||
}
|
||||
|
||||
function Alignment() {
|
||||
|
||||
var vertical = 'middle', horizontal = 'center';
|
||||
|
||||
if (desc && isPropDefined(desc, 'alignment')) {
|
||||
var alignment = desc.alignment;
|
||||
if (isPropDefined(alignment, 'vertical')) vertical = alignment.vertical;
|
||||
if (isPropDefined(alignment, 'horizontal')) horizontal = alignment.horizontal;
|
||||
}
|
||||
|
||||
this.vertical = vertical;
|
||||
this.horizontal = horizontal;
|
||||
|
||||
}
|
||||
|
||||
function Font() {
|
||||
|
||||
var family = 'Inconsolata',
|
||||
color = null,
|
||||
size = 10,
|
||||
weight = 'normal',
|
||||
style = 'normal',
|
||||
line = 'none';
|
||||
|
||||
if (desc && isPropDefined(desc, 'font')) {
|
||||
var font = desc.font;
|
||||
if (isPropDefined(font, 'family')) family = font.family;
|
||||
if (isPropDefined(font, 'color')) color = font.color;
|
||||
if (isPropDefined(font, 'size')) size = font.size;
|
||||
if (isPropDefined(font, 'weight')) weight = font.weight;
|
||||
if (isPropDefined(font, 'style')) style = font.style;
|
||||
if (isPropDefined(font, 'line')) line = font.line;
|
||||
}
|
||||
|
||||
this.family = family;
|
||||
this.color = color;
|
||||
this.size = size;
|
||||
this.weight = weight;
|
||||
this.style = style;
|
||||
this.line = line;
|
||||
|
||||
}
|
||||
|
||||
function Indent() {
|
||||
|
||||
var left = 0, right = 0;
|
||||
|
||||
if (desc && isPropDefined(desc, 'indent')) {
|
||||
var indent = desc.indent;
|
||||
if (isPropDefined(indent, 'left')) left = indent.left;
|
||||
if (isPropDefined(indent, 'right')) right = indent.right;
|
||||
}
|
||||
|
||||
this.left = left;
|
||||
this.right = right;
|
||||
|
||||
}
|
||||
|
||||
// Meta
|
||||
this.tag = tag;
|
||||
|
||||
// Range
|
||||
this.sheetName = sheetName;
|
||||
this.row = row;
|
||||
this.column = column;
|
||||
this.height = height;
|
||||
this.width = width;
|
||||
this.mustMerge = mustMerge;
|
||||
|
||||
// Appearance
|
||||
this.wrapStrategy = wrapStrategy;
|
||||
this.numberFormat = numberFormat;
|
||||
this.background = background;
|
||||
this.border = new Border;
|
||||
this.alignment = new Alignment;
|
||||
this.font = new Font;
|
||||
this.indent = new Indent;
|
||||
|
||||
// Data
|
||||
this.validation = validation;
|
||||
this.value = value;
|
||||
|
||||
// Protection
|
||||
this.protection = protection;
|
||||
this.unprotected = unprotected;
|
||||
|
||||
}
|
||||
|
||||
function SheetDescription(height, width, sheetName) {
|
||||
/*
|
||||
* arguments: [height[, width[, sheetName]]]
|
||||
*
|
||||
* height -> integer (>0) || array of integers(>0) representing different row heights
|
||||
* width -> integer (>0) || array of integers(>0) representing different column widths
|
||||
* sheetName -> string
|
||||
*
|
||||
*/
|
||||
|
||||
if (!height) height = 1;
|
||||
if (!width) width = 1;
|
||||
|
||||
var rowHeight = 21, columnWidth = 100;
|
||||
|
||||
if (Array.isArray(height)) {
|
||||
if (height.every(function(n) { return typeof n == 'number'; })) {
|
||||
rowHeight = height;
|
||||
height = height.length;
|
||||
}
|
||||
}
|
||||
|
||||
if (Array.isArray(width)) {
|
||||
if (width.every(function(n) { return typeof n == 'number'; })) {
|
||||
columnWidth = width;
|
||||
width = width.length;
|
||||
}
|
||||
}
|
||||
|
||||
this.sheetName = (sheetName && typeof sheetName == 'string') ? sheetName : '';
|
||||
|
||||
// Dimensions
|
||||
this.height = height;
|
||||
this.width = width;
|
||||
this.rowHeight = rowHeight;
|
||||
this.columnWidth = columnWidth;
|
||||
this.frozenRows = 0;
|
||||
this.frozenColumns = 0;
|
||||
|
||||
// Body
|
||||
this.range = new RangeDescription(undefined, undefined, undefined, sheetName);
|
||||
this.range.height = height;
|
||||
this.range.width = width;
|
||||
this.range.mustMerge = false;
|
||||
this.hasGridlines = false;
|
||||
|
||||
// Protection
|
||||
this.protection = false;
|
||||
/* must be either false or object (may be ommitted or deleted)
|
||||
* object: {
|
||||
* warning = boolean
|
||||
* unprotected = array of unprotected ranges
|
||||
* }
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
|
||||
/** Builders **/
|
||||
|
||||
function buildRange(desc) {
|
||||
/*
|
||||
* arguments: desc
|
||||
*
|
||||
* desc -> object containing full range description
|
||||
*
|
||||
*/
|
||||
|
||||
var ss = SpreadsheetApp.getActive(),
|
||||
sheet = (desc.sheetName) ? ss.getSheetByName(desc.sheetName) : ss.getActiveSheet(),
|
||||
range = sheet.getRange(desc.row, desc.column, desc.height, desc.width),
|
||||
cell = sheet.getRange(desc.row, desc.column);
|
||||
|
||||
var value = desc.value;
|
||||
if (value && typeof value == 'string') {
|
||||
var left = desc.indent.left,
|
||||
right = desc.indent.right;
|
||||
if (left || right) {
|
||||
polyfills__String_repeat();
|
||||
var lI = (left) ? ' '.repeat(left) : '',
|
||||
rI = (right) ? ' '.repeat(right) : '';
|
||||
value = lI + value + rI;
|
||||
}
|
||||
}
|
||||
|
||||
if (desc.mustMerge) {
|
||||
switch (desc.mustMerge) {
|
||||
case 'vertically': range.mergeVertically(); break;
|
||||
case 'across': range.mergeAcross(); break;
|
||||
default: range.merge();
|
||||
}
|
||||
} else range.breakApart();
|
||||
|
||||
range
|
||||
.setBorder(
|
||||
desc.border.top, desc.border.left,
|
||||
desc.border.bottom, desc.border.right,
|
||||
desc.border.vertical, desc.border.horizontal,
|
||||
desc.border.color, desc.border.style
|
||||
)
|
||||
.setWrapStrategy(desc.wrapStrategy)
|
||||
.setNumberFormat(desc.numberFormat)
|
||||
.setHorizontalAlignment(desc.alignment.horizontal)
|
||||
.setVerticalAlignment(desc.alignment.vertical)
|
||||
.setBackground(desc.background)
|
||||
.setFontColor(desc.font.color)
|
||||
.setFontFamily(desc.font.family)
|
||||
.setFontSize(desc.font.size)
|
||||
.setFontLine(desc.font.line)
|
||||
.setFontWeight(desc.font.weight)
|
||||
.setFontStyle(desc.font.style)
|
||||
.setDataValidation(desc.validation);
|
||||
|
||||
cell.setValue(value);
|
||||
|
||||
}
|
||||
|
||||
function buildRanges(descArr) {
|
||||
/*
|
||||
* arguments: descArr
|
||||
*
|
||||
* descArr -> array of objects containing full range descriptions
|
||||
*
|
||||
*/
|
||||
|
||||
if (Array.isArray(descArr)) {
|
||||
for (var i = 0; i < descArr.length; i++) buildRange(descArr[i]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function buildSheet(desc, rangeArr, isNew) {
|
||||
/*
|
||||
* arguments: desc[, rangeArr[, isNew]]
|
||||
*
|
||||
* desc -> object containing full sheet description
|
||||
* rangeArr -> function to run after
|
||||
* isNew -> boolean (false by default)
|
||||
*/
|
||||
|
||||
if (!isNew) isNew = false;
|
||||
|
||||
var ss = SpreadsheetApp.getActive();
|
||||
var sheet, index, unprotected1 = [], unprotected2 = [];
|
||||
|
||||
var sheetName = (desc.sheetName) ? desc.sheetName : undefined,
|
||||
height = desc.height,
|
||||
width = desc.width,
|
||||
rowHeight = desc.rowHeight,
|
||||
columnWidth = desc.columnWidth,
|
||||
frozenRows = desc.frozenRows,
|
||||
frozenColumns = desc.frozenColumns;
|
||||
|
||||
if (isNew) {
|
||||
(sheetName) ? ss.insertSheet(sheetName) : ss.insertSheet();
|
||||
sheet = ss.getActiveSheet();
|
||||
} else {
|
||||
sheet = (sheetName) ? ss.getSheetByName(sheetName) : ss.getActiveSheet();
|
||||
}
|
||||
|
||||
index = sheet.getIndex() - 1;
|
||||
|
||||
shrinkSheet(sheet);
|
||||
|
||||
sheet.setHiddenGridlines(!desc.hasGridlines);
|
||||
|
||||
if (height > 1) sheet.insertRowsAfter(1, height - 1);
|
||||
if (width > 1) sheet.insertColumnsAfter(1, width - 1);
|
||||
|
||||
if (Array.isArray(rowHeight)) {
|
||||
for (var r = 0; r < rowHeight.length; r++) {
|
||||
sheet.setRowHeight(r + 1, rowHeight[r]);
|
||||
}
|
||||
} else {
|
||||
sheet.setRowHeights(1, height, rowHeight);
|
||||
}
|
||||
|
||||
if (Array.isArray(columnWidth)) {
|
||||
for (var c = 0; c < columnWidth.length; c++) {
|
||||
sheet.setColumnWidth(c + 1, columnWidth[c]);
|
||||
}
|
||||
} else {
|
||||
sheet.setColumnWidths(1, width, columnWidth);
|
||||
}
|
||||
|
||||
if (frozenRows && frozenRows < height) sheet.setFrozenRows(frozenRows);
|
||||
if (frozenColumns && frozenColumns < width) sheet.setFrozenColumns(frozenColumns);
|
||||
|
||||
if (rangeArr && Array.isArray(rangeArr)) {
|
||||
|
||||
for (var r = 0; r < rangeArr.length; r++) {
|
||||
var rng = rangeArr[r];
|
||||
if (sheetName) rng.sheetName = sheetName;
|
||||
if (rng.unprotected) {
|
||||
unprotected1.push(sheet.getRange(rng.row, rng.column, rng.height, rng.width));
|
||||
if (unprotected1.length == 1) sheet.setCurrentCell(sheet.getRange(rng.row, rng.column));
|
||||
}
|
||||
}
|
||||
|
||||
buildRanges(rangeArr);
|
||||
|
||||
}
|
||||
|
||||
var protection = ss.getProtections(SpreadsheetApp.ProtectionType.SHEET)[index];
|
||||
if (protection) protection.remove();
|
||||
|
||||
if (desc.hasOwnProperty('protection') && desc.protection) {
|
||||
|
||||
protection = sheet.protect();
|
||||
|
||||
if (desc.protection.hasOwnProperty('warning') && desc.protection.warning) {
|
||||
protection.setWarningOnly(true);
|
||||
} else {
|
||||
var owner = ss.getOwner();
|
||||
protection.addEditor(owner);
|
||||
protection.removeEditors(protection.getEditors());
|
||||
}
|
||||
|
||||
var hasUnprotected = isPropDefined(desc.protection, 'unprotected');
|
||||
|
||||
if (hasUnprotected || unprotected1.length) {
|
||||
|
||||
if (hasUnprotected && desc.protection.unprotected.length) {
|
||||
unprotected2 = desc.protection.unprotected;
|
||||
}
|
||||
|
||||
var unprotected = unprotected1.concat(unprotected2);
|
||||
|
||||
if (unprotected.length) protection.setUnprotectedRanges(unprotected);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function buildValidation(desc, showArrow, allowInvalid) {
|
||||
/*
|
||||
* arguments: desc[, showArrow[, allowInvalid]]
|
||||
*
|
||||
* desc -> array of description entities, where index 0 is purpose and others are arguments
|
||||
* showArrow -> boolean, if true dropdown arrow will appear in dropdown type of validation
|
||||
* allowInvalid -> boolean, if true will allow validation override
|
||||
*
|
||||
*/
|
||||
|
||||
if (desc) {
|
||||
|
||||
var validation = SpreadsheetApp.newDataValidation(),
|
||||
purpose = desc[0];
|
||||
(showArrow == undefined || showArrow == null) ? showArrow = true : showArrow = showArrow;
|
||||
(allowInvalid == undefined) ? allowInvalid = false : allowInvalid = allowInvalid;
|
||||
|
||||
switch (purpose) {
|
||||
|
||||
// Dates
|
||||
case 'date': validation.requireDate(); break;
|
||||
case 'date =': validation = validation.requireDateEqualTo(date(desc[1])); break;
|
||||
case 'date >': validation = validation.requireDateAfter(date(desc[1])); break;
|
||||
case 'date >=': validation = validation.requireDateOnOrAfter(date(desc[1])); break;
|
||||
case 'date <': validation = validation.requireDateBefore(date(desc[1])); break;
|
||||
case 'date <=': validation = validation.requireDateOnOrBefore(date(desc[1])); break;
|
||||
case 'date <=>': validation = validation.requireDateBetween(date(desc[1]), date(desc[2])); break;
|
||||
case 'date <>': validation = validation.requireDateNotBetween(date(desc[1]), date(desc[2])); break;
|
||||
|
||||
// Numbers
|
||||
case 'number =': validation = validation.requireNumberEqualTo(desc[1]); break;
|
||||
case 'number !=': validation = validation.requireNumberNotEqualTo(desc[1]); break;
|
||||
case 'number >': validation = validation.requireNumberGreaterThan(desc[1]); break;
|
||||
case 'number >=': validation = validation.requireNumberGreaterThanOrEqualTo(desc[1]); break;
|
||||
case 'number <': validation = validation.requireNumberLessThan(desc[1]); break;
|
||||
case 'number <=': validation = validation.requireNumberLessThanOrEqualTo(desc[1]); break;
|
||||
case 'number <=>': validation = validation.requireNumberBetween(desc[1], desc[2]); break;
|
||||
case 'number <>': validation = validation.requireNumberNotBetween(desc[1], desc[2]); break;
|
||||
|
||||
// Text
|
||||
case 'text =': validation = requireTextEqualTo(desc[1]); break;
|
||||
case 'text +': validation = requireTextContallowInvalidns(desc[1]); break;
|
||||
case 'text -': validation = requireTextDoesNotContallowInvalidn(desc[1]); break;
|
||||
|
||||
// Misc
|
||||
case 'checkbox':
|
||||
if (desc[1]) {
|
||||
if (desc[2]) validation = validation.requireCheckbox(desc[1], desc[2]);
|
||||
else validation = validation.requireCheckbox(desc[1]);
|
||||
} else validation = validation.requireCheckbox();
|
||||
break;
|
||||
case 'formula': validation = validation.requireFormulaSatisfied(desc[1]); break;
|
||||
case 'emallowInvalidl': validation = validation.requireTextIsEmallowInvalidl(); break;
|
||||
case 'url': validation = validation.requireTextIsUrl(); break;
|
||||
case 'list': validation = validation.requireValueInList(desc[1], showArrow); break;
|
||||
case 'range': validation = validation.requireValueInRange(desc[1], showArrow); break;
|
||||
|
||||
}
|
||||
|
||||
validation = validation.setAllowInvalid(allowInvalid).build();
|
||||
|
||||
return validation;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/** Misc **/
|
||||
|
||||
function shrinkSheet(sheet) {
|
||||
/*
|
||||
* arguments: sheet
|
||||
*
|
||||
* sheet -> sheet object
|
||||
*
|
||||
*/
|
||||
|
||||
var u;
|
||||
|
||||
var maxRows = sheet.getMaxRows(),
|
||||
maxColumns = sheet.getMaxColumns(),
|
||||
frozenRows = sheet.getFrozenRows(),
|
||||
frozenColumns = sheet.getFrozenColumns();
|
||||
|
||||
if (frozenRows) sheet.setFrozenRows(0);
|
||||
if (frozenColumns) sheet.setFrozenColumns(0);
|
||||
if (maxRows > 1) sheet.deleteRows(2, maxRows - 1);
|
||||
if (maxColumns > 1) sheet.deleteColumns(2, maxColumns - 1);
|
||||
|
||||
desc = new SheetDescription;
|
||||
sheet.setRowHeight(1, desc.rowHeight);
|
||||
sheet.setColumnWidth(1, desc.columnWidth);
|
||||
sheet.setHiddenGridlines(false);
|
||||
|
||||
buildRange(new RangeDescription(u, u, u, {
|
||||
sheetName: sheet.getName(),
|
||||
font: { color: new RangeDescription().background }
|
||||
}));
|
||||
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
/**
|
||||
* Updated: 2019-04-12
|
||||
*/
|
||||
|
||||
|
||||
/** Edit Response **/
|
||||
|
||||
function executeEditResponse(eventDesc) {
|
||||
/*
|
||||
* arguments: eventDesc
|
||||
*
|
||||
* eventDesc -> Edit Event description object
|
||||
*
|
||||
*/
|
||||
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
/**
|
||||
* Updated: 2019-04-12
|
||||
*/
|
||||
|
||||
|
||||
/** Edit Event **/
|
||||
|
||||
function onEdit(e) {
|
||||
/*
|
||||
* arguments: e
|
||||
*
|
||||
* e -> Edit Event object
|
||||
*
|
||||
*/
|
||||
|
||||
var $ = new Edit(e);
|
||||
|
||||
executeEditResponse($);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/** Open Event **/
|
||||
|
||||
function onOpen() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
/** Change Event **/
|
||||
|
||||
function onChange() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
/** Misc **/
|
||||
|
||||
function Edit(evt) {
|
||||
/*
|
||||
* arguments: evt
|
||||
*
|
||||
* evt -> Edit Event object
|
||||
*
|
||||
*/
|
||||
|
||||
var ss = SpreadsheetApp.getActive(),
|
||||
sheet = ss.getActiveSheet(),
|
||||
sheetName = activeSheet.getName(),
|
||||
range = evt.range,
|
||||
row = range.getRow(),
|
||||
column = range.getColumn(),
|
||||
value = range.getValue(),
|
||||
oldValue = evt.oldValue;
|
||||
|
||||
if (typeof value == 'string') value = value.trim();
|
||||
|
||||
this.ss = ss;
|
||||
this.sheet = sheet;
|
||||
this.sheetName = sheetName;
|
||||
this.range = range;
|
||||
this.row = row;
|
||||
this.column = column;
|
||||
this.value = value;
|
||||
this.oldValue = oldValue;
|
||||
|
||||
}
|
||||
@@ -1,315 +0,0 @@
|
||||
/**
|
||||
* Updated: 2019-04-12
|
||||
*/
|
||||
|
||||
|
||||
/** Form Entities **/
|
||||
|
||||
function Title_(value, row, column, height, width, horizontalAlignment, omitIndent) {
|
||||
/*
|
||||
* arguments: [value[, row[, column[, height[, width[, horizontalAlignment[, omitIndent]]]]]]]
|
||||
*
|
||||
* value -> string
|
||||
* row -> integer (>0)
|
||||
* column -> integer (>0)
|
||||
* height -> integer (>0)
|
||||
* width -> integer (>0)
|
||||
* horizontalAlignment -> selection op string options "left", "right" and "center" to override existing setting
|
||||
* omitIndent -> boolean, if true indent will not be applied
|
||||
*
|
||||
*/
|
||||
|
||||
return new RangeDescription(value, row, column, {
|
||||
height: (height) ? height : undefined,
|
||||
width: (width) ? width : undefined,
|
||||
font: { family: 'Montserrat', size: 12, color: '#434343', weight: 'bold', line: 'underline' },
|
||||
alignment: (horizontalAlignment) ? { horizontal: horizontalAlignment } : undefined,
|
||||
indent: (omitIndent) ? undefined : { left: 2, right: 2 },
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function HeaderMain_(value, row, column, height, width, horizontalAlignment, omitIndent) {
|
||||
/*
|
||||
* arguments: [value[, row[, column[, height[, width[, horizontalAlignment[, omitIndent]]]]]]]
|
||||
*
|
||||
* value -> string
|
||||
* row -> integer (>0)
|
||||
* column -> integer (>0)
|
||||
* height -> integer (>0)
|
||||
* width -> integer (>0)
|
||||
* horizontalAlignment -> selection op string options "left", "right" and "center" to override existing setting
|
||||
* omitIndent -> boolean, if true indent will not be applied
|
||||
*
|
||||
*/
|
||||
|
||||
return new RangeDescription(value, row, column, {
|
||||
height: (height) ? height : undefined,
|
||||
width: (width) ? width : undefined,
|
||||
font: { family: 'Roboto', size: 11, color: '#cccccc' },
|
||||
background: 'black',
|
||||
border: {
|
||||
top: true,
|
||||
left: true,
|
||||
bottom: true,
|
||||
right: true,
|
||||
color: Title_().font.color,
|
||||
},
|
||||
alignment: (horizontalAlignment) ? { horizontal: horizontalAlignment } : undefined,
|
||||
indent: (omitIndent) ? undefined : { left: 2, right: 2 },
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function Header_(value, row, column, height, width, horizontalAlignment, omitIndent) {
|
||||
/*
|
||||
* arguments: [value[, row[, column[, height[, width[, horizontalAlignment[, omitIndent]]]]]]]
|
||||
*
|
||||
* value -> string
|
||||
* row -> integer (>0)
|
||||
* column -> integer (>0)
|
||||
* height -> integer (>0)
|
||||
* width -> integer (>0)
|
||||
* horizontalAlignment -> selection op string options "left", "right" and "center" to override existing setting
|
||||
* omitIndent -> boolean, if true indent will not be applied
|
||||
*
|
||||
*/
|
||||
|
||||
return new RangeDescription(value, row, column, {
|
||||
height: (height) ? height : undefined,
|
||||
width: (width) ? width : undefined,
|
||||
font: { family: 'Roboto', size: 10, color: '#434343', style: 'italic' },
|
||||
border: {
|
||||
top: true,
|
||||
left: true,
|
||||
bottom: true,
|
||||
right: true,
|
||||
color: Title_().font.color,
|
||||
},
|
||||
alignment: (horizontalAlignment) ? { horizontal: horizontalAlignment } : undefined,
|
||||
indent: (omitIndent) ? undefined : { left: 2, right: 2 },
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function Label_(value, required, row, column, height, width, omitIndent, applyBorder) {
|
||||
/*
|
||||
* arguments: value[, required[, row[, column[, height[, width[, omitIndent[, applyBorder]]]]]]]
|
||||
*
|
||||
* value -> string
|
||||
* required -> boolean, determines if label points at required field
|
||||
* row -> integer (>0)
|
||||
* column -> integer (>0)
|
||||
* height -> integer (>0)
|
||||
* width -> integer (>0)
|
||||
* omitIndent -> boolean, if true indent will not be applied
|
||||
* applyBorder -> boolean, if true border will be applied
|
||||
*
|
||||
*/
|
||||
|
||||
if (value && typeof value == 'string') {
|
||||
|
||||
var fontColor = '#666666';
|
||||
if (required) {
|
||||
value += ' *';
|
||||
fontColor = '#134f5c';
|
||||
}
|
||||
|
||||
return new RangeDescription(value, row, column, {
|
||||
height: (height) ? height : undefined,
|
||||
width: (width) ? width : undefined,
|
||||
wrapStrategy: (!height && !width && !applyBorder) ? SpreadsheetApp.WrapStrategy.OVERFLOW : undefined,
|
||||
alignment: { horizontal: 'right' },
|
||||
font: { family: 'Roboto', color: fontColor },
|
||||
border: (applyBorder) ? {
|
||||
top: true,
|
||||
left: true,
|
||||
bottom: true,
|
||||
right: true,
|
||||
color: Title_().font.color,
|
||||
} : undefined,
|
||||
indent: (omitIndent) ? undefined : { right: 2 },
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function Cell_(value, row, column, height, width, numberFormat, horizontalAlignment, omitIndent) {
|
||||
/*
|
||||
* arguments: [value[, row[, column[, height[, width[, numberFormat[, horizontalAlignment[, omitIndent]]]]]]]]
|
||||
*
|
||||
* value -> any type
|
||||
* row -> integer (>0)
|
||||
* column -> integer (>0)
|
||||
* height -> integer (>0)
|
||||
* width -> integer (>0)
|
||||
* numberFormat -> string reprsenting format pattern
|
||||
* horizontalAlignment -> selection op string options "left", "right" and "center" to override existing setting
|
||||
* omitIndent -> boolean, if true indent will not be applied
|
||||
*
|
||||
*/
|
||||
|
||||
return new RangeDescription(value, row, column, {
|
||||
height: (height) ? height : undefined,
|
||||
width: (width) ? width : undefined,
|
||||
numberFormat: (numberFormat) ? numberFormat : undefined,
|
||||
font: { family: 'Poppins', size: 11 },
|
||||
border: {
|
||||
top: true,
|
||||
left: true,
|
||||
bottom: true,
|
||||
right: true,
|
||||
color: Title_().font.color,
|
||||
},
|
||||
alignment: (horizontalAlignment) ? { horizontal: horizontalAlignment } : undefined,
|
||||
indent: (omitIndent) ? undefined : { left: 2, right: 2 },
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function InputRequired_(value, row, column, height, width, validation, numberFormat, horizontalAlignment, unprotected) {
|
||||
/*
|
||||
* arguments: [value [,row[, column[, height[, width[, validation[, numberFormat[, horizontalAlignment[, unprotected]]]]]]]]]
|
||||
*
|
||||
* value -> any type
|
||||
* row -> integer (>0)
|
||||
* column -> integer (>0)
|
||||
* height -> integer (>0)
|
||||
* width -> integer (>0)
|
||||
* validation -> data validation object
|
||||
* numberFormat -> string reprsenting format pattern
|
||||
* horizontalAlignment -> selection op string options "left", "right" and "center" to override existing setting
|
||||
* unprotected -> boolean, if false the range will be protected along with protected sheet
|
||||
*
|
||||
*/
|
||||
|
||||
if (unprotected == undefined) unprotected = true;
|
||||
|
||||
return new RangeDescription(value, row, column, {
|
||||
tag: 'input',
|
||||
height: (height) ? height : undefined,
|
||||
width: (width) ? width : undefined,
|
||||
numberFormat: (numberFormat) ? numberFormat : undefined,
|
||||
font: { family: 'Poppins', size: 11, weight: 'bold' },
|
||||
background: '#c9daf8',
|
||||
border: {
|
||||
top: true,
|
||||
left: true,
|
||||
bottom: true,
|
||||
right: true,
|
||||
color: Title_().font.color,
|
||||
},
|
||||
alignment: (horizontalAlignment) ? { horizontal: horizontalAlignment } : undefined,
|
||||
validation: (validation) ? validation : undefined,
|
||||
unprotected: unprotected,
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function InputOptional_(value, row, column, height, width, validation, numberFormat, horizontalAlignment, unprotected) {
|
||||
/*
|
||||
* arguments: [value [,row[, column[, height[, width[, validation[, numberFormat[, horizontalAlignment[, unprotected]]]]]]]]]
|
||||
*
|
||||
* value -> any type
|
||||
* row -> integer (>0)
|
||||
* column -> integer (>0)
|
||||
* height -> integer (>0)
|
||||
* width -> integer (>0)
|
||||
* validation -> data validation object
|
||||
* numberFormat -> string reprsenting format pattern
|
||||
* horizontalAlignment -> selection op string options "left", "right" and "center" to override existing setting
|
||||
* unprotected -> boolean, if false the range will be protected along with protected sheet
|
||||
*
|
||||
*/
|
||||
|
||||
if (unprotected == undefined) unprotected = true;
|
||||
|
||||
return new RangeDescription(value, row, column, {
|
||||
tag: 'input',
|
||||
height: (height) ? height : undefined,
|
||||
width: (width) ? width : undefined,
|
||||
numberFormat: (numberFormat) ? numberFormat : undefined,
|
||||
font: { family: 'Poppins', size: 11, weight: 'bold' },
|
||||
background: '#d0e0e3',
|
||||
border: {
|
||||
top: true,
|
||||
left: true,
|
||||
bottom: true,
|
||||
right: true,
|
||||
color: Title_().font.color,
|
||||
},
|
||||
alignment: (horizontalAlignment) ? { horizontal: horizontalAlignment } : undefined,
|
||||
validation: (validation) ? validation : undefined,
|
||||
unprotected: unprotected,
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function InputAction_(value, row, column, height, width, validation) {
|
||||
/*
|
||||
* arguments: [value [,row[, column[, height[, width[, validation]]]]]]
|
||||
*
|
||||
* value -> any type
|
||||
* row -> integer (>0)
|
||||
* column -> integer (>0)
|
||||
* height -> integer (>0)
|
||||
* width -> integer (>0)
|
||||
* validation -> data validation object
|
||||
*
|
||||
*/
|
||||
|
||||
return new RangeDescription(value, row, column, {
|
||||
tag: 'input',
|
||||
height: (height) ? height : undefined,
|
||||
width: (width) ? width : undefined,
|
||||
font: { family: 'Poppins', color: 'blue', size: 11, weight: 'bold' },
|
||||
background: '#d9ead3',
|
||||
border: {
|
||||
top: true,
|
||||
left: true,
|
||||
bottom: true,
|
||||
right: true,
|
||||
color: Title_().font.color,
|
||||
},
|
||||
validation: (validation) ? validation : undefined,
|
||||
unprotected: true,
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function Checkbox_(row, column, value, horizontalAlignment, applyBorder, height, width) {
|
||||
/*
|
||||
* arguments: [row[, column[, value[, horizontalAlignment[, applyBorder[, height[, width]]]]]]]
|
||||
*
|
||||
* row -> integer (>0)
|
||||
* column -> integer (>0)
|
||||
* value -> boolean (false by default)
|
||||
* horizontalAlignment -> selection op string options "left", "right" and "center" to override existing setting
|
||||
* applyBorder -> boolean, if true border will be applied
|
||||
* height -> integer (>0)
|
||||
* width -> integer (>0)
|
||||
*
|
||||
*/
|
||||
|
||||
if (value == undefined) value = false;
|
||||
|
||||
return new RangeDescription(value, row, column, {
|
||||
tag: 'input',
|
||||
height: (height) ? height : undefined,
|
||||
width: (width) ? width : undefined,
|
||||
font: { color: Label_('/').font.color },
|
||||
numberFormat: new Formats().auto,
|
||||
border: (applyBorder) ? {
|
||||
top: true,
|
||||
left: true,
|
||||
bottom: true,
|
||||
right: true,
|
||||
color: Title_().font.color,
|
||||
} : undefined,
|
||||
alignment: (horizontalAlignment) ? { horizontal: horizontalAlignment } : undefined,
|
||||
validation: buildValidation(['checkbox']),
|
||||
unprotected: true,
|
||||
});
|
||||
|
||||
}
|
||||
@@ -1,140 +0,0 @@
|
||||
/**
|
||||
* Updated: 2019-04-12
|
||||
*/
|
||||
|
||||
|
||||
/** Formats **/
|
||||
|
||||
function Formats() {
|
||||
|
||||
this.auto = '0.###############';
|
||||
this.text = '@';
|
||||
this.date = {
|
||||
reversed: 'yyyy-mm-dd',
|
||||
us: 'mm/dd/yyyy',
|
||||
intl: 'dd.mm.yyyy',
|
||||
month_short: 'mmm d, yyyy',
|
||||
month_long: 'mmmm d, yyyy',
|
||||
};
|
||||
this.dollar = {
|
||||
no_text: [
|
||||
'$#,##0.00;;;',
|
||||
'$#,##0.00;($#,##0.00);;',
|
||||
'$#,##0.00;($#,##0.00);$0.00;'
|
||||
],
|
||||
text_allowed: [
|
||||
'$#,##0.00;;',
|
||||
'$#,##0.00;($#,##0.00);',
|
||||
'$#,##0.00;($#,##0.00);$0.00'
|
||||
],
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
|
||||
/** Converters **/
|
||||
|
||||
function convertLocalDateToEST(params) {
|
||||
/*
|
||||
* arguments: [params]
|
||||
*
|
||||
* paramas -> string representing time parameters
|
||||
*
|
||||
*/
|
||||
|
||||
var date;
|
||||
|
||||
if (params != undefined) date = new Date(params);
|
||||
else date = new Date;
|
||||
|
||||
return new Date(date.toLocaleString('en-US', { timeZone: 'America/New_York' }));
|
||||
|
||||
}
|
||||
|
||||
function convertDateToString(date, format) {
|
||||
/*
|
||||
* arguments: date, format
|
||||
*
|
||||
* date -> date object to convert to string
|
||||
* format -> string as date format representation
|
||||
*
|
||||
*/
|
||||
|
||||
var dateStr;
|
||||
|
||||
var yyyy = date.getFullYear(),
|
||||
yy = date.getYear(),
|
||||
month = date.getMonth(),
|
||||
calendarDay = date.getDate(),
|
||||
weekDay = date.getDay(),
|
||||
hours = date.getHours(),
|
||||
minutes = date.getMinutes(),
|
||||
seconds = date.getSeconds();
|
||||
|
||||
var ap_ = /\bam\/pm\b/gi, ap = 'AM';
|
||||
|
||||
if (format.search(ap) > -1 && hours > 12) {
|
||||
hours = hours - 12;
|
||||
ap = 'PM';
|
||||
}
|
||||
|
||||
var months = {
|
||||
short: [
|
||||
'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
|
||||
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'
|
||||
],
|
||||
long: [
|
||||
'January', 'February', 'March',
|
||||
'April', 'May', 'June',
|
||||
'July', 'August', 'September',
|
||||
'October', 'November', 'December'
|
||||
],
|
||||
};
|
||||
|
||||
var weekDays = {
|
||||
short: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
|
||||
long: [
|
||||
'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'
|
||||
],
|
||||
};
|
||||
|
||||
dateStr = format
|
||||
.replace(/\byyyy\b/gi, yyyy)
|
||||
.replace(/\byy\b/gi, yy)
|
||||
.replace(/\bmmmm\b/gi, months.long[month])
|
||||
.replace(/\bmmm\b/gi, months.short[month])
|
||||
.replace(/\bmm\b/g, ((month + 1) < 10) ? '0' + (month + 1) : month + 1)
|
||||
.replace(/\bm\b/gi, month + 1)
|
||||
.replace(/\bdddd\b/gi, weekDays.long[weekDay])
|
||||
.replace(/\bddd\b/gi, weekDays.short[weekDay])
|
||||
.replace(/\bdd\b/gi, (calendarDay < 10) ? '0' + calendarDay : calendarDay)
|
||||
.replace(/\bd\b/gi, calendarDay)
|
||||
.replace(/\bHH\b/g, (hours < 10) ? '0' + hours : hours)
|
||||
.replace(/\bMM\b/g, (minutes < 10) ? '0' + minutes : minutes)
|
||||
.replace(/\bSS\b/g, (seconds < 10) ? '0' + seconds : seconds)
|
||||
.replace(ap_, ap);;
|
||||
|
||||
return dateStr;
|
||||
|
||||
}
|
||||
|
||||
function convertDateStringReversedToUS(reversedDateStr) {
|
||||
/*
|
||||
* arguments: reversedDateStr
|
||||
*
|
||||
* reversedDateStr -> string representing date pattern "yyyy-mm-dd"
|
||||
*
|
||||
*/
|
||||
|
||||
if (
|
||||
reversedDateStr && typeof reversedDateStr == 'string' &&
|
||||
reversedDateStr.length == 10 &&
|
||||
reversedDateStr.search('-') == 4 &&
|
||||
reversedDateStr.lastIndexOf('-') == 7
|
||||
)
|
||||
{
|
||||
var d = reversedDateStr.split('-');
|
||||
return d[1] + '/' + d[2] + '/' + d[0];
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,143 +0,0 @@
|
||||
/**
|
||||
* Updated: 2019-04-10
|
||||
*/
|
||||
|
||||
|
||||
/** Simplifiers **/
|
||||
|
||||
function abc_() {
|
||||
return [
|
||||
, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
|
||||
, 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
|
||||
];
|
||||
}
|
||||
|
||||
function col(ltr_num, isUC) {
|
||||
/*
|
||||
* arguments: ltr_num[, isUC]
|
||||
*
|
||||
* ltr_num -> string of letters (len<=2) || integer (>0,len<=2)
|
||||
* isUC -> boolean determining if return column must be presented in upper case
|
||||
*
|
||||
*/
|
||||
|
||||
var abc = abc_();
|
||||
|
||||
if (typeof ltr_num == 'string') {
|
||||
|
||||
var colIdx,
|
||||
ltr = ltr_num.toLowerCase();
|
||||
if (ltr.length == 2) colIdx = abc.indexOf(ltr[0]) * 26 + abc.indexOf(ltr[1]);
|
||||
else colIdx = abc.indexOf(ltr[0]);
|
||||
return colIdx;
|
||||
|
||||
} else if (typeof ltr_num == 'number') {
|
||||
|
||||
var ltr, num = ltr_num;
|
||||
if (num > 26) ltr = abc[quotient(num, 26)] + abc[num % 26];
|
||||
else ltr = abc[num];
|
||||
if (isUC) ltr = ltr.toUpperCase();
|
||||
return ltr;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function quotient(n1, n2) {
|
||||
/*
|
||||
* arguments: n1, n2
|
||||
*
|
||||
* n1 -> integer
|
||||
* n2 -> integer
|
||||
*
|
||||
*/
|
||||
|
||||
return (n1 - (n1 % n2)) / n2;
|
||||
|
||||
}
|
||||
|
||||
function clone(source) {
|
||||
/*
|
||||
* arguments: source
|
||||
*
|
||||
* source -> object to clone
|
||||
*
|
||||
*/
|
||||
|
||||
var target = new Object();
|
||||
|
||||
for (var prop in source) {
|
||||
if (source.hasOwnProperty(prop)) {
|
||||
target[prop] = source[prop];
|
||||
}
|
||||
}
|
||||
|
||||
return target;
|
||||
|
||||
}
|
||||
|
||||
function isPropDefined(source, prop) {
|
||||
/*
|
||||
* arguments: source, prop
|
||||
*
|
||||
* source -> object to test
|
||||
* prop -> string representing object's property
|
||||
*
|
||||
*/
|
||||
|
||||
return source.hasOwnProperty(prop) && source[prop] != undefined;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/** Polyfills **/
|
||||
|
||||
// String
|
||||
|
||||
function polyfills__String_repeat() {
|
||||
/*
|
||||
* source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat
|
||||
*
|
||||
*/
|
||||
|
||||
if (!String.prototype.repeat) {
|
||||
String.prototype.repeat = function(count) {
|
||||
'use strict';
|
||||
if (this == null)
|
||||
throw new TypeError('can\'t convert ' + this + ' to object');
|
||||
|
||||
var str = '' + this;
|
||||
// To convert string to integer.
|
||||
count = +count;
|
||||
// Check NaN
|
||||
if (count != count)
|
||||
count = 0;
|
||||
|
||||
if (count < 0)
|
||||
throw new RangeError('repeat count must be non-negative');
|
||||
|
||||
if (count == Infinity)
|
||||
throw new RangeError('repeat count must be less than infinity');
|
||||
|
||||
count = Math.floor(count);
|
||||
if (str.length == 0 || count == 0)
|
||||
return '';
|
||||
|
||||
// Ensuring count is a 31-bit integer allows us to heavily optimize the
|
||||
// main part. But anyway, most current (August 2014) browsers can't handle
|
||||
// strings 1 << 28 chars or longer, so:
|
||||
if (str.length * count >= 1 << 28)
|
||||
throw new RangeError('repeat count must not overflow maximum string size');
|
||||
|
||||
var maxCount = str.length * count;
|
||||
count = Math.floor(Math.log(count) / Math.log(2));
|
||||
while (count) {
|
||||
str += str;
|
||||
count--;
|
||||
}
|
||||
str += str.substring(0, maxCount - str.length);
|
||||
return str;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
3
projects/json/urlfetch-activation/activation.json
Normal file
3
projects/json/urlfetch-activation/activation.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"activation": "success"
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
{\rtf1}
|
||||
Reference in New Issue
Block a user