You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TypeScript编写的ExcelScript代码中实现任意大小的矩阵

TypeScript 可配置矩阵实现及Excel Script代码优化

需求说明

实现支持两种模式的矩阵:可随数据写入动态扩容,也可指定固定尺寸,越界操作时报错。

矩阵实现代码

// 矩阵配置项类型定义
type MatrixConfig<T> = {
  // 固定行数,不传则为动态扩容模式
  fixedRows?: number;
  // 固定列数,不传则为动态扩容模式
  fixedColumns?: number;
  // 矩阵空位默认值
  defaultValue?: T;
}

class DynamicMatrix<T = any> {
  // 内部存储二维数据
  private data: T[][];
  private fixedRows?: number;
  private fixedColumns?: number;
  private defaultValue: T;

  constructor(config: MatrixConfig<T> = {}) {
    this.fixedRows = config.fixedRows;
    this.fixedColumns = config.fixedColumns;
    this.defaultValue = config.defaultValue ?? (null as T);
    this.data = [];

    // 固定大小模式下初始化矩阵
    if (this.fixedRows) {
      for (let i = 0; i < this.fixedRows; i++) {
        this.data[i] = this.fixedColumns 
          ? new Array(this.fixedColumns).fill(this.defaultValue) 
          : [];
      }
    }
  }

  /**
   * 给指定行列位置赋值
   * @param row 行索引,从0开始
   * @param col 列索引,从0开始
   * @param value 要写入的值
   */
  set(row: number, col: number, value: T): void {
    // 固定大小模式下越界直接抛出错误
    if (this.fixedRows && row >= this.fixedRows) {
      throw new Error(`行索引越界:矩阵固定行数为${this.fixedRows}`);
    }
    if (this.fixedColumns && col >= this.fixedColumns) {
      throw new Error(`列索引越界:矩阵固定列数为${this.fixedColumns}`);
    }

    // 动态扩容行
    while (this.data.length <= row) {
      this.data.push([]);
    }
    // 动态扩容列
    while (this.data[row].length <= col) {
      this.data[row].push(this.defaultValue);
    }

    this.data[row][col] = value;
  }

  /**
   * 获取指定行列位置的值
   * @param row 行索引
   * @param col 列索引
   */
  get(row: number, col: number): T {
    return this.data[row]?.[col] ?? this.defaultValue;
  }

  // 获取当前矩阵行数
  getRowCount(): number {
    return this.fixedRows ?? this.data.length;
  }

  // 获取当前矩阵列数
  getColumnCount(): number {
    if (this.fixedColumns) return this.fixedColumns;
    return this.data.reduce((max, row) => Math.max(max, row.length), 0);
  }

  // 导出为普通二维数组
  toArray(): T[][] {
    // 固定列模式下自动补全所有行的空位
    if (this.fixedColumns) {
      return this.data.map(row => {
        const fullRow = [...row];
        while (fullRow.length < this.fixedColumns!) {
          fullRow.push(this.defaultValue);
        }
        return fullRow;
      })
    }
    return structuredClone(this.data);
  }
}

使用示例

// 示例1:纯动态扩容矩阵
const dynamicMat = new DynamicMatrix<number>();
dynamicMat.set(3, 4, 996); // 自动扩容到4行5列
console.log(dynamicMat.get(3, 4)); // 输出996
console.log(dynamicMat.getRowCount()); // 输出4

// 示例2:固定大小矩阵(6行3列,默认值为空字符串)
const fixedMat = new DynamicMatrix<string>({
  fixedRows: 6,
  fixedColumns: 3,
  defaultValue: ''
});
fixedMat.set(2, 1, '已完成'); // 正常写入
fixedMat.set(10, 2, '越界测试'); // 抛出错误:行索引越界:矩阵固定行数为6

现有Excel Script代码优化

你当前的代码存在几个可优化的点:

  • 循环条件i <= rownumber会导致索引越界,表格行索引从0开始,最大值为rownumber - 1
  • 不需要用topBottom条件格式来给整行标红,直接设置范围填充色即可,逻辑更简单性能更好
  • 统一变量命名为小驼峰写法,符合TS编码规范

优化后代码:

function main(workbook: ExcelScript.Workbook) {
  const trackerSheet = workbook.getWorksheet('Tracker');
  const dataTable = workbook.getTable('Table3');
  const date = new Date();
  console.log(date);

  // 原逻辑为每天17点整触发,保留你的调试开关
  if (/*date.getHours() === 17 && date.getMinutes() === 0 && date.getSeconds() === 0*/ true) {
    console.log('开始检查目标行');
    const rowCount = dataTable.getRowCount();
    // 修正循环边界,避免越界
    for (let i = 0; i < rowCount; i++) {
      if (trackerSheet.getCell(i, 4).getValue() === 30) {
        trackerSheet.getCell(i, 5).setValue('Notification sent');
        const rangeRow = trackerSheet.getRangeByIndexes(i, 0, 1, 5);
        // 直接设置行填充色
        rangeRow.getFormat().getFill().setColor('red');
        console.log('已标记符合条件的行');
      }
    }
  }
}

内容的提问来源于stack exchange,提问作者soom1usedtoknow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 23:09:00