找回密码
 立即注册

QQ登录

只需一步,快速开始

晓名

初级会员

28

主题

101

帖子

397

积分

初级会员

积分
397
晓名
初级会员   /  发表于:2022-9-6 11:00  /   查看:1656  /  回复:7
1金币
本帖最后由 Ellia.Duan 于 2022-9-28 13:51 编辑

自定义函数,=SUMIFREGEXP(G2:G4,H2,E2:E4) 多个参数,逗号分割。
  1. FactorialFunction.prototype.evaluate = function(arg) {
复制代码


image.png657481994.png


demo:
  1. function FactorialFunction() {
  2.                         this.name = 'SUMIFREGEXP';
  3.                         this.maxArgs = 1;
  4.                         this.minArgs = 1;
  5.                         
  6.                 }

  7.                 FactorialFunction.prototype = new GC.Spread.CalcEngine.Functions.Function();
  8.                 // 描述
  9.                 FactorialFunction.prototype.description = function() {
  10.                         return {
  11.                                 description: "该函数返回数字的和"
  12.                         }
  13.                 }
  14.                 // 函数逻辑
  15.                 FactorialFunction.prototype.evaluate = function(arg) {
  16.                         var arr = arg.toArray();
  17.                         console.log(arr);
  18.                         console.log(arg);
  19.                         return "12"
  20.                 }

  21.                 FactorialFunction.prototype.acceptsReference = function() {
  22.                         return true;
  23.                 }
  24.                
  25.                 FactorialFunction.prototype.acceptsArray = function() {
  26.                         return true;
  27.                 }

  28.                 var fact = new FactorialFunction();
  29.                 sheet.addCustomFunction(fact);
复制代码


最佳答案

查看完整内容

找到问题了:

7 个回复

倒序浏览
最佳答案
最佳答案
晓名
初级会员   /  发表于:2022-9-6 11:00:10
来自 2#
找到问题了:
  1. this.maxArgs = 1;
  2. this.minArgs = 1;
复制代码


评分

参与人数 1金币 +500 收起 理由
Lynn.Dou + 500 很给力!

查看全部评分

回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-9-6 12:18:20
3#
本帖最后由 Lynn.Dou 于 2022-9-6 12:20 编辑

正如您回答中所示,修改参数值就可以了。如传入的参数为2,则可设置this.maxArgs = 2;感谢您分享解决方案,这边也给您送上金币奖励。本贴就先结贴了,有问题欢迎另开新帖交流。

回复 使用道具 举报
晓名
初级会员   /  发表于:2022-9-6 13:52:02
4#
Lynn.Dou 发表于 2022-9-6 12:18
正如您回答中所示,修改参数值就可以了。如传入的参数为2,则可设置this.maxArgs = 2;感谢您分享解 ...

还想问一个,参数,第一个为选择范围,第二个为字符串,第三个为选取范围。
如:SUMIF(A1:A12, "12*", B1:B12)
第二个参数可以为匹配以12开头的
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-9-6 17:33:47
5#

在自定义函数evaluate方法中您可以获取到这三个参数,再根据您的需求进行处理返回相应的结果即可。
请问您的需求是什么呢?从描述中未能理解第三个参数的作用,以及该自定义公式想实现的需求,您可以详细描述下。
回复 使用道具 举报
晓名
初级会员   /  发表于:2022-9-7 09:31:33
6#
Lynn.Dou 发表于 2022-9-6 17:33
在自定义函数evaluate方法中您可以获取到这三个参数,再根据您的需求进行处理返回相应的结果即可。
请问 ...

就是类似于SUMIF(range, ceria, sum_range)函数,但是可以允许SUMIFH(Sheet1!A1:A12, "12*", Sheet2!B1:B12, "23",Sheet3!C1:C12, ...);
if Sheet1!A1:A12 满足“12*”取Sheet2对应的求和
if Sheet1!A1:A12 满足“23” 取Sheet3对应的求和
...
最后得出总和
跨表单,或者能不能在拿到参数时知道range是哪张表
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-9-7 16:08:12
7#
这边结合您的需求先测试下,有结果贴中回复您。
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-9-8 12:32:07
8#
可参考下方代码获取参数区域中的sheet信息,完整代码请参考附件demo。
  1. FactorialFunction.prototype.evaluate = function (arg) {
  2.             var length = arguments.length;
  3.             // 获取参数信息:
  4.             // 参数为string 或 number时,可直接使用arguments[i]获取参数值
  5.             // 参数为单元格区域时,可获取区域信息:r、c、rc、cc、sheetName
  6.             for(var i=1; i<length; i++) {
  7.                 var argument = arguments[i];
  8.                 if(typeof(argument) == 'string' || typeof(argument) == 'number') {
  9.                     console.log("参数" + i + "为" + argument);
  10.                 } else {
  11.                     var sheet = argument.getSource().getSheet();
  12.                     console.log("参数" + i + "sheetName为:" + sheet.name());
  13.                     console.log("参数" + i + "rowCount为:" + argument.getRowCount());
  14.                 }
  15.             }
  16.             return "anything";
  17.         };
  18.    
  19.         var factorial = new FactorialFunction();
  20.         sheet.addCustomFunction(factorial);

  21.         sheet.setFormula(2, 0, '=FACTORIAL(Sheet1!B2:B4, Sheet2!D2, Sheet3!C2:C4, "test", 12)');
复制代码


自定义函数-参数解析.zip

2.53 KB, 下载次数: 101

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部