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

时间:2016-06-17 11:25:34

标签: ms-office office-js

鉴于工作簿,我想通过它的工作表并获得他们的使用范围。我编写了以下代码,该代码有效:

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)我必须记录sheetnamesgetItem

访问每个工作表

2)我必须加载items,然后加载name以获取sheetnames

有没有人知道是否有任何方法或属性可以使代码更轻?这种任务的最佳代码结构是什么?

编辑1:根据迈克尔的回答,我仍然提供同时获得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 个答案:

答案 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