由于新型Office Add-in的特点,它用Javascript/HTML/CSS等网页开发技术编写,可以在桌面客户端,浏览器,甚至移动应用中使用。这可以带来生产力的提升,并且有助于产品的商业化。
那么问题也就来了,有没有可能只编写一份代码,但是在不同环境运行的时候,执行不同的逻辑呢?这就需要在代码中能读取当前脚本运行环境。.
代码其实也很简单,Office JS SDK提供了一个函数可以用来读取相关的信息。请参考如下简单的代码
$("#run").click(() => tryCatch(run));
async function run() {
Office.onReady(async (info)=>{
await Excel.run(async (context) => {
const sheet = context.workbook.worksheets.getActiveWorksheet();
sheet.getRange("A1:B2").values=[
["应用程序",info.host],
["平台",info.platform]
];
await context.sync();
});
})
}
/** Default helper for invoking an action and handling errors. */
async function tryCatch(callback) {
try {
await callback();
} catch (error) {
// Note: In a production add-in, you'd want to notify the user through your add-in's UI.
console.error(error);
}
}
如果在桌面版运行,则结果如下
同样的代码,在浏览器版本运行,则结果如下
如果你只是为了判断当前脚本是否在某个客户端中运行,也可以用如下的代码实现:
if(Office.context.requirements.isSetSupported("ExcelApi")){
console.log("你在Excel中运行");
}
有点意思,那么是否还能检测Office的版本呢?严格意义上说,不行。能否检测当前Windows版本呢?你想太多了吧。当然,这都是出于安全隐私方面的考虑。
其实我们要检测Office版本,很可能是因为想确定某些功能是否被支持。除此之外,似乎就算你拿到版本号又有什么用呢?为了检测某些功能是否被支持,Office Add-in有更好的办法。
请参考 https://docs.microsoft.com/en-us/javascript/api/requirement-sets?view=excel-js-preview 这里的说明,针对不同的版本(平台),Office JS SDK能支持的功能也不同,它通过所谓的requirementset来定义。其实上面已经用到了。但我们可以进一步扩展一下。
if(Office.context.requirements.isSetSupported("ExcelApi","1.7")){
console.log("你在Excel中运行, 并且支持1.7版本的功能");
}