鉴于工作簿,我想通过它的工作表并获得他们的使用范围。我编写了以下代码,该代码有效:
function getUsedRanges () {
Excel.run(function (ctx) {
var worksheets = ctx.workbook.worksheets;
var sheetnames = [];
worksheets.load('items');
return ctx.sync().then(function() {
for (var i = 0; i < worksheets.items.length; i++) {
worksheets.items[i].load('name');
};
return ctx.sync().then(function() {
for (var i = 0; i < worksheets.items.length; i++) {
sheetnames.push(worksheets.items[i].name);
}
})
}).then(function () {
var usedRange = [];
for (var i = 0; i < worksheets.items.length; i++) {
var worksheet = ctx.workbook.worksheets.getItem(sheetnames[i]);
usedRange[i] = worksheet.getUsedRange();
usedRange[i].load('address');
};
return ctx.sync().then(function() {
for (var i = 0; i < worksheets.items.length; i++) {
console.log(usedRange[i].address);
}
});
})
})
}
然而,代码对我来说很重要。例如,
1)我必须记录sheetnames
以getItem
2)我必须加载items
,然后加载name
以获取sheetnames
。
有没有人知道是否有任何方法或属性可以使代码更轻?这种任务的最佳代码结构是什么?
编辑1:根据迈克尔的回答,我仍然提供同时获得usedRanges
和sheet names
的版本,请注意sheet names
不是强制性的得到usedRanges
:
function getUsedRanges () {
Excel.run(function (ctx) {
var worksheets = ctx.workbook.worksheets;
var usedRange = [];
worksheets.load('name');
return ctx.sync()
.then(function () {
for (var i = 0; i < worksheets.items.length; i++) {
usedRange[i] = worksheets.items[i].getUsedRange();
usedRange[i].load('address');
};
})
.then(ctx.sync)
.then(function() {
for (var i = 0; i < worksheets.items.length; i++) {
console.log(worksheets.items[i].name);
console.log(usedRange[i].address);
}
})
})
}
答案 0 :(得分:1)
有几件事:
1)worksheets.load('items');
什么都不做。集合上的负载应指定您关心的子项的属性名称。因此,如果您想查找工作表名称,则应该worksheet.load('name')
,而不需要worksheets.items[i].load('name');
2)您没有理由ctx.workbook.worksheets.getItem(sheetnames[i]);
,您只需从刚刚加载的ctx.workbook.worksheets
集合中获取表单(即ctx.workbook.worksheets.items[0]
)。
3)这意味着您的代码可以成为
function getUsedRanges () {
Excel.run(function (ctx) {
var worksheets = ctx.workbook.worksheets;
worksheets.load('name');
return ctx.sync()
.then(function () {
var usedRange = [];
for (var i = 0; i < worksheets.items.length; i++) {
usedRange[i] = worksheet.getUsedRange();
usedRange[i].load('address');
};
})
.then(ctx.sync)
.then(function() {
for (var i = 0; i < worksheets.items.length; i++) {
console.log(usedRange[i].address);
}
})
})
}
~Michael Zlatkovsky,Office Extensibility团队的开发人员,MSFT