我正在使用Microsoft Word的脚本实验室编写脚本。我的目标是搜索文档中的字符串,在包含该字符串的每个范围内插入注释,然后跟踪范围,以便以后可以删除注释。
当我使用rangeCollection.getFirstOrNullObject()
获取范围并对其进行跟踪时,脚本可以正常工作,但是当我尝试遍历rangeCollection.items
时,会看到以下错误。
我整理了一个最小的复制示例,您可以将其导入Script Lab。这是链接:https://gist.github.com/abusch419/357e06a8c2fda077a06be2be0885cfb2
c {name: "RichApi.Error", code: "GeneralException", traceMessages: Array[0], innerError: null, debugInfo: Object…}
name: "RichApi.Error"
code: "GeneralException"
traceMessages: Array[0]
innerError: null
▶debugInfo: Object
code: "GeneralException"
message: "GeneralException"
toString: function ()
errorLocation: "Document._GetObjectByReferenceId"
statement: "var v=context.root._getObjectByReferenceId("r!00000301") /* originally getItem(...) */;"
▶surroundingStatements: Array[5]
0: "// >>>>>"
1: "var v=context.root._getObjectByReferenceId("r!00000301") /* originally getItem(...) */;"
2: "// <<<<<"
3: "var insertOoxml=v.insertOoxml(...);"
4: "// Instantiate {insertOoxml}"
▶fullStatements: Array[3]
line: 24
column: 243947
sourceURL: "https://appsforoffice.microsoft.com/lib/1/hosted/word-mac-16.00.js"
这是我的代码,用于使用getFirstOrNullObject()而不是循环来跟踪范围。这有效:
async function insertFirstComment(context) {
const rangeCollection = context.document.body.search(searchQuery);
rangeCollection.load("length");
await context.sync();
const range = rangeCollection.getFirstOrNullObject();
range.insertOoxml(commentOoxml, "Replace");
range.track();
ranges.push(range);
await context.sync();
}
这是我的代码,用于在循环中跟踪范围。尝试删除注释时触发错误。当我们从跟踪范围中删除评论后进行同步时,将引发错误。
async function insertCommentsInLoop(context) {
const rangeCollection = context.document.body.search(searchQuery);
rangeCollection.load("length");
await context.sync();
for (const range of rangeCollection.items) {
range.insertOoxml(commentOoxml, "Replace");
range.track();
ranges.push(range);
}
await context.sync();
}
这是我删除评论的代码:
async function removeComments(context) {
for (const range of ranges) {
range.insertOoxml(ooxmlWithoutComment, "Replace");
range.untrack();
}
await context.sync();
ranges = [];
}
getFirstOrNullObject
通话Rick Kirkham有用地指出我没有正确使用getFirstOrNullObject,因此我更新了实现。 我还用脚本实验室代码片段更新了要点:
https://gist.github.com/abusch419/357e06a8c2fda077a06be2be0885cfb2
使用getFirstOrNullObject的函数开始时正常工作,并且更新的版本仍然有效。带有循环的版本仍会引发上述错误。
这是更新的版本:
async function insertFirstComment(context) {
const rangeCollection = context.document.body.search(searchQuery);
rangeCollection.load('length');
await context.sync();
const range = rangeCollection.getFirstOrNullObject();
range.load('isNullObject')
await context.sync();
if (!range.isNullObject) {
range.insertOoxml(commentOoxml, "Replace");
range.track();
ranges.push(range);
await context.sync();
} else {
console.log(`Did not find ${searchQuery} in the document`)
}
}
答案 0 :(得分:0)
我不知道这是否可以解决问题,但是您没有正确使用getFirstOrNullObject
方法。有关详情,请参见orNullObject。解决该问题,看看是否仍然出现错误。