【问题标题】:Name scope issue when running Excel add-in on Office Web在 Office Web 上运行 Excel 加载项时的名称范围问题
【发布时间】:2020-03-08 22:48:09
【问题描述】:

在我的 Excel 加载项中添加命名范围时,我偶尔会遇到 ItemAlreadyExists 异常,并且仅在浏览器(而非桌面)中运行 Excel 时也是如此。

代码非常简单。对于每个工作表,我添加了一个名为“rulescape_ids”的命名范围。根据api docs,预计这将适用于工作表。

        private prepareAddNamedIdRange(): void {
            const namedRangeItem = this.sheet.names.getItemOrNullObject(this.idRangeName);
            if (namedRangeItem) {
                namedRangeItem.delete();
            }
            let idRange = this.headerCell.getRowsBelow(this.usedRangeLastCell.rowIndex + 100); // occasionally causing itemAlreadyExists on Office Web!!
            this.sheet.names.add(this.idRangeName, idRange);
        }

异常详情:

{"code":"ItemAlreadyExists","message":"A resource with the same name or identifier already exists.","errorLocation":"NamedItemCollection.add","statement":"var add=names.add(...);","surroundingStatements":["...","// Instantiate {rowsBelow}","var workbook=context.workbook;","var worksheets=workbook.worksheets;","var worksheet=worksheets.getItem(...) /* originally getItem(...) */;","var names=worksheet.names;","// >>>>>","var add=names.add(...);","// <<<<<","var v1=context.workbook._getObjectByReferenceId(\"R!{210136D6-71B5-4BF2-BEA0-9CBDA9AA57D1}!{C06F41B8-B778-4030-8D38-51BBA2FD9FAF}\") /* originally find(...) */;","var rowsBelow1=v1.getRowsBelow(...);","// Instantiate {rowsBelow1}","var worksheet1=worksheets.getItem(...) /* originally getItem(...) */;","var names1=worksheet1.names;","..."],"fullStatements":["var v=context.workbook._getObjectByReferenceId(\"R!{55F88602-7FD7-4AD4-A8D6-1B8578F08275}!{C06F41B8-B778-4030-8D38-51BBA2FD9FAF}\") /* originally find(\"_header\", {\"completeMatch\":true,\"matchCase\":true,\"searchDirection\":\"Forward\"}) */;","var rowsBelow=v.getRowsBelow(106);","// Instantiate {rowsBelow}","var workbook=context.workbook;","var worksheets=workbook.worksheets;","var worksheet=worksheets.getItem(\"{00000000-0001-0000-1000-000000000000}\") /* originally getItem(\"transaction fee data\") */;","var names=worksheet.names;","var add=names.add(\"rulescape_ids\", rowsBelow, undefined);","var v1=context.workbook._getObjectByReferenceId(\"R!{210136D6-71B5-4BF2-BEA0-9CBDA9AA57D1}!{C06F41B8-B778-4030-8D38-51BBA2FD9FAF}\") /* originally find(\"_header\", {\"completeMatch\":true,\"matchCase\":true,\"searchDirection\":\"Forward\"}) */;","var rowsBelow1=v1.getRowsBelow(112);","// Instantiate {rowsBelow1}","var worksheet1=worksheets.getItem(\"{00000000-0001-0000-0B00-000000000000}\") /* originally getItem(\"loan data\") */;","var names1=worksheet1.names;","var add1=names1.add(\"rulescape_ids\", rowsBelow1, undefined);","var v2=context.workbook._getObjectByReferenceId(\"R!{C1D50634-EBC2-4DDB-9D0F-494CB24980D8}!{C06F41B8-B778-4030-8D38-51BBA2FD9FAF}\") /* originally find(\"_header\", {\"completeMatch\":true,\"matchCase\":true,\"searchDirection\":\"Forward\"}) */;"...

异常之后,当我在 Excel 桌面打开工作簿并查看名称管理器时,我看到一个名称已创建为“工作簿”范围,如下面的屏幕截图所示,这解释了名称为时的 ItemAlreadyExists 异常为下一个工作表创建。但是为什么要在“工作簿”范围内创建此名称?

Name Manager screenshot

当我重复该操作时,它会以工作表范围内的名称正常运行,并且不会引发异常。

潜在的问题可能是什么?任何建议将不胜感激!

【问题讨论】:

    标签: javascript excel office-js add-in


    【解决方案1】:

    我在您的代码中看到的一个问题是它没有正确使用getItemOrNullObject 方法。在测试无效之前,您必须在调用此方法后执行 context.sync。此外,您不使用if (namedItemRange) 测试无效性。您使用if (namedItemRange.isNullObject) 进行测试。详情请见*OrNullObject Methods。我不知道这是否会解决您的问题,但无论如何您都需要进行修复,也许它会阻止错误。

    【讨论】:

    • 感谢您的回复,瑞克。实施您的建议后,我仍然收到错误消息。我是否还需要在 namedRangeItem.delete() 之后和 sheet.names.add(...) 之前进行同步?
    • 请提供更多代码。我们需要看看你的this 是什么。另外,我们需要查看整个Excel.run()
    • 感谢您提供查看代码。该代码跨越多个较大的类。我会尽量精简到它的本质并发送一个摘录。
    猜你喜欢
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    相关资源
    最近更新 更多