excel - 如何检测事件是由最终用户触发的? (通过代码忽略事件触发)

标签 excel office-js

这个问题来自我的一位正在开发 excel Web 插件的客户,他们想检测事件是由最终用户触发还是由代码触发。

他们已经注册了 Worksheet.onChanged 事件处理程序。

他们想忽略由他们的代码本身触发的 onChanged 事件更改。并专注于处理事件处理程序只应在用户更改值时完成。

设想:
加载项监听 sheetChange 事件。插件用户将值输入到交叉表中,插件将推送到服务器。
但是,插件 API 也可以对交叉表进行一些修改,例如,插件可以使用户单击并向下钻取以获取更多数据,它们的 API 逻辑将从服务中获取数据并写入交叉表.但是,sheetChanged 事件也会被触发。

客户尝试过的解决方案:

第一次尝试:
我们尝试在更改值之前取消注册事件处理程序。
然后我们在更改值后再次注册。
这不起作用,因为注销是异步的,我们无法等待注销。

第二次尝试:
context.runtime.enableEvents = false
这是不可能的,因为还有其他我们仍然感兴趣的事件。

当前尝试:
我们在更改值之前存储更改范围的地址。
在 onChanged 处理程序中,我们比较地址。
如果相同我们不做逻辑。
之后,我们再次删除地址的存储。

我也尝试使用全局标志并在事件处理程序中检查它,它不起作用。这是我的要点:https://gist.github.com/lumine2008/2b51d94d20cdca9ac9a0e97029dfd95c

最佳答案

Office.js 还没有提供这样的功能。

一些解决方法,包括 a) context.runtime.enableEvents API,b) 全局标志,或 c) 在更改范围之前取消注册事件并稍后重新注册事件,不能跨平台工作。
它们在某些场景下会过度抑制事件,这意味着一些由用户操作触发的事件也会被抑制。

最可靠的方法是您的“当前尝试”

  • 在更改值之前记录要更改的范围的地址。
  • 在 onChanged 事件处理程序中,将事件参数与您之前记录的地址进行比较。如果匹配,则清除记录并退出事件处理程序。
  • 关于excel - 如何检测事件是由最终用户触发的? (通过代码忽略事件触发),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61692830/

    相关文章:

    excel - 通过键盘输入激活 SelectionChange 上的单元格范围

    excel - 在 Excel 中使用 MS Query 查询自身(不是外部源)

    vba - excel:更改高级过滤器中的日期格式

    javascript - "Excel.run"是否不适用于用户定义的函数?

    azure - Office Word 加载项 adfs 登录

    excel - Excel 在哪里添加 list 文件安装到 Mac 上?

    javascript - 在 Excel 中使用 Office.js 的竞态条件

    Excel合并多行

    excel - VBA 2016 上的 SumIfs

    javascript - 在 Excel JS Office 加载项的自定义函数中获取当前 URL