Excel office-js API – 获取特定工作表的范围

Excel文档的工作表是星期几(星期日至星期五)的日子 – 需要迭代。
我的问题是:如何?

我的代码尝试(都是由于失败而导致的):

Excel.run(function(context) { const currentSheets = context.workbook.worksheets; const worksheetDays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]; for (let i = 0; i < worksheetDays.length; i++) { sheetRanges[worksheetDays[i]] = currentSheets.load("values"); } return context.sync().then(function() { console.log(sheetRanges.Sunday.values); // null }); }); 

下一次尝试:

 Excel.run(function(context) { const worksheetDays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]; const sheetRanges = {}; const currentSheets = context.workbook.worksheets; for (let i = 0; i < worksheetDays.length; i++) { sheetRanges[worksheetDays[i]] = currentSheets.getItem(worksheetDays[i]).load("values"); } return context.sync().then(function() { console.log(sheetRanges.Sunday.values); // null }); }); 

下一个:

 Excel.run(function(context) { const worksheetDays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]; const sheetRanges = {}; const currentSheets = context.workbook.worksheets; for (let i = 0; i < worksheetDays.length; i++) { sheetRanges[worksheetDays[i]] = currentSheets.getItem(worksheetDays[i]).getRange().load("values"); } return context.sync().then(function() { console.log(sheetRanges.Sunday.values); // null }); }); 

下一个:

 Excel.run(function(context) { const worksheetDays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]; var sheetRanges = {}; const currentSheets = context.workbook.worksheets; for (let i = 0; i < worksheetDays.length; i++) { sheetRanges[worksheetDays[i]] = currentSheets.load("name"); } }) .then(context.sync) .then(function () { for (let i = 0; i < worksheetDays.length; i++) { sheetRanges[worksheetDays] = sheetRanges[worksheetDays].load("values"); } }) .then(function () { console.log(sheetRanges.Sunday.values); // null }); 

基本上,我迷路了。 我只需要获取所有工作表的单元格值。
如何解决这个问题?

谢谢!

你非常接近。 事实上,你的第三次尝试几乎是正确的。 但是为了其他可能遇到这个问题的人,首先让我用前两个代码块来描述这个问题。

对于前两次尝试,问题是只能加载对象上实际存在的属性 。 不幸的是,对于您的代码, values不是worksheet对象上的属性。

就个人而言,我发现最简单的方法就是编写代码,就好像属性已经加载一样(并且使用IntelliSense来指导你)。 然后,上去一行或多行,并执行load语句,就像你所做的一样,指定你正在使用的属性名(即range.load('value') ),并确保你有一个context.sync() ,正确链接(你正确地做)或await (如果您使用的是TypeScript)。

现在,你几乎正确的方法#3的问题是,如果你正在为整个工作表构build一个Range ,然后加载它的values属性, values将是null ,因为这样的范围是无界的(百万行+ 16k列;那里是不是你想穿梭在主机Excel应用程序和JavaScript之间的这种数据)。 所以你想要使用的API是sheet.getUsedRange()

所以,所有这一切被说,你可以把你的第三代码尝试,只是取代

 currentSheets.getItem(worksheetDays[i]).getRange().load("values"); 

 currentSheets.getItem(worksheetDays[i]).getUsedRange().load("values"); 

所以,你在第三次尝试的时候就差不多4个字。 顺便说一句,如果你一直在加载address属性,你事实上会得到它的权利。 在这一点上,问题不是你加载值的方式,而是一个事实,无界的范围(和不一致的值,如粗体/斜体/颜色/等,如果它们是不同的多个单元格)返回一个null 。 我会通过反馈给我们的内容团队,以确保这一点更清晰。

所以,最终的代码(也是TypeScript的 – 如果这是好的措施:-),所以你可以有很好的智能感知):

 await Excel.run(async context => { const worksheetDays = ["Sunday", "Monday", /*...*/]; const sheetRanges = {} as { [key: string]: Excel.Range } const currentSheets = context.workbook.worksheets; for (let i = 0; i < worksheetDays.length; i++) { sheetRanges[worksheetDays[i]] = currentSheets.getItem(worksheetDays[i]).getUsedRange().load("values"); } await context.sync(); console.log(sheetRanges["Sunday"].values); }); 

您可以在新脚本实验室( https://aka.ms/getscriptlab )中直接点击五下点击试试这段代码。 只需安装Script Lab加载项(免费),然后在导航菜单中select“导入”,并使用以下GIST URL: https : //gist.github.com/Zlatkovsky/a045beb300c9b1a86276f6ff99fd64a4 。 查看更多关于将脚本导入脚本实验的信息 。

最后,对于上述的许多主题,我将不以为然,例如,如何正确加载属性,了解集合访问的工作方式,使用Office加载项中的TypeScript等等,你可能会发现“ 使用Office.js构buildOffice加载项 ”是一本宝贵的资源。 为了充分披露:我是该书的作者。 但是我也可以保证你会发现它很有用。 就此而言,LeanPub商店本身为该书提供了45天无条件的100%“幸福保证”(我从来没有任何人要求退款)。

一切顺利,祝您的插件开发体验顺利! 如果遇到问题,请继续发帖提问