Office.JS Word API - 无法从清单中的 ExecuteFunction 更新属性字段

问题描述 投票:0回答:1

我有一个 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
    选项。

ms-word office-js office-addins word-addins word-web-addins
1个回答
0
投票

我发现您的代码存在一些问题。首先,

if (nextField)
行应该是
if (!(nextField.isNull))
。按照您编写的方式,它总是正确的,因为您正在测试 proxy 对象是否存在,并且由于您刚刚在前一行中创建了它,因此它始终存在。您要测试的是Word文档中对应的对象是否存在。

其次,您的代码有点难以阅读,因为您在子函数内进行了

field.isNull
的测试。当对象可能为空时,最佳实践是在对对象执行任何操作之前测试是否为空,包括将其传递给子函数。

© www.soinside.com 2019 - 2024. All rights reserved.