如何在JavaScript中使用Excel的RTD函数?调用遇undefined问题求助
解决Office JS调用RTD函数时的undefined及类型错误问题
我之前也碰到过和你一样的困惑:明明Office JS文档说支持RTD函数,但直接访问ctx.workbook.functions.rtd却返回undefined,调用时还触发类型错误。问题出在RTD函数并没有被Office JS作为预定义属性暴露在functions对象下,但我们可以通过另一种方式来调用它。
为什么会出现undefined?
Office JS的ctx.workbook.functions对象只封装了一部分常用的Excel内置函数,像RTD这种特殊的实时数据函数,并没有被直接挂载为functions的属性,所以你打印它自然会得到undefined,直接调用就会抛出类型错误。
正确的调用方法
我们需要使用ctx.workbook.functions.invokeFunction方法,这个方法可以调用任何Excel支持的函数,包括那些没有在functions对象中直接暴露的函数。
把你的代码改成下面这样就可以正常运行了:
Excel.run((ctx) => { // 用invokeFunction调用RTD函数,第一个参数是函数名 const userLogin = ctx.workbook.functions.invokeFunction( "RTD", 'ExcelRtd.RQData', null, 'login', 'test', 'test' ); userLogin.load('value'); return ctx.sync().then(() => { console.log(userLogin.value); }); }).catch((error) => { console.log('Error: ' + error); // 可以额外打印调试信息,方便排查问题 if (error instanceof OfficeExtension.Error) { console.log('Debug info: ' + JSON.stringify(error.debugInfo)); } });
几个关键注意点
- 确保你的RTD服务器
ExcelRtd.RQData已经在系统中正确注册,并且Excel可以正常访问它,否则会返回#NAME?或者其他相关错误。 - 调用
invokeFunction时,第一个参数是Excel函数的名称(这里是"RTD",大小写不敏感,但推荐用大写和Excel函数名保持一致)。 - RTD是实时数据函数,如果需要监听数据的实时更新,你可以通过添加工作表变化事件来捕获数据更新,而不是只在
sync后获取一次值。
内容的提问来源于stack exchange,提问作者Paul Han




