Office-js Excel 插件:何时 return context.sync()

Office-js Excel addin : when to return context.sync()

我很难理解何时使用 context.sync()

这是一个基本的例子,但它恢复了我的理解不足:

Excel.run(function (context){
    const wb = context.workbook;
    const ws = wb.worksheets.getActiveWorksheet();

    // should never happened, but is it correct to check like this ?
    if (wb === null) {
        // IS IT CORRECT TO DO THIS ?
        // I just want to exit the function
        // return; would be enough ? What's going on in the callstack?
        return context.sync();
    }
    ws.load("name");
    return context.sync().then(function() {
        var name = wb.name;
        // do stuff
        var range = ws.getRangeByIndexes(1,1,10,10);
        return context.sync().then(function() {
             ws.names.add("NEWRANGE", range);
             // mandatory return context.sync() to refresh Excel object ?
             // doesn't work otherwise for me
             return context.sync();
        });
    }
}).catch(function(error) {
  // do stuff
}

如果有人能解释一下,我们将非常欢迎:)

干杯。

我认为如果您将这些对象视为代理对象,将会有所帮助。它们只是真实对象的表示,并非所有属性在代理对象上都可用,因为它们不需要可用。同样,对代理对象所做的更改不会更新真实对象。 context.sync() 用于将代理对象与真实对象同步。

查看您的代码,第一个 context.sync() 是不必要的,因为您不需要检索任何内容或进行任何更改。实际上整个条件 if (wb === null) 是不必要的,因为 context.workbook 不能为空。

一旦您尝试 ws.load("name");,您就需要 context.sync(),因为您已尝试访问需要从中加载的代理对象上的 属性实物。

当您调用 var range = ws.getRangeByIndexes(1,1,10,10); 时,您不需要 context.sync(),因为您只是获取另一个代理对象,但没有进行任何更改,也没有访问任何属性。

但是由于 ws.names.add("NEWRANGE", range); 是一个真正的变化,你需要一个 context.sync() 来反映真实对象的变化。从技术上讲,最后的 context.sync() 不是必需的,因为 Excel.run 实际上会在 运行 之后调用 context.sync() Excel.run() 中的所有内容。就是说,不管怎样,结尾 context.sync() 是个好习惯。

您还可以在一个 context.sync() 中批量独立操作。由于 var range = ws.getRangeByIndexes(1,1,10,10);ws.names.add("NEWRANGE", range); 无关,您实际上可以将它们放在单个 context.sync() 后面。

我还建议改用 TypeScript 以使您的代码更简洁、更易于理解。尝试在 Excel 中使用 ScriptLab。有很多示例可以帮助您总体上理解 context.sync() 和 office-js。

最后,这是您可以编写的代码来完成同样的事情。

Excel.run(function (context) {
    const wb = context.workbook;
    const ws = wb.worksheets.getActiveWorksheet();

    ws.load("name");
    return context.sync().then(function () {
        var name = wb.name;
        // do stuff
        var range = ws.getRangeByIndexes(1, 1, 10, 10);
        ws.names.add("NEWRANGE", range);
        return context.sync();
    });
}).catch(function (error) {
    // do stuff
});

哦,你应该按照 Cindy 的建议看一看 Michael 的书。