整洁的方式获得环境(即Office版本)
不幸的是,在所有环境中,office API的某些function并不完全相同(例如:Excel Online和Excel 2013中的格式)。 另外,一些不错的新function在Excel 2013中不可用,但在Excel 2016中可用(Excel.js)
当然,我可以告诉用户他们只能在2016年使用我的应用程序,而不是实现在所有环境中都不完全支持的事情。
我宁愿将自己的应用程序提供给Excel 2013的用户,即使他们没有办法(或倾向于)升级到2016年。我宁愿在function较差的环境中优雅地降级我的function列表,而不是将应用程序function限制为整个)
封装与文档的所有交互并根据环境运行不同的代码是很容易的。 也就是说,如果我知道我所处的确切环境是什么。当前的office.js提供了一个很好的方式来发现主机应用程序的版本和上下文(在线/离线)吗? 我无法在office.context等中find任何东西。
网上有一些关于整个.getContext链入侵的build议,但这些链接似乎是“无证”( http://wp.sjkp.dk/how-to-detect-if-an-app-for-office-is – 从办公室打开/ ),所以我不是很高兴。
有什么build议么?
更新2016年12月5日:我们将很快发布一个API来检测平台信息 (部分原因是最近需要为Office Online删除_host_info
URL参数,这些参数非正式地依赖于这个事实)。 我们也有一个临时的解决方法,预计即将到来的官方API。 请参阅“ 在Excel Online中,OfficeJS API不再将Host_Info_parameter passing给Excel加载项 ”以了解有关API和解决方法的信息。
我在下面保留旧的答案 ,因为它对于大多数亮起的情况仍然是相关的 。 平台检测仍然应该谨慎使用,因为查询API集给你更细致的控制 ,并确保你的插件添加到特定的平台“点亮”新function。
这听起来像是在描述一个“点亮”的场景。 对于这类用例,并不是真正关心的版本(你真的想保留所有最低版本的内部列表 – Excel桌面,并很快Excel Online和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 }
官方文件即将出版,我们的样本也将很快开始使用。 敬请关注…
目前新发布的Excel API集都在“ExcelApi”版本1.1下。 当我们添加新的API时,我们将它们添加到1.2集合,1.3集合等等(并且在文档中标记并且智能感知每个API可用的集合版本)。 那有意义吗?
为了完整起见,还需要注意一些有关Office.js版本控制的其他内容:
1)为确保您拥有最新的API,错误修复程序等,您应始终使用CDN位置,在我们推出新function时将其就地更新。 该位置是lib/1/hosted/office.js 。 https://appsforoffice.microsoft.com/lib/1.1/hosted/office.js也适用,“1”版本目前只是“1.1”的别名;……但长期来看,这可能是最好的切换到“1”url。
2)推论如上: 即使对于较老的主机,也应该使用最新的CDN位置。 这样,你们都可以获得新function的“点亮”,并修复了错误(包括旧主机版本)。 基本上,您总是可以使用最新的CDN,并依靠Office.js脚本的dynamic加载来加载您需要的实际的主机特定的文件。
3)对于新的API集“ExcelApi”和“WordApi”以及现有集(例如“MatrixBinding”),您可以使用新的isSetSupported API。
4)作为“办公室”的一部分的API。 命名空间,您也可以使用“防御性编程”来执行单个函数的运行时检查(例如,检查是否支持Office.context.document.bindings && Office.context.document.bindings.addFromSelectionAsync)
。 但是,您可以看到这可能会变得非常冗长,因此检查一组应该会容易得多。 此外,这将不适用于“Excel”或“Word”命名空间下的API,因此更需要使用Office.context.requirements.isSetSupported
API。
5)最后:对于只有在给定的需求集合存在的情况下运行才有意义的应用程序,您可以在应用程序的清单中指定API集合 。 也就是说,清单检查是指定绝对最低要领 ,没有这个要求,应用程序不会运行(甚至不能在插入对话框中显示)。 同时,运行时检查可让您控制如果不支持某个特定的API(提供“lightup”function或降级的体验)选项,您将如何反应。 所以,我通常会build议使用对您的应用程序有意义的最低清单要求,然后进行运行时检查以点亮新function。
希望这可以帮助,
〜Michael Zlatkovsky
MSFT的Office Extensibility团队开发人员