如何在Office.js中的新Word文档上执行多段搜索(带有更新)?

时间:2017-09-13 13:10:44

标签: office-js

我正在尝试通过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');
}

1 个答案:

答案 0 :(得分:0)

优秀的问题。这是如何使用promises和async模式遍历集合中的集合的典型案例。

Please setup script lab(一个很酷的加载项,可以用来尝试代码片段)。跳转到7:46 on this video以了解如何加载yaml。

脚本实验室中的

load this yaml并查看如何执行此操作的示例。示例并不完全符合您的需要(它基本上遍历了段落中的单词集合),但希望您可以模仿特定场景中的这种模式。

快乐的编码!