Office.js:如何从一个集合派生的项目中得到一个属性(例如,一个NamedItemCollection中的所有范围的“地址”属性)

我有一个2000命名范围的工作簿。 我想获得范围属性,如地址,columnCount,rowCount和可能的单元格值对象。 我可以得到这些与2000服务器调用。 这在Excel中是可以的,但在Excel Online(2000服务器往返)中不可以。
我只想用几个批处理操作来获取像'address'这样的属性?
我已经尝试了像下面这样的各种组合(不起作用),但不知道如何。

Excel.run(function (ctx) { var nameditems = ctx.workbook.names; nameditems.load('items'); return ctx.sync().then(function () { var nameditemsProperties = nameditems.load('address, rowCount'); return ctx.sync().then(function () { for (var i = 0; i < nameditemsProperties.items.length; i++) { app.showNotification('address: ' + nameditemsProperties.getItem[i].address); } }); }) }).catch(function (error) { handleErrors(error); }); 

我可以(我怎样才能)像“地址”在一个数组中只有几个批处理操作?
我正在使用Excel API 1.3。

你很近…但是你需要在Range对象上进行加载。

你仍然可以只用2个同步。 首先获取所有命名的项目,第二个载入每个命名项目的地址。

 Excel.run(function (ctx) { var nameditems = ctx.workbook.names.load('name'); var namesToRanges = {}; return ctx.sync() .then(function () { nameditems.items.forEach(function (item) { namesToRanges[item.name] = item.getRange().load("address"); }) }) .then(ctx.sync) .then(function () { nameditems.items.forEach(function (item) { console.log(item.name, namesToRanges[item.name].address); }) }) }) .catch(function (error) { OfficeHelpers.Utilities.log(error); }); 

对于它的价值,如果您使用TypeScript,您将获得更好的IntelliSense和易于阅读的代码:

 async function run() { try { await Excel.run(async (ctx) => { const nameditems = ctx.workbook.names.load('name'); const namesToRanges: { [name: string]: Excel.Range } = {}; await ctx.sync() nameditems.items.forEach(function (item) { namesToRanges[item.name] = item.getRange().load("address"); }) await ctx.sync(); nameditems.items.forEach(function (item) { console.log(item.name, namesToRanges[item.name].address); }) }); } catch (error) { OfficeHelpers.Utilities.log(error); } } 

您可以在电子书“ 使用Office.js构buildOffice加载项 ”中find有关使用TypeScript和Office.js的一些信息。 充分的披露:我是这本书的作者,但我可以很好地保证你会在那里find很多有用的资料,包括使用TypeScript和一般的Office.js模式。

更新:更新代码以允许非范围命名项目:

 $("#run").click(run); async function run() { try { await Excel.run(async (ctx) => { const nameditems = ctx.workbook.names.load('name, type, value'); const namesToValues: { [name: string]: Excel.Range | any } = {}; await ctx.sync() nameditems.items.forEach(item => { if (item.type === Excel.NamedItemType.range) { namesToValues[item.name] = item.getRange().load("address"); } else { namesToValues[item.name] = item.value; } }); await ctx.sync(); nameditems.items.forEach(item => { const value = namesToValues[item.name]; console.log(item.name, (value instanceof Excel.Range) ? value.address : value); }); }); } catch (error) { OfficeHelpers.Utilities.log(error); } } 

这对于我使用1.4获取名称和地址,但不是单元格值或计数

 async function run() { try { await Excel.run(async (context) => { var names = context.workbook.names; names.load(); await context.sync(); console.log(JSON.stringify(names.items)); }); } catch (error) { OfficeHelpers.Utilities.log(error); } }