如何在桌面 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));
}
});
此代码当然适用于所有平台。
谢谢
娟.
我正在尝试通过 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));
}
});
此代码当然适用于所有平台。 谢谢 娟.