Skip to content

Instantly share code, notes, and snippets.

@embarq
Created November 20, 2017 11:04
Show Gist options
  • Select an option

  • Save embarq/d2d3afe67d4805060d87732a5b4e7fa9 to your computer and use it in GitHub Desktop.

Select an option

Save embarq/d2d3afe67d4805060d87732a5b4e7fa9 to your computer and use it in GitHub Desktop.
This snippet evaluates different Google Spreadsheets value formats
function calc(_sheet) {
const ROW_OFFSET = 2;
const COL_OFFSET = 2;
const VALUE_COLS_COUNT = 6;
/**
* @type {Sheet}
*/
const sheet = _sheet || SpreadsheetApp.getActiveSheet();
/**
* @type {Array<any>}
*/
const rows = sheet
.getRange(ROW_OFFSET, COL_OFFSET, sheet.getLastRow() - 1, VALUE_COLS_COUNT)
.getValues();
/**
* @returns {Array<{ gold: number, bucks: number }>}
* @param {any} row
* @param {number} rowIndex
*/
function getPrice(row, rowIndex) {
const payload = { gold: 0, bucks: 0 };
return row.reduce(function(result, col, colIndex) {
const currentRange = sheet.getRange(rowIndex + ROW_OFFSET, colIndex + COL_OFFSET);
const format = currentRange.getNumberFormat();
result[format === 'G0' ? 'gold' : 'bucks'] += Number(currentRange.getValue());
return result;
}, payload);
}
rows.forEach(function(row, rowIndex) {
/**
* @type {Range}
*/
const currentRowRange = sheet.getRange(rowIndex + ROW_OFFSET, COL_OFFSET, 1, 6);
/**
* @type {Array<string>}
*/
const currentRowFormats = currentRowRange.getNumberFormats()[0];
/**
* @type {boolean}
*/
const isPowerRow = currentRowFormats.some(function(format) {
return format == '0P';
});
if (isPowerRow) {
return;
}
const total = getPrice(row, rowIndex);
/**
* @type {Range}
*/
const goldColRange = sheet.getRange(rowIndex + ROW_OFFSET, row.length + COL_OFFSET);
/**
* @type {Range}
*/
const bucksColRange = sheet.getRange(rowIndex + ROW_OFFSET, row.length + COL_OFFSET + 1);
goldColRange.setValue(total.gold);
goldColRange.setNumberFormat('G0');
goldColRange.setFontLine('none');
goldColRange.setFontColor('#f1c232');
goldColRange.setFontWeight('bold');
bucksColRange.setValue(total.bucks);
bucksColRange.setNumberFormat('0.###############');
bucksColRange.setFontColor('#38761d');
bucksColRange.setFontWeight('bold');
});
}
function calcAll() {
SpreadsheetApp.getActiveSpreadsheet().getSheets().forEach(function(sheet) {
calc(sheet);
});
}
function onOpen() {
SpreadsheetApp
.getUi()
.createMenu('Guns of Boom')
.addItem('Calculate prices for current weapon type', 'calc')
.addItem('Calculate prices for all the weapon types', 'calcAll')
.addToUi();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment