如何在桌面 word 中对 JavaScript 插件中的选定段落进行操作?

How to operate on selected paragraphs from a JavaScript addin in desktop word?

我正在尝试通过 JavaScript 插件设置所有选定段落的样式。该代码在 Word Online 中完美运行,但在 Word Desktop 中使用时出现错误。代码如下(对,我的测试样式叫"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 桌面上都有效的段落。 "Banana" 样式是链接样式(因此它应该适用于段落和字符)。

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

我发现的一个可能的解决方法是我可以在选定范围内设置段落样式,它会按预期工作(设置所有选定段落的样式,即使是部分选定的段落),但我想在某个时候我将不得不使用 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));
    }
});

此代码当然适用于所有平台。 谢谢 娟.