如何操作桌面单词中的JavaScript插件中的选定段落?

时间:2016-09-28 12:04:11

标签: office-js

我正在尝试从JavaScript插件中设置所有选定段落的样式。该代码在Word Online中完美运行,但是当我在Word桌面中使用它时出现错误。代码如下(是的,我的测试样式称为“香蕉”,它的大而黄色):

function updateParStyle(event) {
    Word.run(function (context) {
        var range = context.document.getSelection();
        range.load("paragraphs/items");
        return context.sync().then(function () {
            var items = range.paragraphs.items;
            // console.log(items.length + " items");
            for (var i = 0; i < items.length; i++) {
                items[i].style = "Banana";
            }
            return context.sync();
        });
    }).catch(function (e) {
        console.error(e);
        return window.open("https://urldecode.org/?text=" + JSON.stringify(e));
    });
    event.completed();
}

在桌面Word中,我收到以下错误:

{
    "name":"OfficeExtension.Error",
    "code":"ItemNotFound",
    "message":"ItemNotFound",
    "traceMessages":[],
    "debugInfo":{
        "errorLocation":"ParagraphCollection.getItem"
    },
    "stack":"ItemNotFound: ItemNotFound\n   at Anonymous function (https://appsforoffice.microsoft.com/lib/1/hosted/word-win32-16.01.debug.js:8103:6)\n   at lib$es6$promise$$internal$$tryCatch (https://appsforoffice.microsoft.com/lib/1/hosted/word-win32-16.01.debug.js:8974:8)\n   at lib$es6$promise$$internal$$invokeCallback (https://appsforoffice.microsoft.com/lib/1/hosted/word-win32-16.01.debug.js:8984:8)\n   at lib$es6$promise$$internal$$publish (https://appsforoffice.microsoft.com/lib/1/hosted/word-win32-16.01.debug.js:8960:9)\n   at lib$es6$promise$asap$$flush (https://appsforoffice.microsoft.com/lib/1/hosted/word-win32-16.01.debug.js:8779:8)"
}

调试显示在设置段落样式后context.sync发生错误。正如在错误消息中可以看到的,我使用未经分析的office.js进行调试,但错误也发生在默认的office.js中,只是使用了一个不太有用的堆栈跟踪。如果我设置range.style = "Banana"而不是使用适用于Word Online和Word桌面的段落。 “香蕉”风格是一种链接风格(所以它应该适用于段落和字符)。

使用items[i].style = "Banana"items[i].delete()替换items[i].insertText("Hello world", "After")时出现完全相同的错误,因此问题与样式本身无关。

我发现一个可能的解决方法是我可以在所选范围上设置段落样式,并且它将按预期工作(设置所有选定段落的样式,甚至是部分选择的段落的样式),但是我想象一下,我必须在某个时候使用ParagraphCollection,所以我仍然想知道我做错了什么。

我已使用Word版本16.0.7341.2035和16.0.7167.2060进行了测试。

1 个答案:

答案 0 :(得分:2)

有趣。我不确定我是否会这样编码。我可以建议您修改代码以适当地使用段落集合吗?我认为如果你这样做,你的代码将会大大简化:

Word.run(function(context) {
     var pars = context.document.getSelection().paragraphs;
       pars.load();
        return context.sync().then(function () {
            for (var i = 0; i < pars.items.length; i++) {
                pars.items[i].style = "Banana";
            }
           
    return context.sync();
        })
}).catch(function(error) {
    console.log(error);
    if (error instanceof OfficeExtension.Error) {
        console.log("Debug info: " + JSON.stringify(error.debugInfo));
    }
});

这段代码肯定适用于所有平台。 谢谢 涓。