簡體   English   中英

Office-js Excel插件:何時返回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)不需要整個條件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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM