spreadsheet
typeScript/javascript spreadsheet parser, with formulas.
git clone https://git.vogt.world/spreadsheet.git
Log | Files | README.md
← All files
name: dist/Formulas/Lookup.js
-rw-r--r--
7390
  1"use strict";
  2exports.__esModule = true;
  3var ArgsChecker_1 = require("../Utilities/ArgsChecker");
  4var Errors_1 = require("../Errors");
  5var TypeConverter_1 = require("../Utilities/TypeConverter");
  6var Filter_1 = require("../Utilities/Filter");
  7var Cell_1 = require("../Cell");
  8/**
  9 * Returns an element from a list of choices based on index.
 10 * @param index - Which choice to return. Index starts at 1.
 11 * @param values -  Array of potential value to return. Required. May be a reference to a cell or an individual value.
 12 * @constructor
 13 */
 14var CHOOSE = function (index) {
 15    var values = [];
 16    for (var _i = 1; _i < arguments.length; _i++) {
 17        values[_i - 1] = arguments[_i];
 18    }
 19    ArgsChecker_1.ArgsChecker.checkAtLeastLength(arguments, 2, "CHOOSE");
 20    var i = Math.floor(TypeConverter_1.TypeConverter.firstValueAsNumber(index));
 21    var data = Filter_1.Filter.flattenAndThrow(values);
 22    if (i < 1 || i > data.length) {
 23        throw new Errors_1.NumError("Function CHOOSE parameter 1 value is " + i + ". Valid values are between 1 and "
 24            + (data.length) + " inclusive.");
 25    }
 26    return data[i - 1];
 27};
 28exports.CHOOSE = CHOOSE;
 29/**
 30 * Returns a text representation of a cell address based on the row, column, and sheet.
 31 * @param row - Row of cell address.
 32 * @param column - Column of cell address
 33 * @param {number} absoluteVsRelativeMode - [OPTIONAL - default is 1] Should return a relative(A1, vs $A$1) or absolute address. 1 is row and
 34 * column absolute (e.g. $A$1), 2 is row absolute and column relative (e.g. A$1), 3 is row relative and column absolute
 35 * (e.g. $A1), 4 is row and column relative (e.g. A1).
 36 * @param {boolean} useA1Notation - [OPTIONAL - default is TRUE] Should use A1 notation.
 37 * @param sheet - [OPTIONAL] Sheet name to use in address.
 38 * @returns {string}
 39 * @constructor
 40 */
 41var ADDRESS = function (row, column, absoluteVsRelativeMode, useA1Notation, sheet) {
 42    if (absoluteVsRelativeMode === void 0) { absoluteVsRelativeMode = 1; }
 43    if (useA1Notation === void 0) { useA1Notation = true; }
 44    ArgsChecker_1.ArgsChecker.checkLengthWithin(arguments, 2, 5, "ADDRESS");
 45    row = TypeConverter_1.TypeConverter.firstValueAsNumber(row);
 46    column = TypeConverter_1.TypeConverter.firstValueAsNumber(column);
 47    absoluteVsRelativeMode = TypeConverter_1.TypeConverter.firstValueAsNumber(absoluteVsRelativeMode);
 48    useA1Notation = TypeConverter_1.TypeConverter.firstValueAsBoolean(useA1Notation);
 49    sheet = (sheet === undefined) ? sheet : TypeConverter_1.TypeConverter.firstValueAsString(sheet);
 50    function calculateColumnLetters(n) {
 51        n--; // ensuring 1-indexed.
 52        var ordA = 'a'.charCodeAt(0);
 53        var ordZ = 'z'.charCodeAt(0);
 54        var len = ordZ - ordA + 1;
 55        var s = "";
 56        while (n >= 0) {
 57            s = String.fromCharCode(n % len + ordA) + s;
 58            n = Math.floor(n / len) - 1;
 59        }
 60        return s.toUpperCase();
 61    }
 62    if (row < 1) {
 63        throw new Errors_1.ValueError("Function ADDRESS parameter 1 value is " + row
 64            + ", but it should be greater than or equal to 1.");
 65    }
 66    if (column < 1) {
 67        throw new Errors_1.ValueError("Function ADDRESS parameter 2 value is " + column
 68            + ", but it should be greater than or equal to 1.");
 69    }
 70    if (absoluteVsRelativeMode > 4 || absoluteVsRelativeMode < 1) {
 71        throw new Errors_1.NumError("Function ADDRESS parameter 3 value is " + absoluteVsRelativeMode
 72            + ", while valid values are between 1 and 4 inclusively");
 73    }
 74    var cellNotation = "";
 75    if (useA1Notation) {
 76        var columnLetter = calculateColumnLetters(column);
 77        switch (absoluteVsRelativeMode) {
 78            // 1 is row and column absolute (e.g. $A$1)
 79            case 1:
 80                cellNotation = cellNotation + "$" + columnLetter + "$" + row.toString();
 81                break;
 82            // 2 is row absolute and column relative (e.g. A$1)
 83            case 2:
 84                cellNotation = cellNotation + columnLetter + "$" + row.toString();
 85                break;
 86            // 3 is row relative and column absolute (e.g. $A1)
 87            case 3:
 88                cellNotation = cellNotation + "$" + columnLetter + row.toString();
 89                break;
 90            // 4 is row and column relative (e.g. A1).
 91            case 4:
 92                cellNotation = cellNotation + columnLetter + row.toString();
 93                break;
 94        }
 95    }
 96    else {
 97        switch (absoluteVsRelativeMode) {
 98            // 1 is row and column absolute (e.g. R1C1)
 99            case 1:
100                cellNotation = "R" + row.toString() + "C" + column.toString();
101                break;
102            // 2 is row absolute and column relative (e.g. R1C[1])
103            case 2:
104                cellNotation = "R" + row.toString() + "C[" + column.toString() + "]";
105                break;
106            // 3 is row relative and column absolute (e.g. R[1]C1)
107            case 3:
108                cellNotation = "R[" + row.toString() + "]C" + column.toString();
109                break;
110            // 4 is row and column relative (e.g. R[1]C[1]).
111            case 4:
112                cellNotation = "R[" + row.toString() + "]C[" + column.toString() + "]";
113                break;
114        }
115    }
116    if (sheet !== undefined) {
117        // If the sheet name contains non-alpha numeric characters, wrap it in single-quotes.
118        // Safe sheet name examples: 'sheet_one', 'sheetone'.
119        // Unsafe sheet name examples: '_one', '12345sheet', 'sheet 1'.
120        if (sheet.match(/^[a-zA-Z]+[a-zA-Z0-9_]*$/) === null) {
121            return "'" + sheet + "'!" + cellNotation;
122        }
123        return sheet + "!" + cellNotation;
124    }
125    else {
126        return cellNotation;
127    }
128};
129exports.ADDRESS = ADDRESS;
130/**
131 * Gets the number of columns in a specified array or range.
132 * @param value - The array of range to consider.
133 * @returns {number}
134 * @constructor
135 */
136var COLUMNS = function (value) {
137    ArgsChecker_1.ArgsChecker.checkLength(arguments, 1, "COLUMNS");
138    if (value instanceof Array) {
139        if (value.length === 0) {
140            throw new Errors_1.RefError("Reference does not exist.");
141        }
142        else if (value.length === 1) {
143            return 1;
144        }
145        if (value[0] instanceof Cell_1.Cell) {
146            var start = value[0];
147            var end = value[value.length - 1];
148            return end.getColumn() - start.getColumn() + 1; // counting columns inclusively
149        }
150        else {
151            // if the array passed in is just values, assume that each value is a column.
152            return value.length;
153        }
154    }
155    else {
156        return 1;
157    }
158};
159exports.COLUMNS = COLUMNS;
160var ROWS = function (value) {
161    ArgsChecker_1.ArgsChecker.checkLength(arguments, 1, "ROWS");
162    if (value instanceof Array) {
163        if (value.length === 0) {
164            throw new Errors_1.RefError("Reference does not exist.");
165        }
166        if (value[0] instanceof Cell_1.Cell) {
167            var start = value[0];
168            var end = value[value.length - 1];
169            return end.getRow() - start.getRow() + 1; // counting columns inclusively
170        }
171        else {
172            // if the array passed in is just values, array is considered to be a single row
173            return 1;
174        }
175    }
176    else {
177        return 1;
178    }
179};
180exports.ROWS = ROWS;