簡體   English   中英

在 Excel.run 中為辦公應用程序重用范圍對象

[英]Reusing range object in Excel.run for apps for office

我是 OFFICE 應用程序的新手

我正在嘗試一個簡單的代碼來驗證 Excel 數據。 因此,與其一次又一次地在 ctx.sync() 中嵌套東西,我正在編寫這樣的代碼:-

        // **json** object used beneath is somewhat like:
        {"Field":[
            {"FieldName":"Field1", "FieldDesc":"Field 1 desc", "MappedTo":"B2", "IsMandatory":"true", "LOV":"1,2,3"}]}

       // **LOV** in above json data means:- the field data can only be among the values given.
       
        //********** MY PIECE OF CODE**************
       
        var fieldData = "";
        $.each(json, function (index, field) {
            range = ctx.workbook.worksheets.getActiveWorksheet().getRange(field.MappedTo + ":" + field.MappedTo);
            range.load('text');
            ctx.sync();
            fieldData = range.text;

            if(field.IsMandatory == true && (fieldData == "" || fieldData == null))
            {
                headerValidation = headerValidation + "Data is required for Field : " + field.FieldDesc + "\n";
            }
            else if(field.LOV != "" )
            {
                if($.inArray(fieldData, field.LOV.split(',')) == -1)
                {
                    headerValidation = headerValidation + "Data not among LOV for Field : " + field.FieldDesc + "\n";
                }
            }

            range = null;
        });

可以看出,我需要一次又一次地讀取范圍對象。 所以我每次都使用具有不同地址的范圍對象並首先調用“load()”然后調用“ctx.sync()”。

如果我調試緩慢,一切正常,但在運行應用程序時,我會時不時地出現錯誤:-

屬性“文本”不可用。 在讀取屬性的值之前,調用包含對象的 load 方法,並在關聯的請求上下文上調用“context.sync()”。

請指導我如何處理這個問題? 另外,我的方法正確嗎?

就錯誤而言,錯誤位於您的 ctx.sync() 語句旁邊。 你需要它

ctx.sync()
    .then(function() {
        fieldData = range.text;
        ...
    });

我也不會忘記最后的 .catch(function(error) { ... }) 。

至於是否重用變量,這真的無關緊要。 通過執行“range = ctx.workbook....”,您實際上是在創建一個全局范圍變量,這被認為是不好的做法。 最好做“var range = ctx.workbook....”。 而且您無需擔心最后將其設置為 null。

需要注意的一件事是,由於您是在 for-each 循環中執行此操作,請注意並發 .sync() 的數量是有限的(我相信大約在 50-60 之間)。 因此,如果您要擁有大量字段,則可能需要調整算法。

最后,您可以通過同步刪除所有范圍對象,一次加載它們,然后執行單個“.sync”,從而使此代碼更加高效。

var ranges = [];
$.each(json, function (index, field) {
    var range = ctx.workbook.worksheets.getActiveWorksheet().getRange(field.MappedTo + ":" + field.MappedTo);
    range.load('text');
    ranges.push(range);
});
ctx.sync()
    .then(function() {
        // iterate through the read ranges and do something
    })

希望這有幫助,

~ Michael Zlatkovsky,MSFT Office 可擴展性團隊的開發人員

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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