【问题标题】:Neat ways to get environment (i.e. Office version)获取环境的巧妙方法(即 Office 版本)
【发布时间】:2018-01-26 00:40:03
【问题描述】:

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

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

我更愿意将我的应用程序提供给 Excel 2013 的用户,即使他们没有办法(或没有意愿)升级到 2016 年。而且我宁愿在功能较弱的环境中优雅地降级我的功能列表,而不是限制应用程序的整体功能)

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

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

有什么建议吗?

【问题讨论】:

  • Aremes,关于您指出的第一个区别(Excel Online 和 Excel 2013 中的格式):如果您能提供更多信息,我很乐意为您查看。仅在某些平台/版本上支持某些功能是一回事(您可以根据我下面的回答使用需求检测),但行为不一致是另一回事。因此,如果您相信这方面的一个例子,请告诉我,我会提交一个错误(我在 Office 可扩展性团队工作)。
  • 谢谢,我有一些,我会写下来并在本周末之前给你:)

标签: office365 office-js


【解决方案1】:

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 集可为您提供更细粒度的控制,并确保您的插件在添加到特定平台时“点亮”新功能] .


听起来你在描述一个“点亮”的场景。对于这类用例,您关心的并不是 实际 版本(您真的想要保留所有最低版本的内部列表吗? Excel Online 和 iOS,并保持更新?),而是您想要检查存在的功能。然后根据功能是否存在提供差异化​​体验。

为此,我建议您使用我们刚刚与这些 API 一起发布的全新 API(并且可以向后移植到所有以前的版本 - 只要您使用的是来自CDN,你应该很高兴)。该 API 使您能够在运行时检查是否支持特定的 API 集。它看起来像:

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

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

当前新发布的 Excel API 集都在“ExcelApi”版本 1.1 之下。当我们添加新的 API 时,我们会将它们添加到 1.2 集、1.3 集等(并在文档和 IntelliSense 中标记每个 API 可用的集版本)。这有意义吗?


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

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

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

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

4) 对于属于“Office”一部分的 API。命名空间,您还可以使用“防御性编程”对单个函数进行运行时检查(例如,检查是否支持 Office.context.document.bindings && Office.context.document.bindings.addFromSelectionAsync)。但是,您可以看到这可能会变得非常冗长,因此检查集合应该容易得多。此外,这不适用于“Excel”或“Word”命名空间下的 API,因此更有理由使用 Office.context.requirements.isSetSupported API。

5) 最后:对于只有在存在给定要求集时才有意义运行的应用程序,您可以specify the API set in the app's manifest。话虽如此,清单检查是关于指定绝对最低要求,否则应用程序将无法运行(甚至在插入对话框中显示为可用)。同时,运行时检查可让您控制如果特定 API 不受支持(提供“点亮”功能选项或降级体验),您希望如何做出反应。因此,我通常建议使用对您的应用有意义的最低清单要求,然后进行运行时检查以发现新功能。

希望这会有所帮助,

~ 迈克尔·兹拉特科夫斯基
Microsoft Office 可扩展性团队的开发人员

【讨论】:

  • 我正在为此苦苦挣扎:我想检测我是在运行 Word 还是 Excel,但是代码 if (Office.context.requirements.isSetSupported("ExcelApi", 1.1)) { 没有进入Excel 2013 的 if。我也尝试过 1.0。我基本上不知道我是在 Word 还是 Excel 中。
  • @gremwell,是的,对于 Office 2013,无论哪种情况,它都会返回“false”。但是您可以选择另一个要求(理想情况下基于您为什么关心 Word 或 Excel)。例如,如果您使用的是 OOXML,则可以执行 isSetSupported("OOXMLCoercion"),这实际上只会在 Word 中返回“true”。这有帮助吗?
  • @MichaelZlatkovsky 如果您有一个以相同方式支持所有主机的应用程序,那么检查集合、函数等是很好的。但是,当您在 Word 和 Excel 之间有不同的行为(但核心相同)时,这是非常模糊的。为什么不在 API 中提供一个简单的主机属性?
  • @ndee,无论好坏,Office 2013 都有一个“通用 API”理念,根据设计,主机没有暴露。相反,开发人员只需要担心“绑定”之类的集合,以便相同的代码可以在所有支持绑定的主机上运行。显然,这对于某些场景来说不是最理想的(并且也极大地限制了我们可以使用 API 做的事情),这就是为什么在 2016 年以上的 API 浪潮中,我们有 主机特定 API,例如 Excel.Word. 等。这也意味着对于 2016+,您实际上总是可以通过查询 ExcelApiWordAPI 等集合来找到主机。
  • @MichaelZlatkovsky 何时 _host_Info 将用于 Office365 Outlook?我已经问过here,它在哪里描述了它是如何阻止我们的 Outlook 加载项的。谢谢。
猜你喜欢
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多