了解SpreadJS自定义公式的同学们应该知道,在SpreadJS的自定义公式中一个 acceptsReference 的设置,设置了之后,自定义公式的参数中就可以支持引用当做参数传入。并且解析的时候会返回一个对象包含了引用的相关位置。由此我们可以支持诸如:A1:A10, B:B 之类的写法。
那么有些同学就要问了,我的自定义公式中可能既存在A1:A10这样的引用参数,又存在1,2,3这样的值当做参数传入,这个时候我的计算逻辑该如何解析呢?
别急,我们下面就会告诉你答案。
首先,我们的解题思路就是利用JS对于类型的判断,来进行引用参数与值参数的区分。如果是引用参数那么回调里的参数必定是一个object类型。如果是值参数可能根据值的不同会有不同的类型,例如number,string等,但是不可能是一个object。所以突破口就在这里。
于是我们利用对参数进行typeof的判断,判断是否是一个object来进行区分,类似下面代码:
- for(var k=1;k<arguments.length;k++){
- if(typeof(arguments[k]) == 'object'){
- var currentSheet = arguments[k].getSource().getSheet();
- var row = arguments[k].getRow();
- var col = arguments[k].getColumn();
- var rowCount = arguments[k].getRowCount();
- var colCount = arguments[k].getColumnCount();
- for(var i=row;i<row+rowCount;i++){
- for(var j=col;j<col+colCount;j++){
- var value = currentSheet.getValue(i,j);
- sum += value;
- }
- }
- }else{
- sum+=arguments[k]
- }
-
- }
复制代码
实例代码中完成了对所有参数的判断并累加求和。完整的实例可以参考附件demo。
利用上述方法,我们就能实现“我全都要”了。
|
|