Javascript Excel SelectionChanged事件未触发
开发链:Microsoft Visual Studio代码,Excel在线加载项,使用Chrome进行调试 我一直在开发一个Excel加载项,使用上述工具已经有相当一段时间没有问题了。最近,我遇到了一些问题,在运行调试版本时ExcelJavascript Excel SelectionChanged事件未触发,javascript,excel,reactjs,office-js,Javascript,Excel,Reactjs,Office Js,开发链:Microsoft Visual Studio代码,Excel在线加载项,使用Chrome进行调试 我一直在开发一个Excel加载项,使用上述工具已经有相当一段时间没有问题了。最近,我遇到了一些问题,在运行调试版本时ExcelSelectionChanged事件没有触发,尽管成功调用了AddHandlerAsync。大约只有十分之一的调用会成功地设置钩子 我并没有改变我的代码中的任何主要内容,但我的组织最近确实在所有设备上实现了MDM,包括台式机和笔记本电脑。正如你可能想象的那样,这对我
SelectionChanged
事件没有触发,尽管成功调用了AddHandlerAsync
。大约只有十分之一的调用会成功地设置钩子
我并没有改变我的代码中的任何主要内容,但我的组织最近确实在所有设备上实现了MDM,包括台式机和笔记本电脑。正如你可能想象的那样,这对我的工作效率是一个巨大的障碍
我正在使用React(create React app
)和office ui fabric React
我有以下代码来设置回调:
window.addEventListener('DOMContentLoaded', () => {
Office.initialize = (reason) => {
console.log('Office.initialize called with reason = ' + reason)
Office.context.document.addHandlerAsync(
Office.EventType.DocumentSelectionChanged,
(eventArgs) => {
this.onExcelSelectionChanged(eventArgs)
},
(asyncResult) => {
if (asyncResult.status == "succeeded") {
console.log('Selection changed handler was added')
} else {
console.log(`Error setting event: ${JSON.stringify(asyncResult)}`);
}
})
}
})
调用成功,但在VS代码调试器(带有Chrome扩展的调试器)中运行时,不会触发事件。这以前效果不错。它在生产环境中似乎运行良好
2018年2月23日编辑:
我似乎已经解决了我的大部分问题。我正在使用React路由器,并且拥有Office。初始化为每个路径设置的功能
为了解决问题,我使用create react app
创建了一个全新的加载项,如中所述。我注意到Office.initialize
位于index.js
中,它包装了ReactDOM.render(…)
调用。我在我的代码中重新调整了一些东西来模拟它,现在它似乎工作得更好了,尽管它仍然时不时地漏掉钩子。很抱歉给您带来不便。您是否在联机版本和桌面版本上都遇到此问题
有一个案件正在调查中。有什么调试信息可以与我们共享吗?当涉及到Office.t initialize
时,首要规则是尽早分配您的功能。在分配Office.initialize
之前,Office无法连接外接程序。如果超时时间太长,它可能会非常激进(不同平台之间的超时时间相差5秒)
如果看不到你是如何站起来的,就很难确定发生了什么。也就是说,您的index.js
应该如下所示:
import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
import App from "./App";
import registerServiceWorker from "./registerServiceWorker";
import { BrowserRouter } from "react-router-dom";
const Office = window.Office;
Office.initialize = (reason) => {
ReactDOM.render(
<BrowserRouter>
<App />
</BrowserRouter>,
document.getElementById("root")
);
registerServiceWorker();
};
话虽如此,我自己从来没有遇到过这种需要。我建议最初放弃DOMContentLoaded
。如果您发现有特殊需要,可以随时添加 你能为最少的复制添加示例代码吗?@MichaelZlatkovsky-Microsoft-Thansk用于快速响应。我用一些代码进行了更新,但会看看我能做些什么来设置更好的复制。只是想一想,您是否尝试过使用新的APIlet handler=workbook.onSelectionChanged.add(onSelectionChanged)代码>这当然需要在批处理中。脚本实验室Excel示例中显示了一个示例,您可以查找该示例以供参考。感谢@SudhiRamamurthy-我不知道该API,我将检查它。到目前为止,我只在浏览器上尝试过它-我将进一步调查。
Office.initialize = reason => {
window.addEventListener("DOMContentLoaded", () => {
ReactDOM.render(
<BrowserRouter>
<App />
</BrowserRouter>,
document.getElementById("root")
);
registerServiceWorker();
});
};