将 Excel.run 中的范围对象重新用于 office 应用程序

Reusing range object in Excel.run for apps for office

我是 OFFICE APPS 新手

我正在尝试验证 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()”。

如果我调试缓慢,一切正常,但在 运行 应用程序上我时常遇到错误:-

The property 'text' is not available. Before reading the property's value, call the load method on the containing object and call "context.sync()" on the associated request context.

请指导我如何处理这个问题? 还有,我的做法对吗?

就错误而言,错误就在您的 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,Office 可扩展性团队开发人员,MSFT