[英]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)
不需要整個條件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()才能將更改反映到實際對象上。 從技術上講,最后一個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
});
哦,您應該看看辛迪建議的邁克爾的書。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.