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;