我有以下问题 insertContentControl()
返回的某些(但不是大部分)范围的数据。search()
.
本质上,我搜索各种术语,然后对每一个找到的术语,我试图创建一个内容控件。大多数情况下,这都是可行的,但是每隔一段时间,我就会得到一个GeneralException,看起来像这样。
{code: "GeneralException", message: "Sorry, something went wrong. Check the OfficeExtension.Error.debugInfo for more information. ", errorLocation: "Range.insertContentControl", statement: "var insertContentControl=v.insertContentControl();", toString: ƒ, …}
code: "GeneralException"
errorLocation: "Range.insertContentControl"
fullStatements: (7) ["var v=context.root._getObjectByReferenceId("{4a645…31b06a1e8cb}{205}") /* originally getItem(28) */;", "var insertContentControl=v.insertContentControl();", "// Instantiate {insertContentControl}", "insertContentControl.title="TypeOne";", "insertContentControl.color="yellow", "insertContentControl.tag="someTag";", "insertContentControl.appearance="Tags";"]
message: "Sorry, something went wrong. Check the OfficeExtension.Error.debugInfo for more information. "
statement: "var insertContentControl=v.insertContentControl();"
surroundingStatements: Array(9)
0: "var v=context.root._getObjectByReferenceId("{4a64573e-3807-4278-a22d-131b06a1e8cb}{205}") /* originally getItem(...) */;"
1: "// >>>>>"
2: "var insertContentControl=v.insertContentControl();"
3: "// <<<<<"
4: "// Instantiate {insertContentControl}"
5: "insertContentControl.title=...;"
6: "insertContentControl.color=...;"
7: "insertContentControl.tag=...;"
8: "insertContentControl.appearance=...;"
lastIndex: (...)
lastItem: (...)
length: 9
这是我代码的简化版
//This object may contain thousands of terms across multiple entity types
let entities = {
EntityType1:{
Term1: [],
Term2: []
}
}
await Word.run(async (context) => {
// search for terms
for(let entityKey in entities) {
let terms = entities[entityKey]
for(let termKey in terms){
let searchResults = context.document.body.search(termKey, {matchWholeWord:true, matchCase: true});
searchResults.load(["text", "parentContentControlOrNullObject"]);
_.extend(terms[termKey], ({"searchHits": searchResults}))
}
}
await context.sync()
//add content controls for each found term
for(let entityKey in entities) {
let terms = entities[entityKey]
for(let termKey in terms){
let term = terms[termKey];
let searchHits = term.searchHits.items;
for (const hit of searchHits) {
//this always works
//hit.font.highlightColor = EntityColors[entityKey]
try {
let cc:Word.ContentControl = hit.parentContentControlOrNullObject
if(cc.isNullObject || cc.tag != appId){
cc = hit.insertContentControl()
}
cc.title = entityKey
cc.color = "yellow"
cc.tag = "someTag"
cc.appearance = "Tags"
//NB. this is here only for debugging - it really slows everything down
await context.sync()
} catch (error) {
if (error instanceof OfficeExtension.Error) {
console.log(error.debugInfo)
console.log(error.innerError)
}
}
}
}
}
await context.sync()
})
我仔细检查了文档ooxml,看看是否有什么共同点 与失败的范围,但我看不到任何明显的东西。
我主要是在Word Online上测试,但Word桌面似乎也显示同样的问题。
我就是找不到是什么原因造成的。我还有什么办法可以找到问题的根源?
正如Cindy所建议的,我可以修改你的脚本,使其停止在第一个异常,并找出发生了什么。(Cindy的好提示!)。
这张图立即显示了问题所在(你试图在红色范围内插入一个CC,谁与现有的CC重叠,这是一个无效的操作)。
使用 range.compareLocationWith API来确定你是在这样的情况下。