我正在 Microsoft Word 的脚本实验室中编写一个脚本。我的目标是在文档中搜索一个字符串,在每个包含该字符串的范围内插入注释,然后跟踪该范围,以便以后可以删除注释。
当我使用 rangeCollection.getFirstOrNullObject()
来获取范围并跟踪它,脚本工作正常,但当我尝试循环执行 rangeCollection.items
我看到下面的错误。
我整理了一个最小的重现例子,你可以把它导入脚本实验室。下面是链接。https:/gist.github.comabusch419357e06a8c2fda077a06be2be0885cfb2。
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很有帮助地指出,我没有正确使用getFirst或NullObject,所以我更新了实现。我还用脚本实验室的代码段更新了gist。
https:/gist.github.comabusch419357e06a8c2fda077a06be2be0885cfb2。
使用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`)
}
}
我不知道这是否能解决这个问题,但你并没有在使用 "脚本实验室"。getFirstOrNullObject
方法正确。请看 orNullObject 了解详情。修复一下,看看是否还能得到这个错误。