Created
November 20, 2017 11:04
-
-
Save embarq/d2d3afe67d4805060d87732a5b4e7fa9 to your computer and use it in GitHub Desktop.
This snippet evaluates different Google Spreadsheets value formats
This file contains hidden or 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
| 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