如何在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
相关产品推荐
相关产品推荐

