自定义函数实现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)")');
})
看下效果吧。
完整代码可查看下方附件。
这是我想要的 :i0tw: 请问,以上这个方案是否适用于异步函数。即将异步函数传入,执行得到结果。谢谢 athenadeveloper 发表于 2022-10-13 16:53
请问,以上这个方案是否适用于异步函数。即将异步函数传入,执行得到结果。谢谢
上述方案的核心是evaluateFormula方法,对于异步函数则是evaluateFormula计算的时机。
以学习指南异步函数demo为例,测试可以获取到异步函数返回计算结果。
页:
[1]