Excel office-js API - 获取特定工作表的范围
Excel office-js API - Get ranges of specific sheets
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
-ed(如果你使用的是 TypeScript)。
现在,您几乎正确的方法 #3 的问题是,如果您正在为 整个 工作表构造一个 Range
,然后加载其 values
属性,values
将是 null
,因为这样的范围是无限的(一百万行乘以 16k 列;您无法在主机 Excel 应用程序和 JavaScript)。所以你要使用的 API 是 sheet.getUsedRange()
.
所以,综上所述,您可以尝试第 3 次代码尝试并替换
currentSheets.getItem(worksheetDays[i]).getRange().load("values");
与
currentSheets.getItem(worksheetDays[i]).getUsedRange().load("values");
因此,您距离第三次尝试正确还差 4 个字符。顺便说一下,如果您一直在加载 address
属性,那么您实际上已经加载正确了。那时,问题不是您加载值的方式,而是无限范围(以及不一致的值,对于 bold/italic/color/etc 之类的东西,如果它们在多个单元格中不同)return一个null
。我会将反馈传递给我们的内容团队,以确保这一点更加清晰。
所以,最后的代码(还有 TypeScript 对其进行了很好的衡量:-),这样你就可以拥有良好的 IntelliSense):
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);
});
您可以在新的 Script Lab (https://aka.ms/getscriptlab). Simply install the Script Lab add-in (free), then choose "Import" in the navigation menu, and use the following GIST URL: https://gist.github.com/Zlatkovsky/a045beb300c9b1a86276f6ff99fd64a4. See more info about importing snippets to Script Lab.
中单击五下即可实时试用此代码段
最后,我不得不提的是,对于上述许多主题,即如何正确加载属性、了解集合访问的工作原理、在 Office 加载项中使用 TypeScript 等等,您可能会发现图书“Building Office Add-ins using Office.js”是一种宝贵的资源。完全披露:我是这本书的作者。但我也可以保证您会发现它很有用。就此而言,LeanPub 商店本身为这本书提供 45 天无条件 100% "happiness guarantee"(我从来没有人要求退款)。
一切顺利,祝您在加载项开发体验中一切顺利!如果您 运行 遇到问题,请继续发布问题...
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
-ed(如果你使用的是 TypeScript)。
现在,您几乎正确的方法 #3 的问题是,如果您正在为 整个 工作表构造一个 Range
,然后加载其 values
属性,values
将是 null
,因为这样的范围是无限的(一百万行乘以 16k 列;您无法在主机 Excel 应用程序和 JavaScript)。所以你要使用的 API 是 sheet.getUsedRange()
.
所以,综上所述,您可以尝试第 3 次代码尝试并替换
currentSheets.getItem(worksheetDays[i]).getRange().load("values");
与
currentSheets.getItem(worksheetDays[i]).getUsedRange().load("values");
因此,您距离第三次尝试正确还差 4 个字符。顺便说一下,如果您一直在加载 address
属性,那么您实际上已经加载正确了。那时,问题不是您加载值的方式,而是无限范围(以及不一致的值,对于 bold/italic/color/etc 之类的东西,如果它们在多个单元格中不同)return一个null
。我会将反馈传递给我们的内容团队,以确保这一点更加清晰。
所以,最后的代码(还有 TypeScript 对其进行了很好的衡量:-),这样你就可以拥有良好的 IntelliSense):
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);
});
您可以在新的 Script Lab (https://aka.ms/getscriptlab). Simply install the Script Lab add-in (free), then choose "Import" in the navigation menu, and use the following GIST URL: https://gist.github.com/Zlatkovsky/a045beb300c9b1a86276f6ff99fd64a4. See more info about importing snippets to Script Lab.
中单击五下即可实时试用此代码段
最后,我不得不提的是,对于上述许多主题,即如何正确加载属性、了解集合访问的工作原理、在 Office 加载项中使用 TypeScript 等等,您可能会发现图书“Building Office Add-ins using Office.js”是一种宝贵的资源。完全披露:我是这本书的作者。但我也可以保证您会发现它很有用。就此而言,LeanPub 商店本身为这本书提供 45 天无条件 100% "happiness guarantee"(我从来没有人要求退款)。
一切顺利,祝您在加载项开发体验中一切顺利!如果您 运行 遇到问题,请继续发布问题...