Javascript 在Excel.run for apps for office中重用范围对象

Javascript 在Excel.run for apps for office中重用范围对象,javascript,excel,office365,office-js,apps-for-office,Javascript,Excel,Office365,Office Js,Apps For Office,我不熟悉OFFICE应用程序 我正在尝试一个验证Excel数据的简单代码。 因此,我不是一次又一次地将东西嵌套在ctx.sync()中,而是编写如下代码:- // **json** object used beneath is somewhat like: {"Field":[ {"FieldName":"Field1", "FieldDesc":"F

我不熟悉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;
        });
可以看出,我需要一次又一次地读取范围对象。所以我每次都使用不同地址的range对象,首先调用“load()”,然后调用“ctx.sync()”

如果我调试得很慢,事情会很顺利,但在运行应用程序时,我会时不时地出现错误:-

属性“text”不可用。在读取属性的 值,调用包含对象上的load方法并调用 关联请求上下文上的“context.sync()”

请指导我如何处理这件事?
另外,我的方法正确吗?

就错误而言,错误在ctx.sync()语句旁边。 你需要这样

ctx.sync()
.然后(函数(){
fieldData=range.text;
...
});
我也不会忘记最后的.catch(函数(错误){…})

至于是否重用变量,这真的无关紧要。通过执行“range=ctx.workbook…”实际上是在创建一个全局范围变量,这被认为是不好的做法。最好执行“var range=ctx.workbook…”。您不必担心在最后将其设置为null

需要注意的一点是,由于您是在for-each循环中执行此操作的,请注意,可能发生的并发.sync()的数量是有限的(我相信大约在50-60之间)。因此,如果要有大量字段,可能需要调整算法

最后,通过模拟所有范围对象,一次加载所有对象,然后执行单个“.sync”,可以使此代码更加高效

var范围=[];
$.each(json,函数(索引,字段){
var range=ctx.workbook.worksheets.getActiveWorksheet().getRange(field.MappedTo+”:“+field.MappedTo);
range.load('text');
射程。推(射程);
});
ctx.sync()
.然后(函数(){
//遍历读取范围并执行某些操作
})
希望这有帮助


~Michael Zlatkovsky,微软办公扩展团队的开发人员

嘿,这真的很有帮助。谢谢如果我只需要给手机写点什么呢。比如在B2单元,我想写“XYZ”。在这种情况下,我将设置B2单元格的范围,并设置其Values属性并调用ctx.sync()。就这样。在这里,我在“then()”部分没有什么要做的。对吗?对,只有当你需要在事后把某件事联系起来时,才使用“then”。但是你仍然应该有一个.catch,或者在那里,或者在更上游的某个地方,如果你要回报承诺的话。