@@ -11602,7 +11602,22 @@ func (fn *formulaFuncs) ISNUMBER(argsList *list.List) formulaArg {
11602
11602
if argsList.Len() != 1 {
11603
11603
return newErrorFormulaArg(formulaErrorVALUE, "ISNUMBER requires 1 argument")
11604
11604
}
11605
- if argsList.Front().Value.(formulaArg).Type == ArgNumber {
11605
+ arg := argsList.Front().Value.(formulaArg)
11606
+ if arg.Type == ArgMatrix {
11607
+ var mtx [][]formulaArg
11608
+ for _, row := range arg.Matrix {
11609
+ var array []formulaArg
11610
+ for _, val := range row {
11611
+ if val.Type == ArgNumber {
11612
+ array = append(array, newBoolFormulaArg(true))
11613
+ }
11614
+ array = append(array, newBoolFormulaArg(false))
11615
+ }
11616
+ mtx = append(mtx, array)
11617
+ }
11618
+ return newMatrixFormulaArg(mtx)
11619
+ }
11620
+ if arg.Type == ArgNumber {
11606
11621
return newBoolFormulaArg(true)
11607
11622
}
11608
11623
return newBoolFormulaArg(false)
@@ -11951,11 +11966,14 @@ func (fn *formulaFuncs) OR(argsList *list.List) formulaArg {
11951
11966
return newStringFormulaArg(strings.ToUpper(strconv.FormatBool(or)))
11952
11967
}
11953
11968
case ArgMatrix:
11954
- // TODO
11955
- return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
11969
+ args := list.New()
11970
+ for _, arg := range token.ToList() {
11971
+ args.PushBack(arg)
11972
+ }
11973
+ return fn.OR(args)
11956
11974
}
11957
11975
}
11958
- return newStringFormulaArg(strings.ToUpper(strconv.FormatBool(or)) )
11976
+ return newBoolFormulaArg(or )
11959
11977
}
11960
11978
11961
11979
// SWITCH function compares a number of supplied values to a supplied test
@@ -13741,34 +13759,48 @@ func (fn *formulaFuncs) find(name string, argsList *list.List) formulaArg {
13741
13759
if args.Type != ArgList {
13742
13760
return args
13743
13761
}
13744
- findText := argsList.Front().Value.(formulaArg).Value( )
13762
+ findTextArg := argsList.Front().Value.(formulaArg)
13745
13763
withinText := argsList.Front().Next().Value.(formulaArg).Value()
13746
13764
startNum := int(args.List[0].Number)
13747
- if findText == "" {
13748
- return newNumberFormulaArg(float64(startNum))
13749
- }
13750
13765
dbcs, search := name == "FINDB" || name == "SEARCHB", name == "SEARCH" || name == "SEARCHB"
13751
- if search {
13752
- findText, withinText = strings.ToUpper(findText), strings.ToUpper(withinText)
13753
- }
13754
- offset, ok := matchPattern(findText, withinText, dbcs, startNum)
13755
- if !ok {
13756
- return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
13757
- }
13758
- result := offset
13759
- if dbcs {
13760
- var pre int
13761
- for idx := range withinText {
13762
- if pre > offset {
13763
- break
13766
+ find := func(findText string) formulaArg {
13767
+ if findText == "" {
13768
+ return newNumberFormulaArg(float64(startNum))
13769
+ }
13770
+ if search {
13771
+ findText, withinText = strings.ToUpper(findText), strings.ToUpper(withinText)
13772
+ }
13773
+ offset, ok := matchPattern(findText, withinText, dbcs, startNum)
13774
+ if !ok {
13775
+ return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
13776
+ }
13777
+ result := offset
13778
+ if dbcs {
13779
+ var pre int
13780
+ for idx := range withinText {
13781
+ if pre > offset {
13782
+ break
13783
+ }
13784
+ if idx-pre > 1 {
13785
+ result++
13786
+ }
13787
+ pre = idx
13764
13788
}
13765
- if idx-pre > 1 {
13766
- result++
13789
+ }
13790
+ return newNumberFormulaArg(float64(result))
13791
+ }
13792
+ if findTextArg.Type == ArgMatrix {
13793
+ var mtx [][]formulaArg
13794
+ for _, row := range findTextArg.Matrix {
13795
+ var array []formulaArg
13796
+ for _, findText := range row {
13797
+ array = append(array, find(findText.Value()))
13767
13798
}
13768
- pre = idx
13799
+ mtx = append(mtx, array)
13769
13800
}
13801
+ return newMatrixFormulaArg(mtx)
13770
13802
}
13771
- return newNumberFormulaArg(float64(result ))
13803
+ return find(findTextArg.Value( ))
13772
13804
}
13773
13805
13774
13806
// LEFT function returns a specified number of characters from the start of a
0 commit comments