{ "name": "gse", "scopeName": "source.gse", "aliases": ["gs", "sheets", "formula"], "fileTypes": ["gse", "gs", "sheets", "formula"], "patterns": [ { "include": "#formula" } ], "repository": { "formula": { "begin": "^\\s*(=?)", "beginCaptures": { "1": { "name": "punctuation.definition.formula.gse" } }, "end": "(?=$|\\n)", "patterns": [ { "include": "#expression" } ] }, "expression": { "patterns": [ { "include": "#string" }, { "include": "#number" }, { "include": "#boolean" }, { "include": "#error" }, { "include": "#array" }, { "include": "#lambda-keyword" }, { "include": "#primitive-function" }, { "include": "#function-call" }, { "include": "#cell-reference" }, { "include": "#parenthesized" }, { "include": "#operator" }, { "include": "#identifier" } ] }, "lambda-keyword": { "match": "(?i)\\bLAMBDA\\b(?=\\s*\\()", "name": "storage.type.function.lambda.gse" }, "primitive-function": { "match": "(?i)\\b(ABS|ACCRINT|ACCRINTM|ACOS|ACOSH|ACOT|ACOTH|ADD|ADDRESS|AMORLINC|AND|ARABIC|ARRAY_CONSTRAIN|ARRAYFORMULA|ASC|ASIN|ASINH|ATAN|ATAN2|ATANH|AVEDEV|AVERAGE|AVERAGE.WEIGHTED|AVERAGEA|AVERAGEIF|AVERAGEIFS|BASE|BETA.DIST|BETA.INV|BETADIST|BETAINV|BIN2DEC|BIN2HEX|BIN2OCT|BINOM.DIST|BINOM.INV|BINOMDIST|BITAND|BITLSHIFT|BITOR|BITRSHIFT|BITXOR|BYCOL|BYROW|CEILING|CEILING.MATH|CEILING.PRECISE|CELL|CHAR|CHIDIST|CHIINV|CHISQ.DIST|CHISQ.DIST.RT|CHISQ.INV|CHISQ.INV.RT|CHISQ.TEST|CHITEST|CHOOSE|CHOOSECOLS|CHOOSEROWS|CLEAN|CODE|COLUMN|COLUMNS|COMBIN|COMBINA|COMPLEX|CONCAT|CONCATENATE|CONFIDENCE|CONFIDENCE.NORM|CONFIDENCE.T|CONVERT|CORREL|COS|COSH|COT|COTH|COUNT|COUNTA|COUNTBLANK|COUNTIF|COUNTIFS|COUNTUNIQUE|COUPDAYBS|COUPDAYS|COUPDAYSNC|COUPNCD|COUPNUM|COUPPCD|COVAR|COVARIANCE.P|COVARIANCE.S|CRITBINOM|CSC|CSCH|CUMIPMT|CUMPRINC|DATE|DATEDIF|DATEVALUE|DAVERAGE|DAY|DAYS|DAYS360|DB|DCOUNT|DCOUNTA|DDB|DEC2BIN|DEC2HEX|DEC2OCT|DECIMAL|DEGREES|DELTA|DETECTLANGUAGE|DEVSQ|DGET|DISC|DIVIDE|DMAX|DMIN|DOLLAR|DOLLARDE|DOLLARFR|DPRODUCT|DSTDEV|DSTDEVP|DSUM|DURATION|DVAR|DVARP|EDATE|EFFECT|ENCODEURL|EOMONTH|EPOCHTODATE|EQ|ERF|ERF.PRECISE|ERFC|ERFC.PRECISE|ERROR.TYPE|EVEN|EXACT|EXP|EXPON.DIST|EXPONDIST|F.DIST|F.DIST.RT|F.INV|F.INV.RT|F.TEST|FACT|FACTDOUBLE|FALSE|FDIST|FILTER|FIND|FINDB|FINV|FISHER|FISHERINV|FIXED|FLATTEN|FLOOR|FLOOR.MATH|FLOOR.PRECISE|FORECAST|FORECAST.LINEAR|FORMULATEXT|FREQUENCY|FTEST|FV|FVSCHEDULE|GAMMA|GAMMA.DIST|GAMMA.INV|GAMMADIST|GAMMAINV|GAMMALN|GAMMALN.PRECISE|GAUSS|GCD|GEOMEAN|GESTEP|GETPIVOTDATA|GOOGLEFINANCE|GOOGLETRANSLATE|GROWTH|GT|GTE|HARMEAN|HEX2BIN|HEX2DEC|HEX2OCT|HLOOKUP|HOUR|HSTACK|HYPERLINK|HYPGEOM.DIST|HYPGEOMDIST|IF|IFERROR|IFNA|IFS|IMABS|IMAGE|IMAGINARY|IMARGUMENT|IMCONJUGATE|IMCOS|IMCOSH|IMCOT|IMCOTH|IMCSC|IMCSCH|IMDIV|IMEXP|IMLN|IMLOG|IMLOG10|IMLOG2|IMPORTDATA|IMPORTFEED|IMPORTHTML|IMPORTRANGE|IMPORTXML|IMPOWER|IMPRODUCT|IMREAL|IMSEC|IMSECH|IMSIN|IMSINH|IMSQRT|IMSUB|IMSUM|IMTAN|IMTANH|INDEX|INDIRECT|INT|INTERCEPT|INTRATE|IPMT|IRR|ISBETWEEN|ISBLANK|ISDATE|ISEMAIL|ISERR|ISERROR|ISEVEN|ISFORMULA|ISLOGICAL|ISNA|ISNONTEXT|ISNUMBER|ISO.CEILING|ISODD|ISOWEEKNUM|ISPMT|ISREF|ISTEXT|ISURL|JOIN|KURT|LAMBDA|LARGE|LCM|LEFT|LEFTB|LEN|LENB|LET|LINEST|LN|LOG|LOG10|LOGEST|LOGINV|LOGNORM.DIST|LOGNORM.INV|LOGNORMDIST|LOOKUP|LOWER|LT|LTE|MAKEARRAY|MAP|MARGINOFERROR|MATCH|MAX|MAXA|MAXIFS|MDETERM|MDURATION|MEDIAN|MID|MIDB|MIN|MINA|MINIFS|MINUS|MINUTE|MINVERSE|MIRR|MMULT|MOD|MODE|MODE.MULT|MODE.SNGL|MONTH|MROUND|MULTINOMIAL|MULTIPLY|MUNIT|N|NA|NE|NEGBINOM.DIST|NEGBINOMDIST|NETWORKDAYS|NETWORKDAYS.INTL|NOMINAL|NORM.DIST|NORM.INV|NORM.S.DIST|NORM.S.INV|NORMDIST|NORMINV|NORMSDIST|NORMSINV|NOT|NOW|NPER|NPV|OCT2BIN|OCT2DEC|OCT2HEX|ODD|OFFSET|OR|PDURATION|PEARSON|PERCENTILE|PERCENTILE.EXC|PERCENTILE.INC|PERCENTRANK|PERCENTRANK.EXC|PERCENTRANK.INC|PERMUT|PERMUTATIONA|PHI|PI|PMT|POISSON|POISSON.DIST|POW|POWER|PPMT|PRICE|PRICEDISC|PRICEMAT|PROB|PRODUCT|PROPER|PV|QUARTILE|QUARTILE.EXC|QUARTILE.INC|QUERY|QUOTIENT|RADIANS|RAND|RANDARRAY|RANDBETWEEN|RANK|RANK.AVG|RANK.EQ|RATE|RECEIVED|REDUCE|REGEXEXTRACT|REGEXMATCH|REGEXREPLACE|REPLACE|REPLACEB|REPT|RIGHT|RIGHTB|ROMAN|ROUND|ROUNDDOWN|ROUNDUP|ROW|ROWS|RRI|RSQ|SCAN|SEARCH|SEARCHB|SEC|SECH|SECOND|SEQUENCE|SERIESSUM|SIGN|SIN|SINH|SKEW|SKEW.P|SLN|SLOPE|SMALL|SORT|SORTN|SPARKLINE|SPLIT|SQRT|SQRTPI|STANDARDIZE|STDEV|STDEV.P|STDEV.S|STDEVA|STDEVP|STDEVPA|STEYX|SUBSTITUTE|SUBTOTAL|SUM|SUMIF|SUMIFS|SUMPRODUCT|SUMSQ|SUMX2MY2|SUMX2PY2|SUMXMY2|SWITCH|SYD|T|T.DIST|T.DIST.2T|T.DIST.RT|T.INV|T.INV.2T|T.TEST|TAN|TANH|TBILLEQ|TBILLPRICE|TBILLYIELD|TDIST|TEXT|TEXTJOIN|TIME|TIMEVALUE|TINV|TO_DATE|TO_DOLLARS|TO_PERCENT|TO_PURE_NUMBER|TO_TEXT|TOCOL|TODAY|TOROW|TRANSPOSE|TREND|TRIM|TRIMMEAN|TRUE|TRUNC|TTEST|TYPE|UMINUS|UNARY_PERCENT|UNICHAR|UNICODE|UNIQUE|UNIQUE|UPLUS|UPPER|VALUE|VAR|VAR.P|VAR.S|VARA|VARP|VARPA|VDB|VLOOKUP|VSTACK|WEEKDAY|WEEKNUM|WEIBULL|WEIBULL.DIST|WORKDAY|WORKDAY.INTL|WRAPCOLS|WRAPROWS|XIRR|XLOOKUP|XNPV|XOR|YEAR|YEARFRAC|YIELD|YIELDDISC|YIELDMAT|Z.TEST|ZTEST)\\b(?=\\s*\\()", "name": "support.function.builtin.gse" }, "function-call": { "match": "(?i)\\b([A-Za-z_@][A-Za-z0-9_@.]*)\\b(?=\\s*\\()", "captures": { "1": { "name": "entity.name.function.user.gse" } } }, "cell-reference": { "patterns": [ { "comment": "Qualified cell reference with sheet: 'Sheet Name'!A1 or Sheet1!A1", "match": "(?i)(?:('(?:[^']|'')+')|([@A-Za-z_][@A-Za-z0-9_]*))(!)(\\$?[A-Za-z]+\\$?\\d+)", "captures": { "1": { "name": "entity.name.tag.sheet.quoted.gse" }, "2": { "name": "entity.name.tag.sheet.gse" }, "3": { "name": "punctuation.separator.sheet.gse" }, "4": { "name": "variable.other.cell.gse" } } }, { "comment": "Qualified column reference with sheet: Sheet1!A:B or 'Sheet'!$A:$B", "match": "(?i)(?:('(?:[^']|'')+')|([@A-Za-z_][@A-Za-z0-9_]*))(!)(\\$?[A-Za-z]+:\\$?[A-Za-z]+)", "captures": { "1": { "name": "entity.name.tag.sheet.quoted.gse" }, "2": { "name": "entity.name.tag.sheet.gse" }, "3": { "name": "punctuation.separator.sheet.gse" }, "4": { "name": "variable.other.cell.column-range.gse" } } }, { "comment": "Qualified row reference with sheet: Sheet1!1:10", "match": "(?i)(?:('(?:[^']|'')+')|([@A-Za-z_][@A-Za-z0-9_]*))(!)(\\d+:\\d+)", "captures": { "1": { "name": "entity.name.tag.sheet.quoted.gse" }, "2": { "name": "entity.name.tag.sheet.gse" }, "3": { "name": "punctuation.separator.sheet.gse" }, "4": { "name": "variable.other.cell.row-range.gse" } } }, { "comment": "Qualified single column with sheet: Sheet1!A or 'Sheet'!$A", "match": "(?i)(?:('(?:[^']|'')+')|([@A-Za-z_][@A-Za-z0-9_]*))(!)(\\$?[A-Za-z]+)(?=\\s*:)", "captures": { "1": { "name": "entity.name.tag.sheet.quoted.gse" }, "2": { "name": "entity.name.tag.sheet.gse" }, "3": { "name": "punctuation.separator.sheet.gse" }, "4": { "name": "variable.other.cell.column.gse" } } }, { "comment": "Column range: A:B or $A:$B (must have colon on both sides)", "match": "(?i)\\$?[A-Za-z]+:\\$?[A-Za-z]+", "name": "variable.other.cell.column-range.gse" }, { "comment": "Row range: 1:10 (must have colon on both sides)", "match": "\\d+:\\d+", "name": "variable.other.cell.row-range.gse" }, { "comment": "Simple cell reference: A1, $A$1, etc.", "match": "(?i)\\b\\$?[A-Za-z]+\\$?\\d+\\b", "name": "variable.other.cell.gse" }, { "comment": "Single column reference adjacent to colon operator: A: or :A", "match": "(?i)(?<=:)\\s*\\$?[A-Za-z]+(?!\\d)\\b|\\b\\$?[A-Za-z]+(?!\\d)(?=\\s*:)", "name": "variable.other.cell.column.gse" }, { "comment": "Single row reference adjacent to colon operator: 5: or :5", "match": "(?<=:)\\s*\\d+\\b|\\b\\d+(?=\\s*:)", "name": "variable.other.cell.row.gse" } ] }, "parenthesized": { "begin": "\\(", "beginCaptures": { "0": { "name": "punctuation.parenthesis.begin.gse" } }, "end": "\\)", "endCaptures": { "0": { "name": "punctuation.parenthesis.end.gse" } }, "patterns": [ { "include": "#expression" } ] }, "array": { "begin": "\\{", "beginCaptures": { "0": { "name": "punctuation.definition.array.begin.gse" } }, "end": "\\}", "endCaptures": { "0": { "name": "punctuation.definition.array.end.gse" } }, "patterns": [ { "match": "[,;]", "name": "punctuation.separator.array.gse" }, { "include": "#expression" } ] }, "string": { "begin": "\"", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.gse" } }, "end": "\"", "endCaptures": { "0": { "name": "punctuation.definition.string.end.gse" } }, "patterns": [ { "match": "\"\"", "name": "constant.character.escape.gse" } ], "name": "string.quoted.double.gse" }, "number": { "patterns": [ { "match": "\\b\\d+\\.\\d+(?:[eE][+-]?\\d+)?\\b", "name": "constant.numeric.decimal.gse" }, { "match": "\\b\\d+[eE][+-]?\\d+\\b", "name": "constant.numeric.scientific.gse" }, { "match": "\\b\\d+\\b", "name": "constant.numeric.integer.gse" } ] }, "boolean": { "match": "(?i)\\b(TRUE|FALSE)\\b", "name": "constant.language.boolean.gse" }, "error": { "match": "#(?:N/A|DIV/0!|VALUE!|REF!|NAME\\?|NUM!|NULL!|ERROR!)", "name": "constant.language.error.gse" }, "operator": { "patterns": [ { "comment": "Unary minus at start of expression or after opening delimiters", "match": "(?<=^|=|\\(|\\{|,|;|:)\\s*-(?=\\s*(?:\\d|\\(|\\$?[A-Za-z]))", "name": "keyword.operator.arithmetic.unary.gse" }, { "comment": "Unary plus at start of expression or after opening delimiters", "match": "(?<=^|=|\\(|\\{|,|;|:)\\s*\\+(?=\\s*(?:\\d|\\(|\\$?[A-Za-z]))", "name": "keyword.operator.arithmetic.unary.gse" }, { "comment": "Postfix percent operator", "match": "%", "name": "keyword.operator.arithmetic.postfix.gse" }, { "comment": "Range operator (colon)", "match": ":", "name": "keyword.operator.range.gse" }, { "comment": "Comparison operators", "match": "<=|>=|<>|<|>|=", "name": "keyword.operator.comparison.gse" }, { "comment": "Arithmetic operators", "match": "[+\\-*/^]", "name": "keyword.operator.arithmetic.gse" }, { "comment": "String concatenation operator", "match": "&", "name": "keyword.operator.string.gse" }, { "comment": "Argument separator", "match": ",", "name": "punctuation.separator.arguments.gse" } ] }, "identifier": { "match": "(?i)\\b[A-Za-z_@][A-Za-z0-9_@.]*\\b", "name": "variable.other.identifier.gse" } } }