我正在尝试通过Office.js更新新Word文档中的一组段落。下面的代码是一个异步链,它按预期顺序循环。搜索段落的第一次调用正确返回rangeCollection
,但所有后续调用都返回空seachResults.items
对象。
不幸的是,我没有能够进行完整文档搜索的奢侈。我已经有一个已知的段落索引列表,我需要在这些段落中找到已知文本以突出显示
有什么想法吗?
var processDocAsync = function (context, paragraphs, onComplete) {
// A recursive helper function to work on the n'th paragraph
function getAndProcessParagraph(index) {
// stop processing
if (index == paragraphs.items.length) {
onComplete();
} else {
// Main recursive case
// search the indexth paragraph
var options = Word.SearchOptions.newObject(context);
options.matchCase = false
var searchResults = paragraphs.items[index].search('the', options);
context.load(searchResults, 'text, font');
context.sync().then(function () {
// Highlight all the "THE" words in this paragraph
try {
// Queue a command to change the font for each found item.
if (searchResults.items) {
for (var j = 0; j < searchResults.items.length; j++) {
searchResults.items[j].font.color = '#FF0000'
searchResults.items[j].font.highlightColor = '#FFFF00';
searchResults.items[j].font.bold = true;
}
}
} catch (myError) {
console.log(myError.message);
}
// Synchronize the document state by executing the queued-up commands,
// then move on to the next paragraph
return context.sync().then(getAndProcessParagraph(index + 1));
});
}
}
// Begin the recursive process with the first slice.
getAndProcessParagraph(0);
}
var openProcessedDoc = function (base64str, documentId) {
Word.run(function (context) {
var myNewDoc = context.application.createDocument(base64str);
context.load(myNewDoc);
var paragraphs = context.document.body.paragraphs;
paragraphs.load(paragraphs, 'text, font');
return context.sync().then(function () {
processDocAsync(context, paragraphs, processCompleted)
});
});
};
var processCompleted = function () {
console.log('Process completed');
}
答案 0 :(得分:0)
优秀的问题。这是如何使用promises和async模式遍历集合中的集合的典型案例。
Please setup script lab(一个很酷的加载项,可以用来尝试代码片段)。跳转到7:46 on this video以了解如何加载yaml。
脚本实验室中的load this yaml并查看如何执行此操作的示例。示例并不完全符合您的需要(它基本上遍历了段落中的单词集合),但希望您可以模仿特定场景中的这种模式。
快乐的编码!