我有一个 Word 的 Office Web 插件,需要从 API 获取自定义属性并将其存储在
document.properties.customProperties
下,然后用户将能够将它们作为 DocProperty 字段插入到文档中。这是使用以下代码片段完成的:
await Word.run(async (context) => {
var range = context.document.getSelection().getRange();
range.insertField(Word.InsertLocation.after, Word.FieldType.docProperty, '"' + req.property + '"', false);
await context.sync();
dialog.close();
});
这一切都工作正常,我可以看到自定义属性设置正确。我的问题是在尝试更新字段时出现的。简单地使用“全选 + F9”在我的情况下不起作用,因为我首先需要从 API 获取自定义属性以确保它们是最新的,所以我唯一的选择是使用自定义功能区按钮。
字段的更新是使用以下代码片段完成的:
async function updateAllFields(event) {
await Word.run(async (context) => {
// fetch properties from API
await getFileProperties()
context.document.body.fields.load();
await context.sync()
var field = context.document.body.fields.getFirstOrNullObject();
await updateField(context, field)
});
event.completed();
}
async function updateField(context, field) {
await field.load();
await context.sync();
if (field.isNull) {
return;
}
await field.updateResult();
await context.sync();
const nextField = field.getNextOrNullObject();
if (nextField) {
await updateField(context, nextField);
}
}
当我通过控制台执行 updateAllFields 函数时,它完全按照预期工作,但是当我尝试通过功能区按钮运行它时,它只是失败而没有错误。
一些可能相关的信息
请求的权限是
ReadWriteDocument
动作定义如下
<Action xsi:type="ExecuteFunction">
<FunctionName>updateAllFields</FunctionName>
</Action>
加载项使用
SharedRuntime
选项。
我发现您的代码存在一些问题。首先,
if (nextField)
行应该是 if (!(nextField.isNull))
。按照您编写的方式,它总是正确的,因为您正在测试 proxy 对象是否存在,并且由于您刚刚在前一行中创建了它,因此它始终存在。您要测试的是Word文档中对应的对象是否存在。
其次,您的代码有点难以阅读,因为您在子函数内进行了
field.isNull
的测试。当对象可能为空时,最佳实践是在对对象执行任何操作之前测试是否为空,包括将其传递给子函数。