找回密码
 立即注册

QQ登录

只需一步,快速开始

Silhouette

注册会员

7

主题

9

帖子

58

积分

注册会员

积分
58
  • 140

    金币

  • 7

    主题

  • 9

    帖子

Silhouette
注册会员   /  发表于:2022-10-24 17:41  /   查看:1418  /  回复:4
10金币

操作如下:

1. 自定义函数(customFunc)中调用http请求获取数据

2. 遍历数据使用setValue赋值到sheet中

3. 通过setValue赋值(例如 A1 = 3)

赋值后sheet中存在其他的公式(例如=SUM(A1, 4))和引用(例如=A1)不会触发自动更新或重新计算 需要在自定义函数中调用recalcAll重新触发计算, recalcAll也会触发该自定义函数(customFunc) 导致无限循环 请问有什么方法可以解决这种问题吗?

最佳答案

查看完整内容

自定义异步函数,参考 通过setAsyncResult方法返回结果, 性质属于"计算返回结果",会触发相关单元格重新计算

4 个回复

倒序浏览
最佳答案
最佳答案
18932441132
注册会员   /  发表于:2022-10-24 17:41:10
来自 4#
本帖最后由 18932441132 于 2022-11-10 11:31 编辑

自定义异步函数,参考
  1. new GC.Spread.CalcEngine.Functions.AsyncFunction()
复制代码


通过setAsyncResult方法返回结果,
性质属于"计算返回结果",会触发相关单元格重新计算
  1. customFunction.prototype.evaluateAsync = function evaluate(context){
  2.      let result = await post()
  3.      context.setAsyncResult(result)
  4. }
复制代码



回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-10-24 18:22:59
2#
建议上传一个重现问题的demo上来,
你提到的2,3 步骤,我看是通过代码完成的,这个正常来说设置后如果有单元格引用的A1是可以触发计算的。我不确定你这个问题是如何产生的
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-11-1 17:28:21
3#
不知道楼主问题是否已经解决,如果仍未解决,欢迎继续上传一个重现问题的demo,我们来协助调查
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-11-10 15:42:41
5#
,楼上正解,setAsyncResult是异步方法返回结果的正确放式,在公式值改变或其他的公式单元格也是会自动计算的。不应该在异步函数中去setValue。

这样就不会有楼主说的“不会触发自动更新或重新计算”的问题,也就不需要recalcAll了。在方法中又去调用recalcAll肯定是会死循环的


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