@papernote/ui
Version:
A modern React component library with a paper notebook aesthetic - minimal, professional, and expressive
1,229 lines (1,212 loc) • 40.8 kB
text/typescript
/**
* Formula definitions for DataGrid intellisense
* Based on fast-formula-parser supported functions
*/
export interface FormulaParameter {
name: string;
description: string;
optional?: boolean;
}
export interface FormulaDefinition {
name: string;
category: FormulaCategory;
description: string;
syntax: string;
parameters: FormulaParameter[];
example?: string;
}
export type FormulaCategory =
| 'Math'
| 'Statistical'
| 'Lookup'
| 'Text'
| 'Logical'
| 'Date'
| 'Information'
| 'Financial';
export const FORMULA_DEFINITIONS: FormulaDefinition[] = [
// ==================== MATH ====================
{
name: 'SUM',
category: 'Math',
description: 'Adds all numbers in a range of cells',
syntax: 'SUM(number1, [number2], ...)',
parameters: [
{ name: 'number1', description: 'First number or range to add' },
{ name: 'number2', description: 'Additional numbers or ranges', optional: true },
],
example: '=SUM(A1:A10)',
},
{
name: 'AVERAGE',
category: 'Math',
description: 'Returns the average of the arguments',
syntax: 'AVERAGE(number1, [number2], ...)',
parameters: [
{ name: 'number1', description: 'First number or range' },
{ name: 'number2', description: 'Additional numbers or ranges', optional: true },
],
example: '=AVERAGE(B1:B20)',
},
{
name: 'MIN',
category: 'Math',
description: 'Returns the minimum value in a list of arguments',
syntax: 'MIN(number1, [number2], ...)',
parameters: [
{ name: 'number1', description: 'First number or range' },
{ name: 'number2', description: 'Additional numbers or ranges', optional: true },
],
example: '=MIN(A1:A100)',
},
{
name: 'MAX',
category: 'Math',
description: 'Returns the maximum value in a list of arguments',
syntax: 'MAX(number1, [number2], ...)',
parameters: [
{ name: 'number1', description: 'First number or range' },
{ name: 'number2', description: 'Additional numbers or ranges', optional: true },
],
example: '=MAX(A1:A100)',
},
{
name: 'COUNT',
category: 'Math',
description: 'Counts the number of cells that contain numbers',
syntax: 'COUNT(value1, [value2], ...)',
parameters: [
{ name: 'value1', description: 'First value or range' },
{ name: 'value2', description: 'Additional values or ranges', optional: true },
],
example: '=COUNT(A1:A50)',
},
{
name: 'COUNTA',
category: 'Math',
description: 'Counts the number of non-empty cells',
syntax: 'COUNTA(value1, [value2], ...)',
parameters: [
{ name: 'value1', description: 'First value or range' },
{ name: 'value2', description: 'Additional values or ranges', optional: true },
],
example: '=COUNTA(A1:A50)',
},
{
name: 'ROUND',
category: 'Math',
description: 'Rounds a number to a specified number of digits',
syntax: 'ROUND(number, num_digits)',
parameters: [
{ name: 'number', description: 'The number to round' },
{ name: 'num_digits', description: 'Number of decimal places' },
],
example: '=ROUND(3.14159, 2)',
},
{
name: 'ROUNDUP',
category: 'Math',
description: 'Rounds a number up, away from zero',
syntax: 'ROUNDUP(number, num_digits)',
parameters: [
{ name: 'number', description: 'The number to round up' },
{ name: 'num_digits', description: 'Number of decimal places' },
],
example: '=ROUNDUP(3.14159, 2)',
},
{
name: 'ROUNDDOWN',
category: 'Math',
description: 'Rounds a number down, toward zero',
syntax: 'ROUNDDOWN(number, num_digits)',
parameters: [
{ name: 'number', description: 'The number to round down' },
{ name: 'num_digits', description: 'Number of decimal places' },
],
example: '=ROUNDDOWN(3.14159, 2)',
},
{
name: 'ABS',
category: 'Math',
description: 'Returns the absolute value of a number',
syntax: 'ABS(number)',
parameters: [{ name: 'number', description: 'The number to get absolute value of' }],
example: '=ABS(-5)',
},
{
name: 'SQRT',
category: 'Math',
description: 'Returns the square root of a number',
syntax: 'SQRT(number)',
parameters: [{ name: 'number', description: 'The number to get square root of' }],
example: '=SQRT(16)',
},
{
name: 'POWER',
category: 'Math',
description: 'Returns the result of a number raised to a power',
syntax: 'POWER(number, power)',
parameters: [
{ name: 'number', description: 'The base number' },
{ name: 'power', description: 'The exponent' },
],
example: '=POWER(2, 8)',
},
{
name: 'MOD',
category: 'Math',
description: 'Returns the remainder after division',
syntax: 'MOD(number, divisor)',
parameters: [
{ name: 'number', description: 'The number to divide' },
{ name: 'divisor', description: 'The number to divide by' },
],
example: '=MOD(10, 3)',
},
{
name: 'INT',
category: 'Math',
description: 'Rounds a number down to the nearest integer',
syntax: 'INT(number)',
parameters: [{ name: 'number', description: 'The number to round down' }],
example: '=INT(3.7)',
},
{
name: 'CEILING',
category: 'Math',
description: 'Rounds a number up to the nearest multiple of significance',
syntax: 'CEILING(number, significance)',
parameters: [
{ name: 'number', description: 'The number to round' },
{ name: 'significance', description: 'The multiple to round to' },
],
example: '=CEILING(4.3, 1)',
},
{
name: 'FLOOR',
category: 'Math',
description: 'Rounds a number down to the nearest multiple of significance',
syntax: 'FLOOR(number, significance)',
parameters: [
{ name: 'number', description: 'The number to round' },
{ name: 'significance', description: 'The multiple to round to' },
],
example: '=FLOOR(4.7, 1)',
},
{
name: 'PRODUCT',
category: 'Math',
description: 'Multiplies all the numbers given as arguments',
syntax: 'PRODUCT(number1, [number2], ...)',
parameters: [
{ name: 'number1', description: 'First number or range' },
{ name: 'number2', description: 'Additional numbers or ranges', optional: true },
],
example: '=PRODUCT(A1:A5)',
},
{
name: 'SUMPRODUCT',
category: 'Math',
description: 'Returns the sum of the products of corresponding array components',
syntax: 'SUMPRODUCT(array1, [array2], ...)',
parameters: [
{ name: 'array1', description: 'First array' },
{ name: 'array2', description: 'Additional arrays', optional: true },
],
example: '=SUMPRODUCT(A1:A5, B1:B5)',
},
{
name: 'RAND',
category: 'Math',
description: 'Returns a random number between 0 and 1',
syntax: 'RAND()',
parameters: [],
example: '=RAND()',
},
{
name: 'RANDBETWEEN',
category: 'Math',
description: 'Returns a random integer between the specified values',
syntax: 'RANDBETWEEN(bottom, top)',
parameters: [
{ name: 'bottom', description: 'Minimum value' },
{ name: 'top', description: 'Maximum value' },
],
example: '=RANDBETWEEN(1, 100)',
},
// ==================== STATISTICAL ====================
{
name: 'COUNTIF',
category: 'Statistical',
description: 'Counts cells that meet a single criterion',
syntax: 'COUNTIF(range, criteria)',
parameters: [
{ name: 'range', description: 'Range of cells to count' },
{ name: 'criteria', description: 'Condition to match' },
],
example: '=COUNTIF(A1:A10, ">5")',
},
{
name: 'COUNTIFS',
category: 'Statistical',
description: 'Counts cells that meet multiple criteria',
syntax: 'COUNTIFS(range1, criteria1, [range2], [criteria2], ...)',
parameters: [
{ name: 'range1', description: 'First range to evaluate' },
{ name: 'criteria1', description: 'First condition' },
{ name: 'range2', description: 'Additional range', optional: true },
{ name: 'criteria2', description: 'Additional condition', optional: true },
],
example: '=COUNTIFS(A:A, ">5", B:B, "<10")',
},
{
name: 'SUMIF',
category: 'Statistical',
description: 'Sums cells that meet a single criterion',
syntax: 'SUMIF(range, criteria, [sum_range])',
parameters: [
{ name: 'range', description: 'Range to evaluate' },
{ name: 'criteria', description: 'Condition to match' },
{ name: 'sum_range', description: 'Actual cells to sum', optional: true },
],
example: '=SUMIF(A1:A10, ">5", B1:B10)',
},
{
name: 'SUMIFS',
category: 'Statistical',
description: 'Sums cells that meet multiple criteria',
syntax: 'SUMIFS(sum_range, range1, criteria1, [range2], [criteria2], ...)',
parameters: [
{ name: 'sum_range', description: 'Cells to sum' },
{ name: 'range1', description: 'First range to evaluate' },
{ name: 'criteria1', description: 'First condition' },
{ name: 'range2', description: 'Additional range', optional: true },
{ name: 'criteria2', description: 'Additional condition', optional: true },
],
example: '=SUMIFS(C:C, A:A, ">5", B:B, "<10")',
},
{
name: 'AVERAGEIF',
category: 'Statistical',
description: 'Averages cells that meet a single criterion',
syntax: 'AVERAGEIF(range, criteria, [average_range])',
parameters: [
{ name: 'range', description: 'Range to evaluate' },
{ name: 'criteria', description: 'Condition to match' },
{ name: 'average_range', description: 'Actual cells to average', optional: true },
],
example: '=AVERAGEIF(A1:A10, ">5", B1:B10)',
},
{
name: 'MEDIAN',
category: 'Statistical',
description: 'Returns the median of the given numbers',
syntax: 'MEDIAN(number1, [number2], ...)',
parameters: [
{ name: 'number1', description: 'First number or range' },
{ name: 'number2', description: 'Additional numbers or ranges', optional: true },
],
example: '=MEDIAN(A1:A100)',
},
{
name: 'MODE',
category: 'Statistical',
description: 'Returns the most frequently occurring value',
syntax: 'MODE(number1, [number2], ...)',
parameters: [
{ name: 'number1', description: 'First number or range' },
{ name: 'number2', description: 'Additional numbers or ranges', optional: true },
],
example: '=MODE(A1:A100)',
},
{
name: 'STDEV',
category: 'Statistical',
description: 'Estimates standard deviation based on a sample',
syntax: 'STDEV(number1, [number2], ...)',
parameters: [
{ name: 'number1', description: 'First number or range' },
{ name: 'number2', description: 'Additional numbers or ranges', optional: true },
],
example: '=STDEV(A1:A100)',
},
{
name: 'VAR',
category: 'Statistical',
description: 'Estimates variance based on a sample',
syntax: 'VAR(number1, [number2], ...)',
parameters: [
{ name: 'number1', description: 'First number or range' },
{ name: 'number2', description: 'Additional numbers or ranges', optional: true },
],
example: '=VAR(A1:A100)',
},
{
name: 'LARGE',
category: 'Statistical',
description: 'Returns the k-th largest value in a data set',
syntax: 'LARGE(array, k)',
parameters: [
{ name: 'array', description: 'Range to search' },
{ name: 'k', description: 'Position from largest' },
],
example: '=LARGE(A1:A100, 3)',
},
{
name: 'SMALL',
category: 'Statistical',
description: 'Returns the k-th smallest value in a data set',
syntax: 'SMALL(array, k)',
parameters: [
{ name: 'array', description: 'Range to search' },
{ name: 'k', description: 'Position from smallest' },
],
example: '=SMALL(A1:A100, 3)',
},
{
name: 'RANK',
category: 'Statistical',
description: 'Returns the rank of a number in a list',
syntax: 'RANK(number, ref, [order])',
parameters: [
{ name: 'number', description: 'The number to rank' },
{ name: 'ref', description: 'Range of numbers' },
{ name: 'order', description: '0 for descending, non-zero for ascending', optional: true },
],
example: '=RANK(A1, A1:A100)',
},
{
name: 'PERCENTILE',
category: 'Statistical',
description: 'Returns the k-th percentile of values',
syntax: 'PERCENTILE(array, k)',
parameters: [
{ name: 'array', description: 'Range of data' },
{ name: 'k', description: 'Percentile value (0 to 1)' },
],
example: '=PERCENTILE(A1:A100, 0.9)',
},
// ==================== LOOKUP ====================
{
name: 'VLOOKUP',
category: 'Lookup',
description: 'Looks for a value in the leftmost column and returns a value in the same row from a specified column',
syntax: 'VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup])',
parameters: [
{ name: 'lookup_value', description: 'Value to search for' },
{ name: 'table_array', description: 'Table range to search' },
{ name: 'col_index_num', description: 'Column number to return (1-based)' },
{ name: 'range_lookup', description: 'FALSE for exact match, TRUE for approximate', optional: true },
],
example: '=VLOOKUP(A1, B1:D10, 2, FALSE)',
},
{
name: 'HLOOKUP',
category: 'Lookup',
description: 'Looks for a value in the top row and returns a value in the same column from a specified row',
syntax: 'HLOOKUP(lookup_value, table_array, row_index_num, [range_lookup])',
parameters: [
{ name: 'lookup_value', description: 'Value to search for' },
{ name: 'table_array', description: 'Table range to search' },
{ name: 'row_index_num', description: 'Row number to return (1-based)' },
{ name: 'range_lookup', description: 'FALSE for exact match, TRUE for approximate', optional: true },
],
example: '=HLOOKUP(A1, A1:Z3, 2, FALSE)',
},
{
name: 'INDEX',
category: 'Lookup',
description: 'Returns a value from a specific position in a range',
syntax: 'INDEX(array, row_num, [col_num])',
parameters: [
{ name: 'array', description: 'Range of cells' },
{ name: 'row_num', description: 'Row position' },
{ name: 'col_num', description: 'Column position', optional: true },
],
example: '=INDEX(A1:C10, 5, 2)',
},
{
name: 'MATCH',
category: 'Lookup',
description: 'Returns the relative position of an item in a range',
syntax: 'MATCH(lookup_value, lookup_array, [match_type])',
parameters: [
{ name: 'lookup_value', description: 'Value to find' },
{ name: 'lookup_array', description: 'Range to search' },
{ name: 'match_type', description: '0 for exact, 1 for less than, -1 for greater than', optional: true },
],
example: '=MATCH("Apple", A1:A10, 0)',
},
{
name: 'LOOKUP',
category: 'Lookup',
description: 'Looks up a value in a vector or array',
syntax: 'LOOKUP(lookup_value, lookup_vector, [result_vector])',
parameters: [
{ name: 'lookup_value', description: 'Value to find' },
{ name: 'lookup_vector', description: 'Range to search' },
{ name: 'result_vector', description: 'Range to return from', optional: true },
],
example: '=LOOKUP(5, A1:A10, B1:B10)',
},
{
name: 'CHOOSE',
category: 'Lookup',
description: 'Returns a value from a list based on an index',
syntax: 'CHOOSE(index_num, value1, [value2], ...)',
parameters: [
{ name: 'index_num', description: 'Which value to return (1-based)' },
{ name: 'value1', description: 'First value' },
{ name: 'value2', description: 'Additional values', optional: true },
],
example: '=CHOOSE(2, "Red", "Blue", "Green")',
},
{
name: 'ROW',
category: 'Lookup',
description: 'Returns the row number of a reference',
syntax: 'ROW([reference])',
parameters: [{ name: 'reference', description: 'Cell reference', optional: true }],
example: '=ROW(A5)',
},
{
name: 'COLUMN',
category: 'Lookup',
description: 'Returns the column number of a reference',
syntax: 'COLUMN([reference])',
parameters: [{ name: 'reference', description: 'Cell reference', optional: true }],
example: '=COLUMN(C1)',
},
{
name: 'ROWS',
category: 'Lookup',
description: 'Returns the number of rows in a reference',
syntax: 'ROWS(array)',
parameters: [{ name: 'array', description: 'Range reference' }],
example: '=ROWS(A1:A10)',
},
{
name: 'COLUMNS',
category: 'Lookup',
description: 'Returns the number of columns in a reference',
syntax: 'COLUMNS(array)',
parameters: [{ name: 'array', description: 'Range reference' }],
example: '=COLUMNS(A1:D1)',
},
{
name: 'OFFSET',
category: 'Lookup',
description: 'Returns a reference offset from a starting point',
syntax: 'OFFSET(reference, rows, cols, [height], [width])',
parameters: [
{ name: 'reference', description: 'Starting cell' },
{ name: 'rows', description: 'Rows to offset' },
{ name: 'cols', description: 'Columns to offset' },
{ name: 'height', description: 'Height of result', optional: true },
{ name: 'width', description: 'Width of result', optional: true },
],
example: '=OFFSET(A1, 2, 3)',
},
{
name: 'INDIRECT',
category: 'Lookup',
description: 'Returns the reference specified by a text string',
syntax: 'INDIRECT(ref_text, [a1])',
parameters: [
{ name: 'ref_text', description: 'Reference as text' },
{ name: 'a1', description: 'TRUE for A1 style, FALSE for R1C1', optional: true },
],
example: '=INDIRECT("A" & B1)',
},
// ==================== TEXT ====================
{
name: 'CONCATENATE',
category: 'Text',
description: 'Joins several text strings into one',
syntax: 'CONCATENATE(text1, [text2], ...)',
parameters: [
{ name: 'text1', description: 'First text' },
{ name: 'text2', description: 'Additional text', optional: true },
],
example: '=CONCATENATE(A1, " ", B1)',
},
{
name: 'CONCAT',
category: 'Text',
description: 'Joins text from multiple ranges',
syntax: 'CONCAT(text1, [text2], ...)',
parameters: [
{ name: 'text1', description: 'First text or range' },
{ name: 'text2', description: 'Additional text or ranges', optional: true },
],
example: '=CONCAT(A1:A5)',
},
{
name: 'LEFT',
category: 'Text',
description: 'Returns the leftmost characters from a text string',
syntax: 'LEFT(text, [num_chars])',
parameters: [
{ name: 'text', description: 'Text string' },
{ name: 'num_chars', description: 'Number of characters', optional: true },
],
example: '=LEFT(A1, 5)',
},
{
name: 'RIGHT',
category: 'Text',
description: 'Returns the rightmost characters from a text string',
syntax: 'RIGHT(text, [num_chars])',
parameters: [
{ name: 'text', description: 'Text string' },
{ name: 'num_chars', description: 'Number of characters', optional: true },
],
example: '=RIGHT(A1, 5)',
},
{
name: 'MID',
category: 'Text',
description: 'Returns characters from the middle of a text string',
syntax: 'MID(text, start_num, num_chars)',
parameters: [
{ name: 'text', description: 'Text string' },
{ name: 'start_num', description: 'Starting position' },
{ name: 'num_chars', description: 'Number of characters' },
],
example: '=MID(A1, 3, 5)',
},
{
name: 'LEN',
category: 'Text',
description: 'Returns the number of characters in a text string',
syntax: 'LEN(text)',
parameters: [{ name: 'text', description: 'Text string' }],
example: '=LEN(A1)',
},
{
name: 'UPPER',
category: 'Text',
description: 'Converts text to uppercase',
syntax: 'UPPER(text)',
parameters: [{ name: 'text', description: 'Text to convert' }],
example: '=UPPER(A1)',
},
{
name: 'LOWER',
category: 'Text',
description: 'Converts text to lowercase',
syntax: 'LOWER(text)',
parameters: [{ name: 'text', description: 'Text to convert' }],
example: '=LOWER(A1)',
},
{
name: 'PROPER',
category: 'Text',
description: 'Capitalizes the first letter of each word',
syntax: 'PROPER(text)',
parameters: [{ name: 'text', description: 'Text to convert' }],
example: '=PROPER(A1)',
},
{
name: 'TRIM',
category: 'Text',
description: 'Removes extra spaces from text',
syntax: 'TRIM(text)',
parameters: [{ name: 'text', description: 'Text to trim' }],
example: '=TRIM(A1)',
},
{
name: 'CLEAN',
category: 'Text',
description: 'Removes non-printable characters from text',
syntax: 'CLEAN(text)',
parameters: [{ name: 'text', description: 'Text to clean' }],
example: '=CLEAN(A1)',
},
{
name: 'FIND',
category: 'Text',
description: 'Finds one text string within another (case-sensitive)',
syntax: 'FIND(find_text, within_text, [start_num])',
parameters: [
{ name: 'find_text', description: 'Text to find' },
{ name: 'within_text', description: 'Text to search in' },
{ name: 'start_num', description: 'Starting position', optional: true },
],
example: '=FIND("@", A1)',
},
{
name: 'SEARCH',
category: 'Text',
description: 'Finds one text string within another (case-insensitive)',
syntax: 'SEARCH(find_text, within_text, [start_num])',
parameters: [
{ name: 'find_text', description: 'Text to find' },
{ name: 'within_text', description: 'Text to search in' },
{ name: 'start_num', description: 'Starting position', optional: true },
],
example: '=SEARCH("test", A1)',
},
{
name: 'REPLACE',
category: 'Text',
description: 'Replaces part of a text string with different text',
syntax: 'REPLACE(old_text, start_num, num_chars, new_text)',
parameters: [
{ name: 'old_text', description: 'Original text' },
{ name: 'start_num', description: 'Starting position' },
{ name: 'num_chars', description: 'Number of characters to replace' },
{ name: 'new_text', description: 'Replacement text' },
],
example: '=REPLACE(A1, 1, 3, "New")',
},
{
name: 'SUBSTITUTE',
category: 'Text',
description: 'Substitutes new text for old text in a string',
syntax: 'SUBSTITUTE(text, old_text, new_text, [instance_num])',
parameters: [
{ name: 'text', description: 'Original text' },
{ name: 'old_text', description: 'Text to replace' },
{ name: 'new_text', description: 'Replacement text' },
{ name: 'instance_num', description: 'Which occurrence to replace', optional: true },
],
example: '=SUBSTITUTE(A1, "old", "new")',
},
{
name: 'TEXT',
category: 'Text',
description: 'Formats a number as text with a specified format',
syntax: 'TEXT(value, format_text)',
parameters: [
{ name: 'value', description: 'Value to format' },
{ name: 'format_text', description: 'Format code' },
],
example: '=TEXT(A1, "$#,##0.00")',
},
{
name: 'VALUE',
category: 'Text',
description: 'Converts a text string that represents a number to a number',
syntax: 'VALUE(text)',
parameters: [{ name: 'text', description: 'Text to convert' }],
example: '=VALUE("123.45")',
},
{
name: 'REPT',
category: 'Text',
description: 'Repeats text a specified number of times',
syntax: 'REPT(text, number_times)',
parameters: [
{ name: 'text', description: 'Text to repeat' },
{ name: 'number_times', description: 'Number of repetitions' },
],
example: '=REPT("*", 5)',
},
{
name: 'EXACT',
category: 'Text',
description: 'Checks if two text strings are exactly the same',
syntax: 'EXACT(text1, text2)',
parameters: [
{ name: 'text1', description: 'First text' },
{ name: 'text2', description: 'Second text' },
],
example: '=EXACT(A1, B1)',
},
// ==================== LOGICAL ====================
{
name: 'IF',
category: 'Logical',
description: 'Returns one value if a condition is true, another if false',
syntax: 'IF(logical_test, value_if_true, [value_if_false])',
parameters: [
{ name: 'logical_test', description: 'Condition to test' },
{ name: 'value_if_true', description: 'Value if condition is true' },
{ name: 'value_if_false', description: 'Value if condition is false', optional: true },
],
example: '=IF(A1>10, "High", "Low")',
},
{
name: 'IFS',
category: 'Logical',
description: 'Checks multiple conditions and returns the first TRUE result',
syntax: 'IFS(condition1, value1, [condition2, value2], ...)',
parameters: [
{ name: 'condition1', description: 'First condition' },
{ name: 'value1', description: 'Value if first condition is true' },
{ name: 'condition2', description: 'Second condition', optional: true },
{ name: 'value2', description: 'Value if second condition is true', optional: true },
],
example: '=IFS(A1>90, "A", A1>80, "B", A1>70, "C")',
},
{
name: 'AND',
category: 'Logical',
description: 'Returns TRUE if all arguments are true',
syntax: 'AND(logical1, [logical2], ...)',
parameters: [
{ name: 'logical1', description: 'First condition' },
{ name: 'logical2', description: 'Additional conditions', optional: true },
],
example: '=AND(A1>5, A1<10)',
},
{
name: 'OR',
category: 'Logical',
description: 'Returns TRUE if any argument is true',
syntax: 'OR(logical1, [logical2], ...)',
parameters: [
{ name: 'logical1', description: 'First condition' },
{ name: 'logical2', description: 'Additional conditions', optional: true },
],
example: '=OR(A1="Yes", A1="Y")',
},
{
name: 'NOT',
category: 'Logical',
description: 'Reverses the logic of its argument',
syntax: 'NOT(logical)',
parameters: [{ name: 'logical', description: 'Value to reverse' }],
example: '=NOT(A1>10)',
},
{
name: 'XOR',
category: 'Logical',
description: 'Returns TRUE if an odd number of arguments are true',
syntax: 'XOR(logical1, [logical2], ...)',
parameters: [
{ name: 'logical1', description: 'First condition' },
{ name: 'logical2', description: 'Additional conditions', optional: true },
],
example: '=XOR(A1>5, B1>5)',
},
{
name: 'IFERROR',
category: 'Logical',
description: 'Returns a value if an expression results in an error',
syntax: 'IFERROR(value, value_if_error)',
parameters: [
{ name: 'value', description: 'Expression to check' },
{ name: 'value_if_error', description: 'Value to return on error' },
],
example: '=IFERROR(A1/B1, 0)',
},
{
name: 'IFNA',
category: 'Logical',
description: 'Returns a value if an expression results in #N/A',
syntax: 'IFNA(value, value_if_na)',
parameters: [
{ name: 'value', description: 'Expression to check' },
{ name: 'value_if_na', description: 'Value to return if #N/A' },
],
example: '=IFNA(VLOOKUP(A1, B:C, 2, FALSE), "Not found")',
},
{
name: 'TRUE',
category: 'Logical',
description: 'Returns the logical value TRUE',
syntax: 'TRUE()',
parameters: [],
example: '=TRUE()',
},
{
name: 'FALSE',
category: 'Logical',
description: 'Returns the logical value FALSE',
syntax: 'FALSE()',
parameters: [],
example: '=FALSE()',
},
{
name: 'SWITCH',
category: 'Logical',
description: 'Evaluates an expression against a list of values',
syntax: 'SWITCH(expression, value1, result1, [value2, result2], ..., [default])',
parameters: [
{ name: 'expression', description: 'Value to compare' },
{ name: 'value1', description: 'First value to match' },
{ name: 'result1', description: 'Result if first value matches' },
{ name: 'default', description: 'Default result if no match', optional: true },
],
example: '=SWITCH(A1, 1, "One", 2, "Two", "Other")',
},
// ==================== DATE ====================
{
name: 'DATE',
category: 'Date',
description: 'Creates a date from year, month, and day',
syntax: 'DATE(year, month, day)',
parameters: [
{ name: 'year', description: 'Year number' },
{ name: 'month', description: 'Month number (1-12)' },
{ name: 'day', description: 'Day number' },
],
example: '=DATE(2025, 1, 15)',
},
{
name: 'TODAY',
category: 'Date',
description: 'Returns the current date',
syntax: 'TODAY()',
parameters: [],
example: '=TODAY()',
},
{
name: 'NOW',
category: 'Date',
description: 'Returns the current date and time',
syntax: 'NOW()',
parameters: [],
example: '=NOW()',
},
{
name: 'YEAR',
category: 'Date',
description: 'Returns the year of a date',
syntax: 'YEAR(serial_number)',
parameters: [{ name: 'serial_number', description: 'Date value' }],
example: '=YEAR(A1)',
},
{
name: 'MONTH',
category: 'Date',
description: 'Returns the month of a date (1-12)',
syntax: 'MONTH(serial_number)',
parameters: [{ name: 'serial_number', description: 'Date value' }],
example: '=MONTH(A1)',
},
{
name: 'DAY',
category: 'Date',
description: 'Returns the day of a date (1-31)',
syntax: 'DAY(serial_number)',
parameters: [{ name: 'serial_number', description: 'Date value' }],
example: '=DAY(A1)',
},
{
name: 'HOUR',
category: 'Date',
description: 'Returns the hour of a time (0-23)',
syntax: 'HOUR(serial_number)',
parameters: [{ name: 'serial_number', description: 'Time value' }],
example: '=HOUR(A1)',
},
{
name: 'MINUTE',
category: 'Date',
description: 'Returns the minute of a time (0-59)',
syntax: 'MINUTE(serial_number)',
parameters: [{ name: 'serial_number', description: 'Time value' }],
example: '=MINUTE(A1)',
},
{
name: 'SECOND',
category: 'Date',
description: 'Returns the second of a time (0-59)',
syntax: 'SECOND(serial_number)',
parameters: [{ name: 'serial_number', description: 'Time value' }],
example: '=SECOND(A1)',
},
{
name: 'WEEKDAY',
category: 'Date',
description: 'Returns the day of the week (1-7)',
syntax: 'WEEKDAY(serial_number, [return_type])',
parameters: [
{ name: 'serial_number', description: 'Date value' },
{ name: 'return_type', description: 'Number system to use', optional: true },
],
example: '=WEEKDAY(A1)',
},
{
name: 'WEEKNUM',
category: 'Date',
description: 'Returns the week number of the year',
syntax: 'WEEKNUM(serial_number, [return_type])',
parameters: [
{ name: 'serial_number', description: 'Date value' },
{ name: 'return_type', description: 'Week calculation method', optional: true },
],
example: '=WEEKNUM(A1)',
},
{
name: 'DATEDIF',
category: 'Date',
description: 'Calculates the difference between two dates',
syntax: 'DATEDIF(start_date, end_date, unit)',
parameters: [
{ name: 'start_date', description: 'Start date' },
{ name: 'end_date', description: 'End date' },
{ name: 'unit', description: '"Y", "M", "D", "YM", "YD", or "MD"' },
],
example: '=DATEDIF(A1, B1, "D")',
},
{
name: 'EDATE',
category: 'Date',
description: 'Returns a date a specified number of months before or after',
syntax: 'EDATE(start_date, months)',
parameters: [
{ name: 'start_date', description: 'Starting date' },
{ name: 'months', description: 'Number of months' },
],
example: '=EDATE(A1, 3)',
},
{
name: 'EOMONTH',
category: 'Date',
description: 'Returns the last day of the month, months before or after',
syntax: 'EOMONTH(start_date, months)',
parameters: [
{ name: 'start_date', description: 'Starting date' },
{ name: 'months', description: 'Number of months' },
],
example: '=EOMONTH(A1, 0)',
},
{
name: 'NETWORKDAYS',
category: 'Date',
description: 'Returns the number of working days between two dates',
syntax: 'NETWORKDAYS(start_date, end_date, [holidays])',
parameters: [
{ name: 'start_date', description: 'Start date' },
{ name: 'end_date', description: 'End date' },
{ name: 'holidays', description: 'Range of holiday dates', optional: true },
],
example: '=NETWORKDAYS(A1, B1)',
},
{
name: 'WORKDAY',
category: 'Date',
description: 'Returns a date a specified number of workdays before or after',
syntax: 'WORKDAY(start_date, days, [holidays])',
parameters: [
{ name: 'start_date', description: 'Starting date' },
{ name: 'days', description: 'Number of workdays' },
{ name: 'holidays', description: 'Range of holiday dates', optional: true },
],
example: '=WORKDAY(A1, 10)',
},
{
name: 'TIME',
category: 'Date',
description: 'Creates a time from hour, minute, and second',
syntax: 'TIME(hour, minute, second)',
parameters: [
{ name: 'hour', description: 'Hour (0-23)' },
{ name: 'minute', description: 'Minute (0-59)' },
{ name: 'second', description: 'Second (0-59)' },
],
example: '=TIME(14, 30, 0)',
},
// ==================== INFORMATION ====================
{
name: 'ISBLANK',
category: 'Information',
description: 'Returns TRUE if the cell is empty',
syntax: 'ISBLANK(value)',
parameters: [{ name: 'value', description: 'Cell to check' }],
example: '=ISBLANK(A1)',
},
{
name: 'ISNUMBER',
category: 'Information',
description: 'Returns TRUE if the value is a number',
syntax: 'ISNUMBER(value)',
parameters: [{ name: 'value', description: 'Value to check' }],
example: '=ISNUMBER(A1)',
},
{
name: 'ISTEXT',
category: 'Information',
description: 'Returns TRUE if the value is text',
syntax: 'ISTEXT(value)',
parameters: [{ name: 'value', description: 'Value to check' }],
example: '=ISTEXT(A1)',
},
{
name: 'ISERROR',
category: 'Information',
description: 'Returns TRUE if the value is any error',
syntax: 'ISERROR(value)',
parameters: [{ name: 'value', description: 'Value to check' }],
example: '=ISERROR(A1)',
},
{
name: 'ISNA',
category: 'Information',
description: 'Returns TRUE if the value is #N/A',
syntax: 'ISNA(value)',
parameters: [{ name: 'value', description: 'Value to check' }],
example: '=ISNA(A1)',
},
{
name: 'ISLOGICAL',
category: 'Information',
description: 'Returns TRUE if the value is a logical value',
syntax: 'ISLOGICAL(value)',
parameters: [{ name: 'value', description: 'Value to check' }],
example: '=ISLOGICAL(A1)',
},
{
name: 'ISEVEN',
category: 'Information',
description: 'Returns TRUE if the number is even',
syntax: 'ISEVEN(number)',
parameters: [{ name: 'number', description: 'Number to check' }],
example: '=ISEVEN(A1)',
},
{
name: 'ISODD',
category: 'Information',
description: 'Returns TRUE if the number is odd',
syntax: 'ISODD(number)',
parameters: [{ name: 'number', description: 'Number to check' }],
example: '=ISODD(A1)',
},
{
name: 'TYPE',
category: 'Information',
description: 'Returns a number indicating the data type',
syntax: 'TYPE(value)',
parameters: [{ name: 'value', description: 'Value to check' }],
example: '=TYPE(A1)',
},
{
name: 'N',
category: 'Information',
description: 'Returns a value converted to a number',
syntax: 'N(value)',
parameters: [{ name: 'value', description: 'Value to convert' }],
example: '=N(A1)',
},
{
name: 'NA',
category: 'Information',
description: 'Returns the error value #N/A',
syntax: 'NA()',
parameters: [],
example: '=NA()',
},
// ==================== FINANCIAL ====================
{
name: 'PMT',
category: 'Financial',
description: 'Calculates the payment for a loan',
syntax: 'PMT(rate, nper, pv, [fv], [type])',
parameters: [
{ name: 'rate', description: 'Interest rate per period' },
{ name: 'nper', description: 'Total number of payments' },
{ name: 'pv', description: 'Present value (loan amount)' },
{ name: 'fv', description: 'Future value', optional: true },
{ name: 'type', description: '0 = end of period, 1 = beginning', optional: true },
],
example: '=PMT(0.05/12, 60, 10000)',
},
{
name: 'PV',
category: 'Financial',
description: 'Returns the present value of an investment',
syntax: 'PV(rate, nper, pmt, [fv], [type])',
parameters: [
{ name: 'rate', description: 'Interest rate per period' },
{ name: 'nper', description: 'Total number of periods' },
{ name: 'pmt', description: 'Payment per period' },
{ name: 'fv', description: 'Future value', optional: true },
{ name: 'type', description: '0 = end, 1 = beginning', optional: true },
],
example: '=PV(0.05/12, 60, -100)',
},
{
name: 'FV',
category: 'Financial',
description: 'Returns the future value of an investment',
syntax: 'FV(rate, nper, pmt, [pv], [type])',
parameters: [
{ name: 'rate', description: 'Interest rate per period' },
{ name: 'nper', description: 'Total number of periods' },
{ name: 'pmt', description: 'Payment per period' },
{ name: 'pv', description: 'Present value', optional: true },
{ name: 'type', description: '0 = end, 1 = beginning', optional: true },
],
example: '=FV(0.05/12, 60, -100)',
},
{
name: 'NPV',
category: 'Financial',
description: 'Returns the net present value of an investment',
syntax: 'NPV(rate, value1, [value2], ...)',
parameters: [
{ name: 'rate', description: 'Discount rate' },
{ name: 'value1', description: 'First cash flow' },
{ name: 'value2', description: 'Additional cash flows', optional: true },
],
example: '=NPV(0.1, -10000, 3000, 4200, 6800)',
},
{
name: 'IRR',
category: 'Financial',
description: 'Returns the internal rate of return',
syntax: 'IRR(values, [guess])',
parameters: [
{ name: 'values', description: 'Range of cash flows' },
{ name: 'guess', description: 'Initial guess for rate', optional: true },
],
example: '=IRR(A1:A5)',
},
{
name: 'RATE',
category: 'Financial',
description: 'Returns the interest rate per period',
syntax: 'RATE(nper, pmt, pv, [fv], [type], [guess])',
parameters: [
{ name: 'nper', description: 'Total number of periods' },
{ name: 'pmt', description: 'Payment per period' },
{ name: 'pv', description: 'Present value' },
{ name: 'fv', description: 'Future value', optional: true },
{ name: 'type', description: '0 = end, 1 = beginning', optional: true },
{ name: 'guess', description: 'Initial guess', optional: true },
],
example: '=RATE(60, -100, 5000)',
},
{
name: 'NPER',
category: 'Financial',
description: 'Returns the number of periods for an investment',
syntax: 'NPER(rate, pmt, pv, [fv], [type])',
parameters: [
{ name: 'rate', description: 'Interest rate per period' },
{ name: 'pmt', description: 'Payment per period' },
{ name: 'pv', description: 'Present value' },
{ name: 'fv', description: 'Future value', optional: true },
{ name: 'type', description: '0 = end, 1 = beginning', optional: true },
],
example: '=NPER(0.05/12, -100, 5000)',
},
];
// Get all formula names
export const FORMULA_NAMES = FORMULA_DEFINITIONS.map((f) => f.name);
// Get formulas by category
export const getFormulasByCategory = (category: FormulaCategory): FormulaDefinition[] =>
FORMULA_DEFINITIONS.filter((f) => f.category === category);
// Search formulas by name prefix
export const searchFormulas = (query: string): FormulaDefinition[] => {
const upperQuery = query.toUpperCase();
return FORMULA_DEFINITIONS.filter((f) => f.name.startsWith(upperQuery));
};
// Get formula by exact name
export const getFormula = (name: string): FormulaDefinition | undefined =>
FORMULA_DEFINITIONS.find((f) => f.name === name.toUpperCase());
// Get all categories
export const FORMULA_CATEGORIES: FormulaCategory[] = [
'Math',
'Statistical',
'Lookup',
'Text',
'Logical',
'Date',
'Information',
'Financial',
];