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: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:29 编辑
这个获取单元格区域的自定义函数,在报表插件里无法使用,第二个参数arg2,获取到的是单元格区域第一个单元格的值
页:
[1]