背景:客户希望在自定义函数中实现让终端用户自行拼接参数来实现函数实时计算,
因此给出此方案来解决这一应用场景。
核心代码(完整示例见附件):
- function TestFunction() {
- this.name = "TEST";
- this.maxArgs = 100;
- this.minArgs = 1;
- }
- TestFunction.prototype = new GC.Spread.CalcEngine.Functions.Function();
- TestFunction.prototype.evaluate = function (arg1) {
- console.log(arguments);
- var result = arg1;
- if(arguments.length > 1){
- var args = getArgsArr(result);
- if(args && args.length>0){
-
- for(let i=0; i<args.length; i++){
- if(arguments[i+1]){
- let _arg = arguments[i+1];
- // 如果参数是引用类型,获取引用区域
- if(_arg.getRow){
- let row = _arg.getRow();
- let col = _arg.getColumn();
- let rowCount = _arg.getRowCount();
- let colCount = _arg.getColumnCount();
- let val = 1;
- // 这里用累乘演示
- for(let r = row; r < row+rowCount; r++){
- for(let c = col; c < col+colCount; c++){
- val *= sheet.getValue(r,c);
- }
- }
- result = result.replace(args[i],val);
- }else{
- // 如果参数是表达式,直接拼接结果即可
- result = result.replace(args[i],_arg);
- }
- }
- }
- }
- }
- return result;
- };
- // 重写这个方法,返回true,就可以拿到参数的引用区域
- TestFunction.prototype.acceptsReference = function () {
- return true;
- };
- var test = new TestFunction();
复制代码
|
|