找回密码
 立即注册

QQ登录

只需一步,快速开始

eyAndrew

金牌服务用户

75

主题

343

帖子

980

积分

金牌服务用户

积分
980
eyAndrew
金牌服务用户   /  发表于:2024-7-22 14:50  /   查看:1183  /  回复:12
image.png944862365.png

如图,输入这样的一个公式, 底层处理成带上sheetName,想要的输出 =concat(当前sheetName!I11,Sheet1!I12), 怎么处理?

这个公式用的spreadjs自带的组件做的
image.png16405028.png

目前做法是change的时候去处理,拿到公式,通过api接口去转换,怎么把source加入进去?
image.png763708801.png

12 个回复

倒序浏览
eat_grape_5
高级会员   /  发表于:2024-7-22 15:41:42
沙发
对当前工作表中所有公式类型为引用的公式内容,在其对应的表达树中设置source属性,以将表达树通过expressionToFormula方法转换为“SheetName!A1”格式的公式,楼主的需求是这样吗?
回复 使用道具 举报
eyAndrew
金牌服务用户   /  发表于:2024-7-22 15:49:43
板凳
eat_grape_5 发表于 2024-7-22 15:41
对当前工作表中所有公式类型为引用的公式内容,在其对应的表达树中设置source属性,以将表达树通过expressi ...

是的, 完全符合, 有解决方案么?
回复 使用道具 举报
eat_grape_5
高级会员   /  发表于:2024-7-22 16:30:39
地板
eyAndrew 发表于 2024-7-22 15:49
是的, 完全符合, 有解决方案么?

有,其实是要通过source获取工作表名称,暂时还没找到设置source的方法,但是有一个思路可以实现楼主的需求:
1. 获取需要拼接工作表名称的引用公式。
2. 将当前工作表名称与引用公式拼接,格式如:Sheet1!A1,即引用工作表Sheet1的A1单元格值。
在往其他工作表设置该拼接公式时,前缀“=”即可。
上述思路如下代码所示:
  1. function setRefSheetName(refSheet, refRow, refCol) {
  2.         return refSheet.name() + "!" + refSheet.getFormula(refRow, refCol);
  3. }
复制代码
回复 使用道具 举报
eyAndrew
金牌服务用户   /  发表于:2024-7-22 16:37:26
5#
eat_grape_5 发表于 2024-7-22 16:30
有,其实是要通过source获取工作表名称,暂时还没找到设置source的方法,但是有一个思路可以实现楼主的需 ...

这样解决不了我的问题, 如果只是简单的拼接sheetName,不如直接正则匹配公式值,去处理了。
这个公式类型会有很多种,希望还是利用spreadjs的api,去处理
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-7-22 16:54:47
6#
您好,

1、观察存在Sheet1!的公式与不存在Sheet1!的公式的表达式树可以发现,存在Sheet1!的参数中有一个source属性。

image.png353212889.png

2、将这个source属性,赋值给原来不存在Sheet1!的参数,然后将其转为公式,输出结果。

image.png598567809.png

可以看到,此时就已经带上了Sheet1!

3、此时的基本的思路就已经有了,如何获取source成为了一个难题,目前并没有公开的API能够获取,只有通过表单中存在的公式才能获取,那么应该如何最小限度的获取呢?

一种方式是使用:

GC.Spread.Sheets.CalcEngine.formulaToExpression(sheet, "=SUM(Sheet1!A1)");

来获取这个source。

另一种方式则是使用customName来实现,以下是一个简单的示例:

  1. sheet.setValue(0, 0, 1);
  2. sheet.setValue(0, 1, 2);
  3. sheet.setValue(1, 0, 3);
  4. sheet.setFormula(0, 3, "=SUM(A1:B2)");

  5. sheet.addCustomName("temp", "=Sheet1!A1", 1, 1);
  6. let cn = sheet.getCustomName("temp");
  7. let exp = cn.getExpression();
  8. let sheetSource = exp.source;

  9. let newExp = GC.Spread.Sheets.CalcEngine.formulaToExpression(
  10.   sheet,
  11.   sheet.getFormula(0, 3)
  12. );
  13. newExp.arguments[0].source = sheetSource;
  14. let newFormulaStr = GC.Spread.Sheets.CalcEngine.expressionToFormula(
  15.   sheet,
  16.   newExp
  17. );
  18. sheet.setFormula(0, 3, newFormulaStr);
  19. sheet.removeCustomName("temp");
复制代码


结果如下:

image.png260853575.png

4、需要注意的是,此处所使用的方式并不是官方的接口,存在一定的使用风险,不排除将来的版本可能会对此处进行修改,建议进行完善地测试后再酌情使用。
回复 使用道具 举报
eat_grape_5
高级会员   /  发表于:2024-7-22 16:57:09
7#
Joestar.Xu 发表于 2024-7-22 16:54
您好,

1、观察存在Sheet1!的公式与不存在Sheet1!的公式的表达式树可以发现,存在Sheet1!的参数中有一个 ...


版主这个方法妙呀!
回复 使用道具 举报
eat_grape_5
高级会员   /  发表于:2024-7-22 16:58:59
8#
eyAndrew 发表于 2024-7-22 16:37
这样解决不了我的问题, 如果只是简单的拼接sheetName,不如直接正则匹配公式值,去处理了。
这个公式类 ...

楼上版主发布了个好方法!
回复 使用道具 举报
eyAndrew
金牌服务用户   /  发表于:2024-7-22 17:16:40
9#
Joestar.Xu 发表于 2024-7-22 16:54
您好,

1、观察存在Sheet1!的公式与不存在Sheet1!的公式的表达式树可以发现,存在Sheet1!的参数中有一个 ...

是的,目前用当前sheet,随便传一个单元格,获取expression, 拿到 source后赋值, 全部遍历完后再exressionToFormula, 感觉有点繁琐啊,有没有更好的解决方案?
回复 使用道具 举报
eyAndrew
金牌服务用户   /  发表于:2024-7-22 17:17:36
10#
eat_grape_5 发表于 2024-7-22 16:58
楼上版主发布了个好方法!

感谢,目前也是这样处理的
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部