javascript - Office-js Excel 插件 : when to return context. 同步()

标签 javascript excel office-js office-addins office365-apps

我很难理解何时使用 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 不能为 null。

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

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

但是自从 ws.names.add("NEWRANGE", range);是一个真正的更改,您需要 context.sync() 来反射(reflect)真实对象上的更改。从技术上讲,最后一个 context.sync() 不是必需的,因为 Excel.run 在运行 Excel.run() 内的所有内容后实际上会调用 context.sync()。也就是说,无论如何,有一个结束 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
});

哦,你应该按照辛迪的建议看看迈克尔的书。

关于javascript - Office-js Excel 插件 : when to return context. 同步(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51946582/

相关文章:

javascript - 如何仅通过一次调用将一组对象保存到 Mongoose 数据库?

javascript - 如何将 JQuery UI 的可拖动和可排序与 div 元素混合在一起?

javascript - jQuery 杀死 Lightbox

vba - 循环遍历一行直到空白

VBA 提取源代码文本

office365 - 从加载项中删除个性菜单

javascript - 无法使用 getElementByID() 将数据 "innerHTML"添加到 <div> 标记

r - 将一个单元格中的多个值分成多个单元格

reactjs - 如何使用office JS获取Excel加载项中图表的调色板?

azure-active-directory - 如何使用 Azure Active Directory V2 在 Word Online Addin 中授予对 SharePoint 委派权限的同意?