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 文件中的样子:

  1. 以下是我尝试使用 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;
}