获得环境的巧妙方法(即 Office 版本)

Neat ways to get environment (i.e. Office version)

遗憾的是,office API 的某些功能在所有环境中的表现并不完全相同(例如:Excel Online 和 Excel 2013 中的格式设置)。此外,一些不错的新功能在 Excel 2013 中不可用,但在 Excel 2016 中可用 (Excel.js)

当然,我可以告诉用户他们只能在 2016 版中使用我的应用程序,而不能实现并非在所有环境中都完全支持的功能。

我更愿意向 Excel 2013 年的用户提供我的应用程序,即使他们没有办法(或倾向于)升级到 2016 年。而且我宁愿在更少的时间内优雅地降级我的功能列表能力强的环境而不是限制应用程序的整体功能)

根据环境封装与文档的所有交互和 运行 不同的代码非常容易。也就是说,如果我知道我所处的确切环境。当前的 office.js 是否提供了一种巧妙的方法来发现主机应用程序的版本和上下文 (online/offline)?我在 office.context...等

中找不到任何内容

网上有一些关于入侵整个 .getContext 链的建议,but these seem to be "undocumented",所以我对此不太满意。

有什么建议吗?

2016 年 12 月 5 日更新:我们将很快发布 API 来检测平台信息(部分是为了回应 _host_info URL 人们非官方依赖的参数,最近需要从 Office Online 中删除)。我们也有一个临时的解决方法,以应对即将到来的官方 API。 有关 API 和解决方法的信息,请参阅“In Excel Online, OfficeJS API is not passing the host_Info_ parameter anymore to Excel Add-In”。

我保留下面的旧答案,因为它仍然适用于大多数点亮场景平台检测仍应谨慎使用,因为查询 API 集可为您提供更细粒度的控制,并确保您的加载项 "lights up" 新功能它们被添加到特定平台]。


听起来你在描述一个 "light-up" 场景。对于这类用例,您关心的 actual 版本并不是那么多(您真的想保留所有最低版本的内部列表吗? Excel 桌面,很快 Excel 在线和 iOS,并保持更新?),而是,您想检查 能力 是否存在某些东西.然后根据能力是否存在提供差异化​​体验。

为此,我会推荐一个全新的 API,我们刚刚与这些 API 一起发布(并且向后移植到所有以前的版本 - 只要你正在使用来自 CDN 的最新 Office.js,你应该可以开始了)。 API 使您能够在 运行 时检查是否支持特定的 API 集合。看起来像:

if (Office.context.requirements.isSetSupported('ExcelApi', 1.1)) {
    // Do something that is only available via the new APIs
}

它的官方文档即将发布,我们的示例也将很快开始使用它。敬请期待...

目前新出的ExcelAPI组都是"ExcelApi"1.1版本。当我们添加新的 API 时,我们会将它们添加到 1.2 集、1.3 集等(并在文档和 IntelliSense 中标记每个 API 可用的集版本)。这有意义吗?


为了完整起见,关于 Office.js 版本控制的其他一些注意事项:

1) 为确保您拥有最新的 APIs、错误修复等,您应该始终使用 CDN 位置,它会在我们推出新功能时就地更新。该位置 https://appsforoffice.microsoft.com/lib/1/hosted/office.js. https://appsforoffice.microsoft.com/lib/1.1/hosted/office.js 也有效,“1”版本目前只是“1.1”的别名……但从长远来看,最好切换到“1”URL.

2) 上述推论:您应该始终使用最新的 CDN 位置 ,即使是较旧的主机 。这样,你们都可以获得 "light-up" 的新功能和错误修复(包括旧主机版本)。基本上,你总是可以使用最新的 CDN,并依靠 Office.js 脚本的动态加载来加载你需要的实际主机特定文件。

3) 您可以将新的 isSetSupported API 用于新的 API 集合 "ExcelApi" 和 "WordApi",以及现有的集合(例如 "MatrixBinding").

4) 对于属于 "Office." 命名空间的 APIs,您还可以使用 "defensive programming" 对单个函数进行 运行 时间检查(例如,检查 Office.context.document.bindings && Office.context.document.bindings.addFromSelectionAsync) 是否受支持。但是,您可以看到这会变得非常冗长,因此检查集合应该容易得多。此外,这不适用于 [=75 下的 APIs =] 或 "Word" 命名空间,因此更有理由使用 Office.context.requirements.isSetSupported API.

5) 最后:对于仅在满足给定要求集的情况下 运行 才有意义的应用程序,您可以 specify the API set in the app's manifest。话虽这么说,清单检查是关于指定 绝对最低要点 ,没有它,应用程序根本不会 运行(甚至在插入对话框中显示为可用) .同时,运行 时间检查可让您控制在特定 API 不受支持(提供 "lightup" 功能选项或降级体验)时的反应方式。因此,我通常建议使用对您的应用有意义的最低清单要求,然后进行 运行 时间检查以启动新功能。

希望这对您有所帮助,

~ Michael Zlatkovsky
Office 可扩展性团队的开发人员,MSFT