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

QQ登录

只需一步,快速开始

小仙

注册会员

12

主题

21

帖子

75

积分

注册会员

积分
75
小仙
注册会员   /  发表于:2025-3-28 09:52  /   查看:230  /  回复:10
24金币
本帖最后由 小仙 于 2025-3-31 16:10 编辑
  1. class StatementF extends GC.Spread.CalcEngine.Functions.AsyncFunction {
  2.   cellRequestMap: Map<string, CellRequest>;

  3.   constructor(name: string) {
  4.     super(name, 1, 255);
  5.     this.cellRequestMap = new Map<string, CellRequest>();
  6.   }

  7.   defaultValue(): any {
  8.     return "Loading";
  9.   }

  10.   evaluateAsync(context: GC.Spread.CalcEngine.AsyncEvaluateContext): any {
  11.     const args = arguments;
  12.     const p = arguments[0]
  13.     console.log(context)
  14.     const sheetId = p.ctx.source.id
  15.     if (args.length != 3) {
  16.       context.setAsyncResult("参数异常");
  17.       return;
  18.     }
  19.     // 获取context的内存地址
  20.     // 将请求参数收集到全局数组中
  21.     this.cellRequestMap.set(sheetId + '-' + p.row + '-' + p.col, {
  22.       formula: args[1],
  23.       argStr: args[2],
  24.       context: context
  25.     });

  26.     // 设置默认值,默认值是文本类型,和其他的一起的时候会报#NAME?
  27.     context.setAsyncResult("Loading...");
  28.   }
  29. }
复制代码
异步函数的实现如代码,现在有个问题,就是我用map收集请求的时候,多个sheet中相同行列的单元格会被覆盖,所以我加了一个sheetId,但貌似不是实际sheet的id,因为现在如果我有清除单元格的操作或者修改单元格内容的时候,我没法在map中找到对应sheet的对应单元格的请求去把它从map里删除,不然我把map中的请求统一发起的时候,还是会把已经清除了的单元格原来的请求触发

最佳答案

查看完整内容

我没有考虑到您还有导入包含自定义异步公式的文件后重算的场景,您可以试下下图中的代码获取,我测试过即便导入后也可以获取公式所在sheet名称:

10 个回复

倒序浏览
最佳答案
最佳答案
Wilson.Zhang
超级版主   /  发表于:2025-3-28 09:52:01
来自 11#
小仙 发表于 2025-4-9 14:16
你这代码意思不是获取当前active的sheet吗,假如我导入一个多sheet的表格,全部导入而且导入时公式重新计 ...

我没有考虑到您还有导入包含自定义异步公式的文件后重算的场景,您可以试下下图中的代码获取,我测试过即便导入后也可以获取公式所在sheet名称:
获取异步公式所在sheet信息.png14562071.png
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-3-31 17:55:17
2#
您好!请问下您使用的sheetId实际是什么?公式中的引用单元格一般通过sheet名称识别,比如Sheet1!A1即名称为”Sheet1“的sheet中的单元格A1。
回复 使用道具 举报
小仙
注册会员   /  发表于:2025-4-3 16:41:27
3#
Wilson.Zhang 发表于 2025-3-31 17:55
您好!请问下您使用的sheetId实际是什么?公式中的引用单元格一般通过sheet名称识别,比如Sheet1!A1即名称 ...

主要我也拿不到sheet的名称哇,异步函数context里没有相关的字段表示哪个sheet
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-4-3 17:40:13
4#
小仙 发表于 2025-4-3 16:41
主要我也拿不到sheet的名称哇,异步函数context里没有相关的字段表示哪个sheet

请教下您想要实现的业务需求?

参考您提供的描述内容,理解可能在多个sheet中都设置了自定义的异步公式,代码运行时无法识别自定义异步公式内部的处理单元格属于哪个sheet,从而导致计算混乱,不同sheet中相同单元格之间存在内容覆盖情况。

如果上述理解不正确,需要您详细介绍下。
回复 使用道具 举报
小仙
注册会员   /  发表于:2025-4-3 17:50:42
5#
Wilson.Zhang 发表于 2025-4-3 17:40
请教下您想要实现的业务需求?

参考您提供的描述内容,理解可能在多个sheet中都设置了自定义的异步公 ...

对的对的,我目前的需求就是这样
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-4-7 09:46:23
6#
小仙 发表于 2025-4-3 17:50
对的对的,我目前的需求就是这样

对于内置公式和自定义公式,同一个Designer实例或Worksheet实例中均只有一个对应公式实例。在计算时,普通公式的evaluate方法和异步公式的evaluateAsync方法可以根据传参识引用单元格来源,这样保证了公式计算结果正确。

对于您的需求,您可以在evaluateAsync方法运行时从上下文环境中获取当前sheet信息。比如,在使用Designer的情况下,对evaluAsync方法内部使用如下代码依次获取当前sheet信息:
  1. GC.Spread.Sheets.Designer.findControl('ss').getWorkbook().getActiveSheet().name();
复制代码

无论在哪个sheet中设置了自定义异步公式,公式在计算时便会通过上述代码先获取Designer实例,进一步获取Workbook和Worksheet,便可了解公式运行在哪个sheet中。
回复 使用道具 举报
不吐葡萄皮
初级会员   /  发表于:2025-4-7 12:29:03
7#
我记得context.setAsyncResult 必须要在异步里面执行,试试在外面包一个setTimeout,
还有是已经定义了defaultValue() 就不需要再context.setAsyncResult("Loading...");
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-4-7 17:32:12
8#
不吐葡萄皮 发表于 2025-4-7 12:29
我记得context.setAsyncResult 必须要在异步里面执行,试试在外面包一个setTimeout,
还有是已经定义了def ...

回复 使用道具 举报
小仙
注册会员   /  发表于:2025-4-9 14:14:07
9#
不吐葡萄皮 发表于 2025-4-7 12:29
我记得context.setAsyncResult 必须要在异步里面执行,试试在外面包一个setTimeout,
还有是已经定义了def ...

不用的呀,我是想要拿到绑定的单元格索引,具体到哪个sheet,赋值这块没问题的,但是因为我想要收集单元格请求,实现可多次刷新
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部