office-js – 如何使用桌面单词中的JavaScript插件操作选定的段落?

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

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] .delete()或items [i] .insertText(“Hello world”,“After”)替换items [i] .style =“Banana”时,我得到完全相同的错误,所以问题不是与风格本身有关.

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

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

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

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));
    }
});

这段代码肯定适用于所有平台.
谢谢
胡安.

点赞