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

Ms office 如何获取工作簿的所有已使用范围,ms-office,office-js,Ms Office,Office Js,给定一个工作簿,我想浏览它的工作表,并得到它们的使用范围。我已经编写了以下代码,可以正常工作: function getUsedRanges () { Excel.run(function (ctx) { var worksheets = ctx.workbook.worksheets; var sheetnames = []; worksheets.load('items'); return ctx.sync().the

给定一个工作簿,我想浏览它的工作表,并得到它们的使用范围。我已经编写了以下代码,可以正常工作:

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)
工作表。加载('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);
                }
            })
    })
}
函数getUsedRanges(){ Excel.run(函数(ctx){ var worksheets=ctx.workbook.worksheets; 工作表。加载(“名称”); 返回ctx.sync() .然后(函数(){ var usedRange=[]; 对于(变量i=0;i

~Michael Zlatkovsky,微软办公扩展团队的开发人员

谢谢你,Michael。。。例如,是否无法保存全局首字母
工作簿
工作表
,以便在必要时加载其某些属性(例如,
名称
)?换句话说,我们是否必须在开始时加载所有属性(稍后需要)并将它们保存在变量中(如此线程)?一件事:我实际上意识到我在上面犯了一个错误,而不是
worksheet.load('items')
它应该是
worksheet.load(“name”)
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);
                }
            })
    })
}