Lynn.Dou 发表于 2020-9-26 17:45:24

SpreadJS 如何获取自定义函数引用的单元格区域的值

本帖最后由 lynn512 于 2020-9-26 17:45 编辑

背景:在创建一个自定义函数时,我们可能需要获取到这个自定义函数所引用的单元格区域的值,那么如何获取到这个值呢?
思路:首先我们先来创建一个自定义函数,命名为 test。function FactorialFunction() {
      this.name = 'test';
      this.maxArgs = 1;
      this.minArgs = 1;
      this.typeName = "FactorialFunction";
    }
    FactorialFunction.prototype = new GC.Spread.CalcEngine.Functions.Function();
    FactorialFunction.prototype.evaluate = function(arg1,arg2) {
//your own evaluate content
    }
    FactorialFunction.prototype.acceptsReference = function() {
      return true;//接受引用单元格区域
    }
    FactorialFunction.prototype.isContextSensitive = function() {
      return true;
    }

这里需要注意的是:acceptsReference要返回为 true,这样自定义函数才能接受引用单元格区域。大家会看到 evaluate 里有两个参数,可以在arg2 获取到引用单元格区域的信息,这也是获取引用单元格区域值的核心部分。
var row = arg2.yf.row;
      var col = arg2.yf.col;
var rowCount = arg2.yf.rowCount;
var colCount = arg2.yf.colCount;有了行列索引、行数列数,就可以获取到引用的单元格区域的值了。
var value = sheet.getValue(row, col);
      var arrayValue = sheet.getArray(row, col, rowCount, colCount);创建好自定义函数后,将自定义函数添加到表单,就可以使用啦。
var factorial = new FactorialFunction();
    sheet.addCustomFunction(factorial);
sheet.setFormula(0,1,'=test(B6:D6)');

附件有本例demo,可以查看完整代码。





lovert 发表于 2024-4-13 09:32:57

本帖最后由 lovert 于 2024-4-13 09:54 编辑

var row = arg2.yf.row;
      var col = arg2.yf.col;
var rowCount = arg2.yf.rowCount;
var colCount = arg2.yf.colCount;这个是错的,yf是代码压缩后的属性名称,如果spreadjs版本变了这个就失效了,新版本
yf已经变成了$gt了
正确的应该是调用

var row = arg2.getRow();
var col = arg2.getColumn();
var rowCount = arg2.getRowCount();
var colCount = arg2.getColumnCount();



你代码里

[*]var value = sheet.getValue(row, col);
[*]var arrayValue = sheet.getArray(row, col, rowCount, colCount);//也是错的额,正常在自定义函数{}里你是拿不到sheet对象的,所以调用sheet上的方法就会报错,正确的应该是
[*]var arrayValue=new Array();      
[*]for(k=row;k<rowCount+row;k++)
[*]{      
[*]for(i=col;i<colCount+col;i++)
[*]{      
[*]arrayValue.push(args1.getValue(k,i));
[*]}
[*]};//通过参数的args1.getValue(k,i)或者args2.getValue(k,i)方法获取单元格的数值,循环调用

lovert 发表于 2024-5-9 22:26:20

本帖最后由 lovert 于 2024-5-9 22:29 编辑

这个获取单元格区域的自定义函数,在报表插件里无法使用,第二个参数arg2,获取到的是单元格区域第一个单元格的值
页: [1]
查看完整版本: SpreadJS 如何获取自定义函数引用的单元格区域的值