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

QQ登录

只需一步,快速开始

spreadjs666
金牌服务用户   /  发表于:2025-4-30 11:06  /   查看:148  /  回复:16

如何禁用单元格中=G5:G7,原因:用户使用后,cmd中无法获取到所有的被修改的单元格,及I5:I7

image.png427505187.png

image.png380464476.png

16 个回复

倒序浏览
Matthew.Xue
超级版主   /  发表于:2025-4-30 11:57:16
沙发
您好,请问您说的禁用单元格中G5:G7具体是什么意思呢?是不让用户输入吗?
回复 使用道具 举报
spreadjs666
金牌服务用户   /  发表于:2025-4-30 12:24:18
板凳
Matthew.Xue 发表于 2025-4-30 11:57
您好,请问您说的禁用单元格中G5:G7具体是什么意思呢?是不让用户输入吗?

禁用这个公式扩展直接返回error之类的
回复 使用道具 举报
Matthew.Xue
超级版主   /  发表于:2025-4-30 13:32:51
地板
spreadjs666 发表于 2025-4-30 12:24
禁用这个公式扩展直接返回error之类的

抱歉,真的很难理解,能详细说一下吗?
用户做出什么操作,当前是什么现象,预期是什么现象,请描述清楚一点
回复 使用道具 举报
spreadjs666
金牌服务用户   /  发表于:2025-4-30 14:21:19
5#
Matthew.Xue 发表于 2025-4-30 13:32
抱歉,真的很难理解,能详细说一下吗?
用户做出什么操作,当前是什么现象,预期是什么现象,请描述清楚 ...

【=G5:G7】是一个公式,使用后会自动扩展落值其他单元格,但是eventListener中又没有参数可以获取到其他单元格的范围,导致我们无法处理一些逻辑。因此我们想禁用这个 =X:X这个函数,在单元格中展示!ERROR或者其他都行,就是不要让它自动扩展落值其他单元格了。
image.png801716003.png
image.png211818846.png
回复 使用道具 举报
Matthew.Xue
超级版主   /  发表于:2025-4-30 15:06:25
6#
这里给您提供一个简单的方案,方案的原理是利用cellChanged事件,监听单元格的变化,如果单元格此次的变化是设置公式,那么就看这个公式是否符合您希望避免出现的情形。这里利用了formulaToExpress方法,它返回一个公式树,其中type为1时,则为引用(Reference),然后继续判断是单个的单元格引用还是一个区域的引用,如果是区域,则将公式置为空。是否为区域的判断方式是看express中有没有endRow和endColumn属性。
  1. spread.bind(GC.Spread.Sheets.Events.CellChanged, function (sender, args) {
  2.     // 只处理公式
  3.     if (args.propertyName != "formula" || !args.newValue) {
  4.         return
  5.     }
  6.     let expression = GC.Spread.Sheets.CalcEngine.formulaToExpression(args.sheet, args.newValue)
  7.     // type=1代表:表达式的内容是一个引用
  8.     if (expression.type == 1) {
  9.         let keys = Object.keys(expression)
  10.         // A1:A3是一个引用,A1也是一个引用,前者不允许,而后者允许
  11.         // 只有A1:A3这种引用,有endColumn和endRow属性
  12.         if (keys && keys.indexOf("endColumn") > -1 || keys.indexOf("endRow") > -1) {
  13.             args.sheet.setFormula(args.row, args.col, null)
  14.             args.sheet.setValue(args.row, args.col, null)
  15.         }
  16.     }
  17. });
复制代码


回复 使用道具 举报
Matthew.Xue
超级版主   /  发表于:2025-5-6 12:12:32
7#
您好,请问您遇到的问题是否解决了呢,没有解决的话咱们可以继续讨论
回复 使用道具 举报
spreadjs666
金牌服务用户   /  发表于:2025-5-6 14:14:41
8#
Matthew.Xue 发表于 2025-5-6 12:12
您好,请问您遇到的问题是否解决了呢,没有解决的话咱们可以继续讨论

您好,看到您给出的方式是在最后触发了
args.sheet.setFormula(args.row, args.col, null)
args.sheet.setValue(args.row, args.col, null)
按照这个方案如果当前单元格原来有值,如“AAA”, 双击输入“=A1:C1”,落值就自动清空了
我们期望的是在输入框失焦时区分,如果是=“A1:C1”的公式就禁止落值,不调用cmd,也不走CellChanged
回复 使用道具 举报
Matthew.Xue
超级版主   /  发表于:2025-5-6 14:32:03
9#
spreadjs666 发表于 2025-5-6 14:14
您好,看到您给出的方式是在最后触发了
args.sheet.setFormula(args.row, args.col, null)
args.sheet. ...

这个问题并不难解决,您只需要监听用户的editStarting事件,在用户开始编辑之前记录下当前单元格的值,最后如果用户输入的公式不符合预期,将原本的值设置回去即可。
回复 使用道具 举报
spreadjs666
金牌服务用户   /  发表于:2025-5-6 16:24:27
10#
Matthew.Xue 发表于 2025-5-6 14:32
这个问题并不难解决,您只需要监听用户的editStarting事件,在用户开始编辑之前记录下当前单元格的值,最 ...

您好,我们期望的是在输入框失焦时区分,如果是=“A1:C1”的公式就禁止落值,不调用cmd
原因是我们在addeventlistener时进行了监听和协同处理,因此如果按照您给出的方案,此时已经触发了cmd,请问有方法可以解决吗
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部