在努力解答的同时这个问题 https://stackoverflow.com/a/51159442/3077495我真的希望能够将范围扩展特定数量的字符。在 COM API 中我会使用Range.MoveEnd()
。是否有我在 JS API 中没有找到的等效项?
背景:所引用的问题是关于查找超过 255 个字符的搜索词 - 这是桌面版 Word 的限制。搜索失败。
最简单的方法是搜索前 254 个字符,然后按剩余字符数扩展找到的范围并进行比较Range.Text
到完整的搜索词。
没有找到以这种方式扩展范围的任何等效项,我不得不求助于:
- 将搜索词分解为
- 逐一搜索每件作品
- 确定每个搜索到的片段是否与前一个片段相邻
- 然后扩展范围以包含相邻的部分
- 并重复直到找到所有碎片
因此,我的问题...
async function basicSearch() {
await Word.run(async (context) => {
let maxNrChars = 254;
let searchterm = "";
let shortSearch = true; //search string < 255 chars
let fullSearchterm = "Video provides a powerful way to help you prove your point. When you click Online Video, you can paste in the embed code for the video you want to add. You can also type a keyword to search online for the video that best fits your document. Aösdlkvaösd faoweifu aösdlkcj aösdofi "
let searchTermNrChars = fullSearchterm.length;
let nrSearchCycles = Number((searchTermNrChars / maxNrChars).toFixed(0));
let nrRemainingChars = searchTermNrChars - (nrSearchCycles * maxNrChars);
//console.log("Number of characters in search term: " + searchTermNrChars
// + "\nnumber of search cycles required: " + nrSearchCycles
// + "\nremaining number of characters: " + nrRemainingChars);
//numerous ranges are required to extend original found range
let bodyRange = context.document.body.getRange();
bodyRange.load('End');
let completeRange = null;
let resultRange = null;
let extendedRange = null;
let followupRange = null;
let cycleCounter = 0;
let resultText = "";
if (searchTermNrChars > maxNrChars) {
searchterm = fullSearchterm.substring(0, maxNrChars);
cycleCounter++;
shortSearch = false;
}
else { searchterm = fullSearchterm; }
let results = context.document.body.search(searchterm);
results.load({ select: 'font/highlightColor, text' });
await context.sync();
// short search term, highlight...
if (shortSearch) {
for (let i = 0; i < results.items.length; i++) {
results.items[i].font.highlightColor = "yellow";
}
}
else {
//console.log("Long search");
for (let i = 0; i < results.items.length; i++) {
resultRange = results.items[i];
resultRange.load('End');
extendedRange = resultRange.getRange('End').expandTo(bodyRange.getRange('End'));
await context.sync();
//search for the remainder of the long search term
for (let cycle = 1; cycle < nrSearchCycles; cycle++) {
searchterm = fullSearchterm.substring((cycle * maxNrChars), maxNrChars);
//console.log(searchterm + " in cycle " + cycle);
let CycleResults = extendedRange.search(searchterm);
CycleResults.load({ select: 'text, Start, End' });
await context.sync();
followupRange = CycleResults.items[0];
//directly adjacent?
let isAfter = followupRange.compareLocationWith(resultRange);
if (isAfter.value == Word.LocationRelation.adjacentAfter) {
resultRange.expandTo(followupRange);
extendedRange = resultRange.getRange('End').expandTo(bodyRange.getRange('End'));
}
await context.sync();
}
if (nrRemainingChars > 0) {
console.log("In remaining chars");
searchterm = fullSearchterm.substring(searchTermNrChars - nrRemainingChars);
console.log(searchterm);
let xresults = extendedRange.search(searchterm);
xresults.load('end, text');
await context.sync();
let xresult = xresults.items[0];
let isAfter = xresult.compareLocationWith(resultRange);
await context.sync();
console.log(isAfter.value);
if (isAfter.value == Word.LocationRelation.adjacentAfter) {
completeRange = resultRange.expandTo(xresult);
completeRange.load('text');
//completeRange.select();
await context.sync();
resultText = completeRange.text.substring(0, fullSearchterm.length);
console.log("Result" + cycleCounter + ": " + resultText);
}
}
else {
//No remeaining chars
resultRange.load('text');
//resultRange.select();
await context.sync();
resultText = resultRange.text.substring(0, fullSearchterm.length);
completeRange = resultRange;
}
//long search successful?
if (resultText == fullSearchterm) {
completeRange.font.highlightColor = "yellow";
}
else {
console.log("Else! " + resultText + " / " + fullSearchterm);
}
completeRange = null;
}
}
});
这是我们在最初设计中就有的,但它实际上从 API 中删除了,因为它很容易导致意外结果(即隐藏的字符不一致、脚注等),而且我们无法用现有的资源来覆盖这些情况。我们决定将其删除。
话虽如此,我认为您可以使用 Word.js 实现类似于 range.MoveEnd() 的功能,您只需要定义到内容的末尾;)。一种方法是使用 range.expandTo(endRange) 方法。同样,有趣的是如何获取“endRange”,因此下面的示例展示了如果“end”表示段落结束时如何执行此操作,可能在您的场景中就足够了。
async function run() {
await Word.run(async (context) => {
//assume the range at the end of your 255 characters.
var startRange = context.document.getSelection().getRange("end");
//This one is the range at the end of the paragraph including the selection.
var endRange = context.document.getSelection().paragraphs.getLast().getRange("end");
var deltaRange = startRange.expandTo(endRange);
context.load(deltaRange);
await context.sync();
// this will print the characters after the range all the way to the end of the paragraph.
console.log(deltaRange.text);
});
}
希望这对您有所帮助,或者至少为您指明了正确的方向。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)