如何获取工作簿的所有使用范围

How to get all used ranges of a workbook

给定一个工作簿,我想浏览它的工作表并获取它们的使用范围。我编写了以下代码,它有效:

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: 按照 Michael 的回答,我仍然放了一个同时获得 usedRangessheet 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);
                }
            })
      })
}

几件事:

1) worksheets.load('items'); 什么都不做。集合上的加载应指定您关心的子项的 属性 名称。所以如果你想找出工作sheet的名字,你应该做worksheet.load('name'),你不需要worksheets.items[i].load('name');

2) 你没有理由做 ctx.workbook.worksheets.getItem(sheetnames[i]);,你可以简单地从你刚刚加载的 ctx.workbook.worksheets 集合中获取 sheet(即 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 可扩展性团队开发人员,MSFT