javascript - 在 Office 应用程序的 Excel.run 中重用范围对象

标签 javascript excel office365 office-js 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()”。

如果我调试缓慢,事情确实工作正常,但在运行应用程序时,我时不时会遇到频繁的错误:-

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,MSFT Office 可扩展性团队开发人员

关于javascript - 在 Office 应用程序的 Excel.run 中重用范围对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36600342/

相关文章:

javascript - JQuery 无法在单独的 .js 文件中工作

python - 从 excel 读取时 Pandas 合并单元格问题

vba - 当我创建新工作簿并使用另一个工作簿向其中添加工作表时,工作表出现在工作簿窗口中,但 VBA 无法识别它们

vba - 嵌套宏不循环

jquery - Bootstrap 在 Outlook 365 部署的 Office 加载项中不起作用

office365 - 如何从office365注销用户并重定向到页面?

javascript - 将一组对象加入一个对象?

javascript - 当我们滚动网页的特定部分时如何更改元素的样式?

javascript - 如何将此刷新操作称为连续后台作业

laravel - 无法使用 smtp.office365.com 中的用户名在 SMTP 服务器上进行身份验证