gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:46:09 25 4
gpt4 key购买 nike

我很难理解何时使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com