当其他Excel实例具有焦点时,无法获得活动的工作表或所选范围

时间:2019-02-19 10:45:32

标签: excel office-js

我正在维护一个Office加载项,该加载项从服务器接收数据并将其写入活动工作表中的当前选择。

当我打开第二个工作簿时,第一个工作簿中的加载项不再能够获得活动的工作表。

当我关注第一个工作簿时,它又开始工作了。

我正在尝试获取活动工作表,如下所示:

Excel.run(function (ctx) {
  var sheet = ctx.workbook.worksheets.getActiveWorksheet();
  // insert code following ...
}

我收到以下错误:

Error at WorksheetCollection.getActiveWorksheet
InvalidSelection: The current selection is invalid for this operation.
 at Anonymous function 
  (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.debug.js:12439:6)
 at lib$es6$promise$$internal$$tryCatch 
  (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.debug.js:9240:8)
 at lib$es6$promise$$internal$$invokeCallback 
  (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.debug.js:9250:8)
 at lib$es6$promise$$internal$$publish 
  (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.debug.js:9226:9)
 at lib$es6$promise$asap$$flush 
  (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.debug.js:9060:8)

获取工作簿的选定范围也不起作用:

Excel.run(function (ctx) {
  var range = ctx.workbook.getSelectedRange().getCell(0, 0);
  // ...
}

类似错误:

Error at Workbook.getSelectedRange
InvalidSelection: The current selection is invalid for this operation.
 at Anonymous function 
  (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.debug.js:12439:6)
 at lib$es6$promise$$internal$$tryCatch 
  (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.debug.js:9240:8)
 at lib$es6$promise$$internal$$invokeCallback 
  (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32.16.01.debug.js:9250:8)
 at lib$es6$promise$$internal$$publish 
  (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.debug.js:9226:9)
 at lib$es6$promise$asap$$flush 
  (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.debug.js:9060:8)

这个问题最近才出现。

更新:事实证明,前一条陈述是错误的,行为始终是这样的(在未安装任何更新的情况下,使用新的MSI安装进行了测试)。

我无法通过从Visual Studio启动两个实例来重现它。

在Word中,外接程序ctx.document.getSelection()可以正常工作。

有什么我可以做的吗?

3 个答案:

答案 0 :(得分:1)

如果选择了第二个工作簿,则初始工作簿-因此您需要的工作表-将不再被标记为活动工作表。

在excel工作簿中切换焦点时,应谨慎使用activeworksheet。

我的建议是捕获活动工作表的名称并将其存储在一个变量中,或者仅对其进行简单的硬编码,然后在以后的所有引用中使用此变量

答案 1 :(得分:0)

我的印象是,这种方式一直在起作用。当您说它以前可以工作时,是否可以提供有关它曾经在哪个版本的Excel中工作的更多信息?我们将做更多调查,看看这是否是一种行为改变。

如果工作簿未处于活动状态,则getActiveWorksheet()可能会因为未处于活动状态而失败。

答案 2 :(得分:0)

一种解决方法是注册一个WorksheetActivatedEvent,跟踪事件中的工作表名称,然后在工作簿失去焦点时使用从名称中获取选定的工作表。

如果您能分享您的情况,那将是很棒的,这有助于我们更多地了解此问题。