summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStani <spe.stani.be@gmail.com>2021-08-19 16:12:37 +0200
committerGitHub <noreply@github.com>2021-08-19 22:12:37 +0800
commitdca03c6230e596560ea58ca1edb27581cdd59aaa (patch)
treec8cecc564f4210751a2792c7f4c324da912cc8bf
parenta55f354eb3d0c6c1b9a543ff8ff98227aa6063a6 (diff)
This closes #994, fix LOOKUP function for Array form
-rw-r--r--calc.go18
-rw-r--r--calc_test.go4
2 files changed, 17 insertions, 5 deletions
diff --git a/calc.go b/calc.go
index eb6ff75..f52ed53 100644
--- a/calc.go
+++ b/calc.go
@@ -7263,7 +7263,11 @@ func (fn *formulaFuncs) LOOKUP(argsList *list.List) formulaArg {
if lookupVector.Type != ArgMatrix && lookupVector.Type != ArgList {
return newErrorFormulaArg(formulaErrorVALUE, "LOOKUP requires second argument of table array")
}
- cols, matchIdx := lookupCol(lookupVector), -1
+ arrayForm := lookupVector.Type == ArgMatrix
+ if arrayForm && len(lookupVector.Matrix) == 0 {
+ return newErrorFormulaArg(formulaErrorVALUE, "LOOKUP requires not empty range as second argument")
+ }
+ cols, matchIdx := lookupCol(lookupVector, 0), -1
for idx, col := range cols {
lhs := lookupValue
switch col.Type {
@@ -7280,9 +7284,13 @@ func (fn *formulaFuncs) LOOKUP(argsList *list.List) formulaArg {
break
}
}
- column := cols
+ var column []formulaArg
if argsList.Len() == 3 {
- column = lookupCol(argsList.Back().Value.(formulaArg))
+ column = lookupCol(argsList.Back().Value.(formulaArg), 0)
+ } else if arrayForm && len(lookupVector.Matrix[0]) > 1 {
+ column = lookupCol(lookupVector, 1)
+ } else {
+ column = cols
}
if matchIdx < 0 || matchIdx >= len(column) {
return newErrorFormulaArg(formulaErrorNA, "LOOKUP no result found")
@@ -7291,13 +7299,13 @@ func (fn *formulaFuncs) LOOKUP(argsList *list.List) formulaArg {
}
// lookupCol extract columns for LOOKUP.
-func lookupCol(arr formulaArg) []formulaArg {
+func lookupCol(arr formulaArg, idx int) []formulaArg {
col := arr.List
if arr.Type == ArgMatrix {
col = nil
for _, r := range arr.Matrix {
if len(r) > 0 {
- col = append(col, r[0])
+ col = append(col, r[idx])
continue
}
col = append(col, newEmptyFormulaArg())
diff --git a/calc_test.go b/calc_test.go
index 54bdc01..ffcdb4d 100644
--- a/calc_test.go
+++ b/calc_test.go
@@ -1131,6 +1131,9 @@ func TestCalcCellValue(t *testing.T) {
// LOOKUP
"=LOOKUP(F8,F8:F9,F8:F9)": "32080",
"=LOOKUP(F8,F8:F9,D8:D9)": "Feb",
+ "=LOOKUP(E3,E2:E5,F2:F5)": "22100",
+ "=LOOKUP(E3,E2:F5)": "22100",
+ "=LOOKUP(1,MUNIT(1))": "1",
"=LOOKUP(1,MUNIT(1),MUNIT(1))": "1",
// ROW
"=ROW()": "1",
@@ -2090,6 +2093,7 @@ func TestCalcCellValue(t *testing.T) {
"=LOOKUP()": "LOOKUP requires at least 2 arguments",
"=LOOKUP(D2,D1,D2)": "LOOKUP requires second argument of table array",
"=LOOKUP(D2,D1,D2,FALSE)": "LOOKUP requires at most 3 arguments",
+ "=LOOKUP(1,MUNIT(0))": "LOOKUP requires not empty range as second argument",
"=LOOKUP(D1,MUNIT(1),MUNIT(1))": "LOOKUP no result found",
// ROW
"=ROW(1,2)": "ROW requires at most 1 argument",