TypeScript:根据 Excel 中另一列中的值对一列中的值求和的代码
TypeScript: Code to sum values in one column based on the value in another column in Excel
我是 TypeScript 的新手,我今天的目标是根据另一列中的单元格值对 Excel 文件中一列中的所有单元格值求和。
在我的 Excel 文件中,我有日历周,存储在 U 列中,这些日历周的相应值存储在 R 列中。正如我在开头提到的,我的目标是总结所有每个日历周的值(R 列和相应的 U 列),并将每周的总和保存在 Excel 文件中的任何位置。
我的 Excel 文件在线 OneDrive 上,我的数据保存在那里。我打开 Excel 文件,然后进入“自动化选项卡”,它允许访问 Office 脚本,它等效于 Excel VBA(但使用 TypeScript 编程语言代替).
我在屏幕上附加了我正在尝试做的事情以及我已经完成的事情。
1.Here 是我的数据在 Excel 文件中的样子:
- 以下是我尝试使用 OfficeScripts 解决问题的方法。
我试图用 do-while 循环解决问题。
function main(workbook: ExcelScript.Workbook)
{
const sheet = workbook.getWorksheet('Sheet1');
const range = sheet.getRange("A2:A6");
const x: number = 1;
let sum: number = 0;
do{
if(sheet.getRange("A1").getOffsetRange(x,0) = '1')
{
sum = sum + sheet.getRange("A1").getOffsetRange(x,0)
}
} while(sheet.getRange("A").getColumn.);
}
我正在使用这个 SO post:
VBA Code to sum values in one column based on the value in another column in excel
在尝试解决问题时
如果您对如何解决问题有任何建议,我们非常欢迎您提供解决方案。非常感谢。
您可以试试下面的代码。它首先获取特定 sheet 的 U 列和 R 列的范围。一旦它有了范围,它就会获得与这些范围关联的值。在我们获得您的日历列(U 列)的值后,我们将获得该列的唯一值。这些唯一值存储在一个数组中。一旦您在数组中拥有唯一值,就可以遍历该数组。在遍历数组时,将当前数组元素与原始日历值进行比较。如果两个数组的元素都匹配,则将 sum 列中的相应值添加到该行的变量中。完成对整个日历列的迭代后,唯一值和总计将添加到 Map 对象。这个过程继续重复,直到唯一日历值数组的迭代完成。完成后,地图对象由函数返回。
function main(workbook: ExcelScript.Workbook) {
let ws: ExcelScript.Worksheet = workbook.getWorksheet("Sheet1")
let criteriaStart: string = "U2"
let sumStart: string = "R2"
let map: Map<string, number> = getColumnTotals(ws, criteriaStart, sumStart);
//After you have the map you can access specific elements like this
console.log(map.get('2022 CW12'));
//Or you can access all the elements in the map like this
map.forEach(e => console.log(e))
}
function getColumnTotals(worksheet: ExcelScript.Worksheet, criteriaStartAddress: string, sumStartAddress: string): Map<string, number> {
let criteriaRange: ExcelScript.Range = worksheet.getRange(criteriaStartAddress).getExtendedRange(ExcelScript.KeyboardDirection.down);
let criteriaVals: string[][] = criteriaRange.getValues() as string[][];
let sumRange: ExcelScript.Range = worksheet.getRange(sumStartAddress).getExtendedRange(ExcelScript.KeyboardDirection.down);
let sumVals: number[][] = sumRange.getValues() as number[][];
let map: Map<string, number> = new Map<string, number>();
let tempArr: string[] = criteriaVals.map(e => e[0]);
let uniqueCalendarVals: string[] = Array.from(new Set(tempArr));
uniqueCalendarVals.forEach(uniqueCalVal => {
let tempTotal: number = 0;
criteriaVals.forEach((criVal, index) => {
if (criVal[0] === uniqueCalVal) {
tempTotal += sumVals[index][0];
}
})
map.set(uniqueCalVal, tempTotal);
});
return map;
}
我是 TypeScript 的新手,我今天的目标是根据另一列中的单元格值对 Excel 文件中一列中的所有单元格值求和。
在我的 Excel 文件中,我有日历周,存储在 U 列中,这些日历周的相应值存储在 R 列中。正如我在开头提到的,我的目标是总结所有每个日历周的值(R 列和相应的 U 列),并将每周的总和保存在 Excel 文件中的任何位置。
我的 Excel 文件在线 OneDrive 上,我的数据保存在那里。我打开 Excel 文件,然后进入“自动化选项卡”,它允许访问 Office 脚本,它等效于 Excel VBA(但使用 TypeScript 编程语言代替).
我在屏幕上附加了我正在尝试做的事情以及我已经完成的事情。
1.Here 是我的数据在 Excel 文件中的样子:
- 以下是我尝试使用 OfficeScripts 解决问题的方法。 我试图用 do-while 循环解决问题。
function main(workbook: ExcelScript.Workbook)
{
const sheet = workbook.getWorksheet('Sheet1');
const range = sheet.getRange("A2:A6");
const x: number = 1;
let sum: number = 0;
do{
if(sheet.getRange("A1").getOffsetRange(x,0) = '1')
{
sum = sum + sheet.getRange("A1").getOffsetRange(x,0)
}
} while(sheet.getRange("A").getColumn.);
}
我正在使用这个 SO post: VBA Code to sum values in one column based on the value in another column in excel 在尝试解决问题时
如果您对如何解决问题有任何建议,我们非常欢迎您提供解决方案。非常感谢。
您可以试试下面的代码。它首先获取特定 sheet 的 U 列和 R 列的范围。一旦它有了范围,它就会获得与这些范围关联的值。在我们获得您的日历列(U 列)的值后,我们将获得该列的唯一值。这些唯一值存储在一个数组中。一旦您在数组中拥有唯一值,就可以遍历该数组。在遍历数组时,将当前数组元素与原始日历值进行比较。如果两个数组的元素都匹配,则将 sum 列中的相应值添加到该行的变量中。完成对整个日历列的迭代后,唯一值和总计将添加到 Map 对象。这个过程继续重复,直到唯一日历值数组的迭代完成。完成后,地图对象由函数返回。
function main(workbook: ExcelScript.Workbook) {
let ws: ExcelScript.Worksheet = workbook.getWorksheet("Sheet1")
let criteriaStart: string = "U2"
let sumStart: string = "R2"
let map: Map<string, number> = getColumnTotals(ws, criteriaStart, sumStart);
//After you have the map you can access specific elements like this
console.log(map.get('2022 CW12'));
//Or you can access all the elements in the map like this
map.forEach(e => console.log(e))
}
function getColumnTotals(worksheet: ExcelScript.Worksheet, criteriaStartAddress: string, sumStartAddress: string): Map<string, number> {
let criteriaRange: ExcelScript.Range = worksheet.getRange(criteriaStartAddress).getExtendedRange(ExcelScript.KeyboardDirection.down);
let criteriaVals: string[][] = criteriaRange.getValues() as string[][];
let sumRange: ExcelScript.Range = worksheet.getRange(sumStartAddress).getExtendedRange(ExcelScript.KeyboardDirection.down);
let sumVals: number[][] = sumRange.getValues() as number[][];
let map: Map<string, number> = new Map<string, number>();
let tempArr: string[] = criteriaVals.map(e => e[0]);
let uniqueCalendarVals: string[] = Array.from(new Set(tempArr));
uniqueCalendarVals.forEach(uniqueCalVal => {
let tempTotal: number = 0;
criteriaVals.forEach((criVal, index) => {
if (criVal[0] === uniqueCalVal) {
tempTotal += sumVals[index][0];
}
})
map.set(uniqueCalVal, tempTotal);
});
return map;
}