Почему отслеживание объекта диапазона в al oop вызывает ошибку? - PullRequest
1 голос
/ 25 мая 2020

Я пишу сценарий в 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`)
  }
}

1 Ответ

0 голосов
/ 26 мая 2020

Не знаю, решит ли это проблему, но вы неправильно используете метод getFirstOrNullObject. См. или NullObject для подробностей. Исправьте это и посмотрите, появляется ли ошибка по-прежнему.

...