如何在Office.js中跳过已搜索内容执行后续文档搜索?
实现方案
要跳过已处理过的something,核心是记录首次匹配项的结束位置,后续仅在该位置之后的文本范围内搜索,具体步骤如下:
1. 首次搜索时记录已处理位置
之前的代码只加载了items/NoPropertiesNeeded,拿不到匹配项的位置信息,需要修改加载属性,获取匹配项的起始和结束位置:
// 首次搜索并加载位置属性 const searchResults = await context.document.body.search('something', { matchCase: true, matchWholeWord: true }).load('items/start,end'); await context.sync(); // 保存第一个匹配项的结束位置到本地存储(任务窗格刷新也不会丢失) if (searchResults.items.length > 0) { const firstMatchEnd = searchResults.items[0].end; localStorage.setItem('lastProcessedEnd', firstMatchEnd.toString()); }
2. 处理新文本时限定搜索范围
从上次记录的结束位置开始,只搜索该位置之后的文本区域:
// 获取之前保存的结束位置,默认从0开始 const lastProcessedEnd = parseInt(localStorage.getItem('lastProcessedEnd') || 0); // 获取文档总长度,确定搜索的结束范围 const bodyLength = await context.document.body.getLength(); await context.sync(); // 只在lastProcessedEnd到bodyLength的范围内搜索 const targetRange = context.document.body.getRange(lastProcessedEnd, bodyLength); const newSearchResults = await targetRange.search('something', { matchCase: true, matchWholeWord: true }).load('items/start,end'); await context.sync(); // 处理新的匹配项(这里是第二个"something") if (newSearchResults.items.length > 0) { // 可以更新lastProcessedEnd为最新匹配项的结束位置,方便后续继续处理 const latestMatchEnd = newSearchResults.items[newSearchResults.items.length - 1].end; localStorage.setItem('lastProcessedEnd', latestMatchEnd.toString()); // 这里写你的处理逻辑,比如加载到任务窗格 }
注意事项
- 如果需要支持多次新增文本处理,每次处理完新匹配项后,记得更新
lastProcessedEnd为最后一个匹配项的结束位置 - 若文档内容有删除、修改等操作,可能需要重置
lastProcessedEnd,避免搜索范围出错
内容的提问来源于stack exchange,提问作者Gocool Ad
相关产品推荐
相关产品推荐

