給定一個工作簿,我想查看其工作表並獲取其使用的範圍。我寫了下面的代碼,它的作品:如何獲取工作簿的所有已使用範圍
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);
}
})
})
}
謝謝邁克爾...對於[昨天的問題(HTTP:/ /stackoverflow.com/a/37871688/702977),是否沒有辦法保存全局初始'工作簿'或'工作表',以便稍後加載它的一些屬性(例如'items','name')必要時?換句話說,我們是否必須在開始時加載所有屬性(我們稍後需要)並將它們保存在變量中(如此線程)? – SoftTimur
是的,這是正確的 –
有一件事:我實際上意識到我上面有一個錯誤,而不是'worksheet.load('items')'它應該是'worksheet.load(「name」)' –