找回密码
 立即注册

QQ登录

只需一步,快速开始

Wilson.Zhang
超级版主   /  发表于:2024-11-30 19:42  /   查看:55  /  回复:0
背景:在单元格中设置了引用其他单元格的公式,再基于该单元格拖拽填充,该过程自动更新填充单元格中公式需要引用的单元格。用户的业务场景规定了某些敏感单元格不允许被引用,如何在填充完成之前检测到被填充单元格的引用公式是否引用了敏感单元格,从而拦截填充。
问题原帖:https://gcdn.grapecity.com.cn/showtopic-229836-1-1.html

SpreadJS针对拖拽填充内置了两个事件,DragFillBlock和DragFillBlockCompleted事件。DragFillBlock事件发生在拖拽填充进行时,拖拽填充完成后触发DragFillBlockCompleted事件。面对这个问题背景,首先可以确定的是DragFillBlock事件能排上用场,在事件发生时推理被填充单元格相对于基单元格中的公式应该引用的单元格区域,了解到了引用单元格即可判断这些单元格是否为不允许被引用的敏感单元格。那么,真正的问题也来了,在拖拽填充结束前仅凭事件无法监听到被填充单元格需要引用的单元格,攻克这一点才是解决问题的关键。

DragFillBlock事件能够监听到被填充的单元格区域,而SpreadJS的计算引擎可以解析公式为表达式(formulaToExpression),也可以将表达式转换为公式(expressionToFormula),还可以了解公式的引用区域(formulaToRanges)。那么,可以尝试以下方案:

1. 将基单元格中的公式通过CalcEngine:formulaToExpression()转换为表达式,记为Expression。
2. 通过DragFillBlock事件监听到了目标填充区域,通过CalcEngine:expressionToFormula(),基于Expression和区域中的每个单元格的行列索引,可以得到在该单元格的公式,记为Formula。
3. 经过步骤2即可了解目前粘贴区域中每个单元格中的公式内容(此时还未完成填充),再将Formula通过CalcEngine:formulaToRanges()即可得到公式中引用的单元格,至此便可检查各引用单元格是否为敏感单元格。
4. 判断结束后,如果存在不允许被引用的敏感单元格,则在DragFillBlock事件中对args.cancel设置为false即可拦截拖拽填充,也可以在此同时弹出提示弹框告知用户存在敏感引用,否则继续执行后续业务,拖拽填充正常进行即可。

综上所述,在这样的案例场景中,需要灵活运用计算引擎在公式、表达式、引用区域之间的转换方式。





0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部