找回密码
 立即注册

QQ登录

只需一步,快速开始

kotoYY

金牌服务用户

113

主题

265

帖子

840

积分

金牌服务用户

积分
840
kotoYY
金牌服务用户   /  发表于:2017-12-5 20:56  /   查看:6093  /  回复:10
function FactorialFunction4() {
    this.name = "MDV";
    this.maxArgs = 255;
    this.minArgs = 1;
    this.typeName = "FactorialFunction4";
}
FactorialFunction4.prototype = new GC.Spread.CalcEngine.Functions.Function("MDV",1,255, {
    description: "最大偏差,返回偏差最大的原值。",
    parameters: [{
        name: "number",
        repeatable: false,
        optional: false
    }]
});
FactorialFunction4.prototype.evaluate = function(arg){
};
var mdvF = new FactorialFunction4();
GC.Spread.CalcEngine.Functions.defineGlobalCustomFunction("MDV", mdvF);

希望参数可以是连续的区域,也可以是多个分开的单元格,像max的参数一样。现在这种写法,只能是多个单元格用逗号分开。应该如何修改呢?

10 个回复

倒序浏览
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-12-6 12:06:19
沙发
您好连续区域之间用冒号比如A1:B4
回复 使用道具 举报
kotoYY
金牌服务用户   /  发表于:2017-12-6 13:29:11
板凳
ClarkPan 发表于 2017-12-6 12:06
您好连续区域之间用冒号比如A1:B4

用了,按照我这种写法,连续区间获取不到值。不知道应该怎么改了。
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-12-6 19:59:15
地板
您好,我这边研究一下,明天给您答复
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-12-7 11:46:58
5#
您好:
首先设置
FactorialFunction4.prototype.acceptsReference = function(){
        return true;
}
让其能够接受范围的引用,这样获取到的参数就不是值而是范围的引用,然后通过解析这个引用对象,就可以获取其中的值
参考附件demo

model_11.0.0.html.zip

1.15 KB, 下载次数: 88

回复 使用道具 举报
kotoYY
金牌服务用户   /  发表于:2017-12-8 09:31:44
6#
ClarkPan 发表于 2017-12-7 11:46
您好:
首先设置
FactorialFunction4.prototype.acceptsReference = function(){

我自定义的mdv里用到了我重写的maxa mina round等方法,按照您给我的demo,我的maxa等方法都不好用,不知道该调整哪里。如果不用mdv方法,直接用maxa参数是多个区域的,是没问题的。

SpreadFormula1.js

6.33 KB, 下载次数: 90

回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-12-8 15:34:14
7#
您好:
dealPrecision方法您没有提供
回复 使用道具 举报
kotoYY
金牌服务用户   /  发表于:2017-12-8 16:26:23
8#
ClarkPan 发表于 2017-12-8 15:34
您好:
dealPrecision方法您没有提供

这个方法没什么用,去掉就行。
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-12-8 19:07:43
9#
不是很明白您的这块逻辑这么说吧
for(var j=0;j<args.length;j++){
                                var referenceArray = args[j].toArray();
                                for(var i=0;i<referenceArray.length;i++){
                                        var argObj = referenceArray[i] + "";
                                        if(argObj == null || argObj == "" || argObj == "/" || argObj.trim() == "") {
                                                continue;
                                        }
                                        if(argObj.indexOf(".") != -1) {
                                                digNum = (argObj.split('.')[1].length > digNum) ? (argObj.split('.')[1].length) : digNum;
                                        }
                                }
                        }
这段代码第一次的循环是循环参数有多少个,就是逗号分隔的参数。循环去获取每一个参数
内层循环就是循环引用对象单元格数
比如第一个参数是A1:A5 ,那么referenceArray.length就是5,referenceArray就是A1到A5每一个单元格的value组成的数组
您可以根据上面的信息改写一下计算这块的逻辑
回复 使用道具 举报
kotoYY
金牌服务用户   /  发表于:2017-12-12 19:50:52
10#
ClarkPan 发表于 2017-12-8 19:07
不是很明白您的这块逻辑这么说吧
for(var j=0;j

这段代码是为了取所有单元格的小数点位数最长的。
这个方法没问题,只是代用重写的maxa函数,参数传args就不好用了,不知道为什么。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部