Javascript 在Excel.run for apps for office中重用范围对象
我不熟悉OFFICE应用程序 我正在尝试一个验证Excel数据的简单代码。 因此,我不是一次又一次地将东西嵌套在ctx.sync()中,而是编写如下代码:-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
// **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,或者在那里,或者在更上游的某个地方,如果你要回报承诺的话。