Lynn.Dou 发表于 2021-9-16 14:08:08

自定义函数实现EVALUATE函数

本帖最后由 Richard.Ma 于 2023-5-8 15:48 编辑

背景:
前几天有小伙伴咨询SpreadJS支持EVALUATE函数吗?查询资料得知,EVALUATE函数属于Excel宏表函数,
而SpreadJS目前不支持宏的,所以原生上未支持EVALUATE函数。
但查询中发现,EVALUATE函数的作用是,将公式字符串计算为结果,
那么用SpreadJS的自定义函数能否实现此功能呢?让我们一起来试试吧

思路:
定义一个自定义函数,将公式字符串作为参数传入,
在evaluate 内部,使用evaluateFormula方法进行计算,获取计算结果,将计算结果返回。

核心代码:
      /*------自定义函数------*/

      //1. 从 GC.Spread.CalcEngine.Functions.Function 派生并重写一些关键方法
      function FactorialFunction() {
            this.name = 'EVALUATE';//函数名
            this.maxArgs = 1;//最大参数个数
            this.minArgs = 1;//最小参数个数
      };
      FactorialFunction.prototype = new GC.Spread.CalcEngine.Functions.Function();
      FactorialFunction.prototype.acceptsReference = function() {
            return true;//函数的参数接受引用单元格区域
      }
      FactorialFunction.prototype.isContextSensitive = function() {
            return true;//为true 时,函数的计算依赖于上下文
      }
      FactorialFunction.prototype.evaluate = function (arg) {
            //使用EvaluateFormula()方法来计算公式,而无需在表单的单元格中设置公式
            var result = 1;
            if (arguments.length === 2 ) {
                var formulaString = arguments;
                var result = GC.Spread.Sheets.CalcEngine.evaluateFormula(sheet, formulaString, 0, 0);
                return result;
            }
            return "#VALUE!";
      }
      var factorial = new FactorialFunction();
      sheet.setValue(0,0,1);
      sheet.setValue(1,0,2);

      document.getElementById('addCustomFunction').addEventListener('click', function() {
            sheet.addCustomFunction(factorial);//将自定义函数添加到 表单里。如果不设置,会报错 #NAME
            sheet.setFormula(3,0,'=EVALUATE("SUM(A1:A2)")');
      })


看下效果吧。


完整代码可查看下方附件。

crawler 发表于 2021-10-13 17:48:32

这是我想要的

Clark.Pan 发表于 2021-10-13 17:57:06

:i0tw:

athenadeveloper 发表于 2022-10-13 16:53:45

请问,以上这个方案是否适用于异步函数。即将异步函数传入,执行得到结果。谢谢

Lynn.Dou 发表于 2022-10-13 17:11:57

athenadeveloper 发表于 2022-10-13 16:53
请问,以上这个方案是否适用于异步函数。即将异步函数传入,执行得到结果。谢谢
上述方案的核心是evaluateFormula方法,对于异步函数则是evaluateFormula计算的时机。
以学习指南异步函数demo为例,测试可以获取到异步函数返回计算结果。




页: [1]
查看完整版本: 自定义函数实现EVALUATE函数