请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

Jobcrazy

初级会员

29

主题

96

帖子

387

积分

初级会员

积分
387
Jobcrazy
初级会员   /  发表于:2017-12-21 11:07  /   查看:10677  /  回复:22
异步函数与sum等函数冲突问题,详情请见下图描述和附件demo。
image.png437626342.png image.png302546691.png



demo.zip

8.06 MB, 阅读权限: 150, 下载次数: 7

22 个回复

倒序浏览
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-12-21 15:15:48
沙发
您好:
之所以出现#VALUE是因为您公式中存在循环引用导致
您B21单元格的参数用了B3-B12 , B12中用了 B13:B20当参数, 而其中B18又用了B21当参数,这很明显是一个循环引用。
回复 使用道具 举报
gaosion
注册会员   /  发表于:2017-12-21 15:55:08
板凳
您好,感谢您的耐心解答,我们给的demo中并没有循环引用,B18单元格中,您看到的B21引用,这里B21并不是当前渲染的这张表的B21单元格,而是异步函数ppxeq里面第一个参数指向的对应json数据的B21单元格,这里我们可以将异步函数ppxeq称为跨文件的表间函数,引用的是另一个文件的单元格,所以并没有循环引用,但是spread认为该逻辑是循环引用了吗?这样的问题有没有解决途径呢?我们曾尝试过将单元格信息用引号包裹,但是因为不能方便的用下拉复制的方式使用,为了满足下拉复制的需求,才将单元格信息裸露,有没有办法规避这样的“循环引用”呢?
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-12-21 17:48:50
地板
如果是这样,那需要您提供一下您设置公式的顺序了,最好是能够知道设置到哪一步时开始出现#VALUE的,这样就能找到问题的源头,也就知道怎么回事了。
回复 使用道具 举报
gaosion
注册会员   /  发表于:2017-12-21 18:18:49
5#
demo中有异步函数定义的地方,就是根据官方的异步函数定义的函数,源码中的执行顺序我们也不得而知,demo中的文件路径:
/demo/src/toptab/tobtab.js

代码截图如下:
image.png965044250.png (98.09 KB, 下载次数: 2)
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-12-22 10:37:14
6#
这个确定就是循环引用造成的,举个例子,B4单元格引用了B6,按照您的说法B6是其他表格的B6不是本Sheet的B6但是,如果您将B6设置一个固定值,就会发现B4的值就不是#Value了,说明引用的您设置的B6与spreadjs默认的B6是存在冲突的,这样也就造成了循环引用,另外您说的满足下拉复制,这个没办法,spreadjs目前只对默认的部分关键字存在下拉复制。
回复 使用道具 举报
gaosion
注册会员   /  发表于:2017-12-22 10:47:47
7#
其实我也感觉到了有冲突,spread.js可能在渲染时是先判断是否循环引用再启用钩子触发异步函数的,这里存在一个先后顺序的问题,难道就没办法改一改底层的机制么?这里出现value时通过打断点查看异步函数运行顺序时会发现出现value的异步函数根本不会触发函数的执行,像是被过滤掉了。
回复 使用道具 举报
gaosion
注册会员   /  发表于:2017-12-22 10:52:13
8#
能否提供一个方法,可以略过特殊自定义函数 参数循环引用的方法?或者是其他什么途径解决这个问题,下拉可以提高工作效率,是必须的,麻烦了
回复 使用道具 举报
gaosion
注册会员   /  发表于:2017-12-22 11:20:49
9#
刚发现=和sum() 函数并不会因为循环引用而无法计算,为什么我的自定义函数会出现这样的问题呢?

image.png55681151.png

image.png787183837.png

虽然计算结果不对,但是可以执行啊
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-12-22 12:01:38
10#
那是因为Excel本身对循环引用有错误提示,spreadjs本身出于性能考虑没有进行循环引用的校验,但是这样的做法本身是不对的,因为这样做出了问题我们没办法提供支持。另外单元格引用的关键字与spreadjs中的关键字冲突这是您另一个问题。
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部