summaryrefslogtreecommitdiff
path: root/calc.go
diff options
context:
space:
mode:
Diffstat (limited to 'calc.go')
-rw-r--r--calc.go67
1 files changed, 60 insertions, 7 deletions
diff --git a/calc.go b/calc.go
index 8358d33..0f44912 100644
--- a/calc.go
+++ b/calc.go
@@ -416,6 +416,7 @@ type formulaFuncs struct {
// FLOOR
// FLOOR.MATH
// FLOOR.PRECISE
+// FORMULATEXT
// FV
// FVSCHEDULE
// GAMMA
@@ -615,6 +616,7 @@ type formulaFuncs struct {
// TRIMMEAN
// TRUE
// TRUNC
+// TYPE
// UNICHAR
// UNICODE
// UPPER
@@ -6874,7 +6876,7 @@ func (fn *formulaFuncs) ISERR(argsList *list.List) formulaArg {
return newErrorFormulaArg(formulaErrorVALUE, "ISERR requires 1 argument")
}
token := argsList.Front().Value.(formulaArg)
- result := "FALSE"
+ result := false
if token.Type == ArgError {
for _, errType := range []string{
formulaErrorDIV, formulaErrorNAME, formulaErrorNUM,
@@ -6882,11 +6884,11 @@ func (fn *formulaFuncs) ISERR(argsList *list.List) formulaArg {
formulaErrorSPILL, formulaErrorCALC, formulaErrorGETTINGDATA,
} {
if errType == token.String {
- result = "TRUE"
+ result = true
}
}
}
- return newStringFormulaArg(result)
+ return newBoolFormulaArg(result)
}
// ISERROR function tests if an initial supplied expression (or value) returns
@@ -6900,7 +6902,7 @@ func (fn *formulaFuncs) ISERROR(argsList *list.List) formulaArg {
return newErrorFormulaArg(formulaErrorVALUE, "ISERROR requires 1 argument")
}
token := argsList.Front().Value.(formulaArg)
- result := "FALSE"
+ result := false
if token.Type == ArgError {
for _, errType := range []string{
formulaErrorDIV, formulaErrorNAME, formulaErrorNA, formulaErrorNUM,
@@ -6908,11 +6910,11 @@ func (fn *formulaFuncs) ISERROR(argsList *list.List) formulaArg {
formulaErrorCALC, formulaErrorGETTINGDATA,
} {
if errType == token.String {
- result = "TRUE"
+ result = true
}
}
}
- return newStringFormulaArg(result)
+ return newBoolFormulaArg(result)
}
// ISEVEN function tests if a supplied number (or numeric expression)
@@ -7190,6 +7192,32 @@ func (fn *formulaFuncs) SHEETS(argsList *list.List) formulaArg {
return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)
}
+// TYPE function returns an integer that represents the value's data type. The
+// syntax of the function is:
+//
+// TYPE(value)
+//
+func (fn *formulaFuncs) TYPE(argsList *list.List) formulaArg {
+ if argsList.Len() != 1 {
+ return newErrorFormulaArg(formulaErrorVALUE, "TYPE requires 1 argument")
+ }
+ token := argsList.Front().Value.(formulaArg)
+ switch token.Type {
+ case ArgError:
+ return newNumberFormulaArg(16)
+ case ArgMatrix:
+ return newNumberFormulaArg(64)
+ default:
+ if arg := token.ToNumber(); arg.Type != ArgError || len(token.Value()) == 0 {
+ return newNumberFormulaArg(1)
+ }
+ if arg := token.ToBool(); arg.Type != ArgError {
+ return newNumberFormulaArg(4)
+ }
+ return newNumberFormulaArg(2)
+ }
+}
+
// T function tests if a supplied value is text and if so, returns the
// supplied text; Otherwise, the function returns an empty text string. The
// syntax of the function is:
@@ -7343,7 +7371,6 @@ func (fn *formulaFuncs) NOT(argsList *list.List) formulaArg {
case ArgNumber:
return newBoolFormulaArg(!(token.Number != 0))
case ArgError:
-
return token
}
return newErrorFormulaArg(formulaErrorVALUE, "NOT expects 1 boolean or numeric argument")
@@ -9415,6 +9442,32 @@ func (fn *formulaFuncs) COLUMNS(argsList *list.List) formulaArg {
return newNumberFormulaArg(float64(result))
}
+// FORMULATEXT function returns a formula as a text string. The syntax of the
+// function is:
+//
+// FORMULATEXT(reference)
+//
+func (fn *formulaFuncs) FORMULATEXT(argsList *list.List) formulaArg {
+ if argsList.Len() != 1 {
+ return newErrorFormulaArg(formulaErrorVALUE, "FORMULATEXT requires 1 argument")
+ }
+ refs := argsList.Front().Value.(formulaArg).cellRefs
+ col, row := 0, 0
+ if refs != nil && refs.Len() > 0 {
+ col, row = refs.Front().Value.(cellRef).Col, refs.Front().Value.(cellRef).Row
+ }
+ ranges := argsList.Front().Value.(formulaArg).cellRanges
+ if ranges != nil && ranges.Len() > 0 {
+ col, row = ranges.Front().Value.(cellRange).From.Col, ranges.Front().Value.(cellRange).From.Row
+ }
+ cell, err := CoordinatesToCellName(col, row)
+ if err != nil {
+ return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
+ }
+ formula, _ := fn.f.GetCellFormula(fn.sheet, cell)
+ return newStringFormulaArg(formula)
+}
+
// checkHVLookupArgs checking arguments, prepare extract mode, lookup value,
// and data for the formula functions HLOOKUP and VLOOKUP.
func checkHVLookupArgs(name string, argsList *list.List) (idx int, lookupValue, tableArray, matchMode, errArg formulaArg) {