找回密码
 立即注册

QQ登录

只需一步,快速开始

jasonleeoffice

注册会员

19

主题

64

帖子

177

积分

注册会员

积分
177
jasonleeoffice
注册会员   /  发表于:2018-9-10 14:08  /   查看:3599  /  回复:3
本帖最后由 jasonleeoffice 于 2018-9-10 16:40 编辑

我添加自定义函数后保存,再去修改的时候自定义函数就消失了!

image.png129338988.png

在官方的例子上修改后也是会出现这个问题!
image.png907580261.png
image.png216290282.png
image.png667482299.png

3 个回复

倒序浏览
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-9-10 17:49:49
沙发
您好!
第一张贴图中显示的问题是自定义函数的作用域不对,代码显示自定义函数只添加到spread实例上,没有给spread2添加,所以第二张表格无法识别自定义函数。
下边您给出的代码截图片段没有上下文,我这边实现了一个简单的四舍五入的自定义函数Demo,您参考一下。

  1. $(document).ready(function () {
  2.     var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), { sheetCount: 1 });
  3.     initSpread(spread);
  4. });
  5. function initSpread(spread) {
  6.     var sheet = spread.getSheet(0);

  7.     sheet.setValue(1, 1, 'Press \'Add a Custom Function\' button');
  8.     sheet.setColumnWidth(1, 225);
  9.     sheet.setColumnWidth(2, 100);
  10.     function FactorialFunction() {
  11.         this.name = "ROUND";
  12.         this.maxArgs = 1;
  13.         this.minArgs = 1;
  14.     }
  15.     FactorialFunction.prototype = new GC.Spread.CalcEngine.Functions.Function();
  16.     FactorialFunction.prototype.evaluate = function (arg) {
  17.         var result = 1;
  18.         if (arguments.length === 1 && !isNaN(parseInt(arg))) {
  19.             var res = arg%10;
  20.             if(res < 5){
  21.                 return arg - res;
  22.             }else{
  23.                 return arg + 10 - res;
  24.             }
  25.             return result;
  26.         }
  27.         return "#VALUE!";
  28.     };
  29.     var factorial = new FactorialFunction();

  30.     $("#addCustomFunction").click(function() {
  31.         sheet.setValue(3, 1, 'Formula');
  32.         sheet.setValue(3, 2, '=ROUND(5)');
  33.         sheet.setValue(4, 1, 'Result');
  34.         sheet.addCustomFunction(factorial);
  35.         sheet.setFormula(4, 2, "=ROUND(5)");
  36.     });

  37.     $("#removeCustomFunction").click(function() {
  38.         sheet.removeCustomFunction("ROUND");
  39.     });
  40. };
复制代码
回复 使用道具 举报
jasonleeoffice
注册会员   /  发表于:2018-9-11 09:44:11
板凳
image.png667210387.png
这张图片是我把自定义函数分别加到sheet和sheet2 ,可以看到都是可以用的
image.png361007689.png
然后点了一下 image.png244871215.png 按钮,把内容导入到spread2中后公式失效
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-9-11 11:10:59
地板
您好,您是要把自定义函数序列化,然后再反序列化,在这种情况下,包括自定义格式、自定义标签等,都需要在序列化时对相关的类型提供一个 typeName 字段在其 toJSON函数中,否则无法识别序列化的类型。当反序列化时, 调用 getTypeFromString 函数来获取类型名并且构造类型实例对象, 然后调用类型实例上的 fromJSON方法。
在学习指南里有对应的demo,我把链接发给您,您参考一下。
https://demo.grapecity.com.cn/Sp ... customItemSerialize


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