找回密码
 立即注册

QQ登录

只需一步,快速开始

Lynn.Dou 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-9-26 17:45  /   查看:4704  /  回复:2
本帖最后由 lynn512 于 2020-9-26 17:45 编辑

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

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


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





mydemo.zip

10.81 MB, 下载次数: 976

2 个回复

倒序浏览
lovert
银牌会员   /  发表于:2024-4-13 09:32:57
沙发
本帖最后由 lovert 于 2024-4-13 09:54 编辑

var row = arg2.yf[0].row;
        var col = arg2.yf[0].col;
var rowCount = arg2.yf[0].rowCount;
var colCount = arg2.yf[0].colCount;这个是错的,yf是代码压缩后的属性名称,如果spreadjs版本变了这个就失效了,新版本 image.png327169799.png
yf已经变成了$gt了
正确的应该是调用
image.png280098876.png
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,获取到的是单元格区域第一个单元格的值
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部