找回密码
 立即注册

QQ登录

只需一步,快速开始

果爸

注册会员

11

主题

35

帖子

120

积分

注册会员

积分
120
果爸
注册会员   /  发表于:2022-9-7 08:49  /   查看:1338  /  回复:8
1金币
自定义了一个函数,中间通过调用后台返回的是一个数组,像通过setArray给其他单元格赋值,但是不成功,程序反复的做循环,但是如果通过setValue给其他若干的单元格分别赋值的话是可以的。 image.png134263609.png

最佳答案

查看完整内容

价格setTimeout 0调整一下代码的执行顺序就好了。应该是自定义公式中用setArray方法在执行上会跟公式本身起冲突

8 个回复

倒序浏览
最佳答案
最佳答案
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-9-7 08:49:22
来自 4#
价格setTimeout 0调整一下代码的执行顺序就好了。应该是自定义公式中用setArray方法在执行上会跟公式本身起冲突
  1. window.onload = function () {
  2.             var designer = new GC.Spread.Sheets.Designer.Designer("gc-designer-container");
  3.             var spread = designer.getWorkbook();
  4.             // var sheet = spread.getActiveSheet();
  5.             function qc() {
  6.                             this.name = "qc";
  7.                             this.minArgs = 1;
  8.                             this.maxArgs = 10;
  9.                             this.typeName = "qc";
  10.                         }
  11.                         qc.prototype = new GC.Spread.CalcEngine.Functions.Function();

  12.                         qc.prototype.isContextSensitive = function () {
  13.                             return true;
  14.                         }
  15.                         qc.prototype.evaluate = function(){
  16.                             var result, args = arguments;
  17.                             var context = arguments[0];
  18.                             var sheet = context.source.getSheet();
  19.                                 setTimeout(function(){
  20.                                         sheet.setArray(5, 1, [[100,200,300],[300,500,600]]);
  21.                                 },0);
  22.                             
  23.                           
  24.                             return 1
  25.                           
  26.                         }
  27.                         GC.Spread.CalcEngine.Functions.defineGlobalCustomFunction('qc',new qc());
  28.         }
复制代码
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-9-7 18:08:16
2#
您好,
您参考附件的demo模板,将自定义函数信息补充完整,需要可复现您描述的问题。
这边在demo基础上实际测试调研下原因。

demo-designer模板.html

4.8 KB, 下载次数: 43

回复 使用道具 举报
果爸
注册会员   /  发表于:2022-9-7 20:26:34
3#
代码补充完整了

demo-designer模板.zip

1.26 KB, 下载次数: 39

回复 使用道具 举报
果爸
注册会员   /  发表于:2022-9-9 10:54:27
5#
这样设置一下是可以显示出来结果,但是系统好像一直在执行setArray,如果想修改单元格的值,离开单元格后,就自动变成之前的数字,我把setArray的数组参数修改成从号后台请求的数据,就发现系统一直在跟后台请求数据,一直在执行setArray image.png483277282.png image.png317380980.png
回复 使用道具 举报
果爸
注册会员   /  发表于:2022-9-9 18:18:45
6#
这个问题搞定了,我看了其他的一个帖子,跟我的问题一样,谢谢
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-9-9 18:33:16
7#
是这样的,setArray方法内部为了加速计算,内部调用了resumeCalcService()。
resumeCalcService()会导致所有公式重新计算,这就导致了死循环。所以会一直不停的触发自定义函数的evaluate方法。
解决方法是,在setArray之前先将CalcService挂起,setArray结束之后再用sheet.resumeCalcService(false); 重新计算,这里传入false代表只计算脏数据。这样就不会全部计算了。
相关代码修改参考如下:
  1. setTimeout(function(){
  2.            sheet.suspendCalcService(true);
  3.            sheet.setArray(5, 1, [[100,200,300],[300,500,600]]);
  4.            sheet.resumeCalcService(false);
  5. },0);
复制代码
回复 使用道具 举报
果爸
注册会员   /  发表于:2022-9-9 18:44:13
8#
是的,非常感谢
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-9-13 18:34:51
9#
您客气了,如果问题已解决那本帖就先结贴了, 有问题欢迎另开新帖交流。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部