【发布时间】: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 异常为下一个工作表创建。但是为什么要在“工作簿”范围内创建此名称?
当我重复该操作时,它会以工作表范围内的名称正常运行,并且不会引发异常。
潜在的问题可能是什么?任何建议将不胜感激!
【问题讨论】:
标签: javascript excel office-js add-in