Lynn.Dou 发表于 2022-9-30 17:15:04

自定义函数参数解析

本帖最后由 Lynn.Dou 于 2023-9-20 17:01 编辑

熟悉SpreadJS功能的小伙伴可能有了解或使用过自定义函数,相关知识点在学习指南也有相关介绍:
https://demo.grapecity.com.cn/sp ... om-functions/purejs
本篇教程就结合附件demo来讲解下在定义自定义函数时,不同类型的参数是如何获取以及处理的。

步骤:
结合附件demo调试看看各参数的作用,

在evaluate方法内,可以通过arguments获取传参数组,如下图:

仔细观察,你会发现arguments中有6个元素,但实际自定义函数传入的是5个参数。
sheet.setFormula(2, 0, '=FACTORIAL(Sheet1!B2:B4, Sheet2!D2, Sheet3!C2:C4, "test", 12)');
它的存在与isContextSensitive这个设置有关。
FactorialFunction.prototype.isContextSensitive = function () {
      return true;// 函数的计算是否依赖于计算的上下文
    }如果isContextSensitive设置为true,那么arguments实际的个数会比自定义函数的传参多1,且位于第一个位置。
如果为false,这个元素就不存在了,arguments实际的个数也就与自定义函数的传参相同了。

那么arguments这个参数是做什么的呢?
其实第一个元素是上下文,可以通过它获取sheet对象/spread对象。
var mySheet = arguments.source.getSheet();
var mySpread = arguments.source.getSheet().getParent();也可以获取自定义函数应用的单元格索引信息:

在定义自定义函数时,我们往往需要借助上下文信息对sheet对象/spread对象做一下操作,比如说获取当前sheet的name。
但,它也并不是获取上下文对象的唯一方式,具体与自定义函数的参数有关,我们带着问题继续看下文。

1、参数为字符串 或 数值

可以直接从argument中获取参数值


这种情况下,如果要用到sheet对象/spread对象,就需要通过arguments来获取。

也就是说,在自定义函数参数为数值或字符串的情况下,如果函数逻辑中需要用到上下文对象,就需要设置isContextSensitive为true。


2、参数为单元格区域

参数为单元格区域时,即使不设置isContextSensitive为true,在argument内部也是可以获取到上下文信息的。
如下图,argument.getSource().getSheet() 获取sheet,进而获取sheetName

使用getRow等方法获取参数区域的行列信息,最后使用rangeToFormula方法将区域信息转换为区域字符串

最后可以拼接输出。

也就是说,在参数为单元区域时,也可以不设置isContextSensitive为true,通过其他元素内部获取上下文信息。
当然加上也是没问题的,这里更想带大家了解的是各参数具体的作用,这样开发起来就心中有数了。

具体代码如下:
FactorialFunction.prototype.evaluate = function (arg) {
      console.log(arguments);
      // arguments 中第一个参数为计算上下文(即通过上下文可获取spread对象)。
      // 若isContextSensitive设置false,则此参数不存在。
      // 若isContextSensitive设置为true,则此参数存在。
      var mySheet = arguments.source.getSheet();
      //var mySpread = arguments.source.getSheet().getParent();

      var length = arguments.length;
      for (var i = 1; i < length; i++) {
            var argument = arguments;
            if (typeof (argument) == 'string' || typeof (argument) == 'number') {
                console.log("参数" + i + "为" + argument);
            } else {
                // 参数为单元格区域时,通过argument也可以获取到上下文
                // var mySheet = argument.getSource().getSheet();
                var sheetName = mySheet.name();
                console.log("参数" + i + "sheetName为:" + sheetName);
                var r = argument.getRow();
                var c = argument.getColumn();
                var rc = argument.getRowCount();
                var cc = argument.getColumnCount();
                var range = new GC.Spread.Sheets.Range(r, c, rc, cc);
                var string = GC.Spread.Sheets.CalcEngine.rangeToFormula(range, 0, 0, GC.Spread.Sheets.CalcEngine.RangeReferenceRelative.allRelative);
                var setFormulaString = "" + sheetName + "!" + string;
                console.log("参数" + i + "为" + setFormulaString);
            }
      }
      return "anything";
    };
理论知识有些复杂,大家可以结合demo实际调试看看,感受到自定义函数这些参数的具体作用。
附件为完整demo,以供参考。




页: [1]
查看完整版本: 自定义函数参数解析