From dca03c6230e596560ea58ca1edb27581cdd59aaa Mon Sep 17 00:00:00 2001 From: Stani Date: Thu, 19 Aug 2021 16:12:37 +0200 Subject: [PATCH] This closes #994, fix LOOKUP function for Array form --- calc.go | 18 +++++++++++++----- calc_test.go | 4 ++++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/calc.go b/calc.go index eb6ff759..f52ed538 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 54bdc015..ffcdb4db 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",