为什么在循环中跟踪范围对象会导致错误?

时间:2020-05-25 17:59:56

标签: ms-word office-js

我正在使用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 = [];
}

编辑1:更新了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`)
  }
}

1 个答案:

答案 0 :(得分:0)

我不知道这是否可以解决问题,但是您没有正确使用getFirstOrNullObject方法。有关详情,请参见orNullObject。解决该问题,看看是否仍然出现错误。