如何在 Word JS API 中循环遍历 RangeCollection?
How to loop through a RangeCollection in Word JS API?
我想在我的 Word 加载项中添加一个查找功能。单击一个按钮,Word 将滚动到需要查找的单词的第一个位置,再次单击,Word 将滚动到下一个位置。我想出了如何找到第一个,但我无法循环遍历单词搜索结果的 RangeCollection。我正在寻找一些类似于 getNext()
的函数
下面是查找第一个“and”的代码。有效:
async function scroll() {
await Word.run(async (context) => {
context.document.body.search("and", { matchWholeWord: true, matchCase: false }).getFirst().select();
await context.sync()
}
)}
但是,如果我想找到第二个或更多,我不能这样做:
async function scroll() {
await Word.run(async (context) => {
context.document.body.search("and", { matchWholeWord: true, matchCase: false }).getFirst().getNext().select();
await context.sync()
} )}
我阅读了文档,RangeCollection 没有 getNext()。希望有人知道如何解决它。谢谢!
有一些解决方法。
解决方案 1
加载RangeCollection.items
并记录索引。示例:
var index = 0;
async function selectNext(...) {
...
var ranges = context.document.body.search(...);
ranges.load('items');
await context.sync();
if (index >= ranges.items.length) {
index = 0;
}
ranges.items[index++].select();
await context.sync();
...
}
此解决方案尊重索引,但不尊重当前选择位置。因此,如果您更愿意搜索 向下 而不是搜索 下一个 ,这里是解决方案 2.
解决方案 2
加载 RangeCollection.items
并调用 Range.compareLocationWith
。示例:
var ranges = context.document.body.search(...);
ranges.load('items');
await context.sync();
var selection = context.document.getSelection();
var compareResults = ranges.items.map(range => range.compareLocationWith(selection));
await context.sync();
for(var index in compareResults) {
if (compareResults[index].value == 'After') {
ranges.items[index].select();
await context.sync();
break;
}
}
当然,您需要额外的代码并对其进行润色才能使其成为真正的产品,但这些只是粗略的想法。请查看它们是否适合您。
我想在我的 Word 加载项中添加一个查找功能。单击一个按钮,Word 将滚动到需要查找的单词的第一个位置,再次单击,Word 将滚动到下一个位置。我想出了如何找到第一个,但我无法循环遍历单词搜索结果的 RangeCollection。我正在寻找一些类似于 getNext()
的函数下面是查找第一个“and”的代码。有效:
async function scroll() {
await Word.run(async (context) => {
context.document.body.search("and", { matchWholeWord: true, matchCase: false }).getFirst().select();
await context.sync()
}
)}
但是,如果我想找到第二个或更多,我不能这样做:
async function scroll() {
await Word.run(async (context) => {
context.document.body.search("and", { matchWholeWord: true, matchCase: false }).getFirst().getNext().select();
await context.sync()
} )}
我阅读了文档,RangeCollection 没有 getNext()。希望有人知道如何解决它。谢谢!
有一些解决方法。
解决方案 1
加载RangeCollection.items
并记录索引。示例:
var index = 0;
async function selectNext(...) {
...
var ranges = context.document.body.search(...);
ranges.load('items');
await context.sync();
if (index >= ranges.items.length) {
index = 0;
}
ranges.items[index++].select();
await context.sync();
...
}
此解决方案尊重索引,但不尊重当前选择位置。因此,如果您更愿意搜索 向下 而不是搜索 下一个 ,这里是解决方案 2.
解决方案 2
加载 RangeCollection.items
并调用 Range.compareLocationWith
。示例:
var ranges = context.document.body.search(...);
ranges.load('items');
await context.sync();
var selection = context.document.getSelection();
var compareResults = ranges.items.map(range => range.compareLocationWith(selection));
await context.sync();
for(var index in compareResults) {
if (compareResults[index].value == 'After') {
ranges.items[index].select();
await context.sync();
break;
}
}
当然,您需要额外的代码并对其进行润色才能使其成为真正的产品,但这些只是粗略的想法。请查看它们是否适合您。