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

问题描述 投票:1回答:1

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

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

ms-word office-js
1个回答
0
投票

我不知道这是否能解决这个问题,但你并没有在使用 "脚本实验室"。getFirstOrNullObject 方法正确。请看 orNullObject 了解详情。修复一下,看看是否还能得到这个错误。

© www.soinside.com 2019 - 2024. All rights reserved.