Ms word Word JS API:扩展范围

Ms word Word JS API:扩展范围,ms-word,office-js,Ms Word,Office Js,在回答问题时,我真的希望能够将范围扩展到特定数量的字符。在COM API中,我会使用Range.MoveEnd()。有没有我在JSAPI中找不到的等价物 背景:引用的问题是关于查找超过255个字符的搜索词-这是桌面Word中的一个限制。搜索失败 简单的方法是搜索前254个字符,然后按剩余的字符数扩展找到的范围,并将Range.Text与完整的搜索词进行比较 由于找不到以这种方式扩大范围的等效方法,我不得不求助于: 将搜索项分解为{ 设maxNrChars=254; 让搜索词=”; 设short

在回答问题时,我真的希望能够将范围扩展到特定数量的字符。在COM API中,我会使用
Range.MoveEnd()
。有没有我在JSAPI中找不到的等价物

背景:引用的问题是关于查找超过255个字符的搜索词-这是桌面Word中的一个限制。搜索失败

简单的方法是搜索前254个字符,然后按剩余的字符数扩展找到的范围,并将
Range.Text
与完整的搜索词进行比较

由于找不到以这种方式扩大范围的等效方法,我不得不求助于:

  • 将搜索项分解为<255个字符
  • 一件一件地寻找每一件
  • 确定每个搜索的工件是否与前一个相邻
  • 然后扩展一个范围以包括相邻的工件
  • 然后重复,直到找到所有碎片
因此,我的问题是

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;
            }
        }  
    });
异步函数基本搜索(){
等待Word.run(异步(上下文)=>{
设maxNrChars=254;
让搜索词=”;
设shortSearch=true;//搜索字符串<255个字符
let fullSearchterm=“视频提供了一种强大的方法来帮助您证明您的观点。单击“在线视频”时,您可以为要添加的视频粘贴嵌入代码。您还可以键入关键字在线搜索最适合您文档的视频。aösdlkvaösd faoweifu aösdlkcj aösdofi”
设searchTermNrChars=fullSearchterm.length;
设nResearchCycles=Number((searchTermNrChars/maxNrChars).toFixed(0));
设nrRemainingChars=searchTermNrChars-(nrSearchCycles*maxNrChars);
//log(“搜索词中的字符数:”+searchTermNrChars
//+“\n所需的搜索周期数:”+nrSearchCycles
//+“\n保留字符数:”+nRemainingChars);
//扩展原始范围需要许多范围
让bodyRange=context.document.body.getRange();
车身范围。载荷(‘端’);
让completeRange=null;
设resultRange=null;
设extendedRange=null;
设followupRange=null;
设cycleCounter=0;
设resultText=“”;
如果(搜索项nrchars>maxNrChars){
searchterm=fullSearchterm.substring(0,maxNrChars);
cycleCounter++;
shortSearch=false;
}
else{searchterm=fullSearchterm;}
让results=context.document.body.search(searchterm);
加载({select:'font/highlightColor,text'});
wait context.sync();
//短搜索词,突出显示。。。
如果(短搜索){
for(设i=0;i0){
控制台日志(“在剩余字符中”);
searchterm=fullSearchterm.substring(searchTermNrChars-nrRemainingChars);
console.log(searchterm);
设xresults=extendedRange.search(searchterm);
加载('end,text');
wait context.sync();
设xresult=xresults.items[0];
设isAfter=xresult.compareLocationWith(resultRange);
wait context.sync();
console.log(isAfter.value);
if(isAfter.value==Word.LocationRelation.adjacentAfter){
completeRange=resultRange.expandTo(xresult);
completeRange.load('text');
//completeRange.select();
wait context.sync();
resultText=completeRange.text.substring(0,fullSearchterm.length);
log(“结果”+循环计数器+”:“+结果文本);
}  
}
否则{
//不记得了
resultRange.load('text');
//resultRange.select();
wait context.sync();
resultText=resultRange.text.substring(0,fullSearchterm.length);
completeRange=resultRange;
}
//长搜索成功吗?
if(resultText==fullSearchterm){
completeRange.font.highlightColor=“黄色”;
}