Я пишу сценарий в Script Lab для 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 () вместо al oop. Это работает:
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();
}
Вот мой код для отслеживания диапазонов в al oop. Вызывает ошибку при попытке удалить комментарии. Ошибка возникает, когда мы синхронизируем c после удаления комментариев из отслеживаемых диапазонов.
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 = [];
}
Edit 1: Обновлено getFirstOrNullObject
call
Рик Киркхэм услужливо указал, что я не использую getFirstOrNullObject правильно, поэтому я обновил реализацию. Я также обновил суть с помощью фрагмента Script Lab:
https://gist.github.com/abusch419/357e06a8c2fda077a06be2be0885cfb2
Функция, использующая getFirstOrNullObject, с самого начала работала правильно, и обновленная версия все еще работает . Версия с l oop по-прежнему выдает ошибку, указанную выше.
Вот обновленная версия:
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`)
}
}