去年还是用copilot用python来处理excel,生成测试报告,今年又用chatgpt推荐的excel里的自动执行脚本来处理,发现我的需求用这种方式更方便,代码也更少。对比之下,差别太大了,记录下。 直接上代码吧,毕竟注释都写的很清楚了。
prompt excel 如何快速生成多sheets,有规律的生成,尽量用excel自带的功能 excel版本没有这个工具。请使用自动执行里的脚本来操作 很好。 读取某个sheet里的所有行; 如果第一个cell有值,就用这个做sheet名,一次类推做多sheet; 而且复制当前行到相应的sheet里。 添加工作表的时候,检查是否有同名的存在,如果存在就清空,然后继续添加内容。 要求添加复制行内容的时候,每个cell都自适应宽度和高度,如果cell内容的长度超过20,则这个cell的长度固定到50。
function main(workbook: ExcelScript.Workbook) { // 指定要读取的工作表名称,如果不同请更改 let sourceSheetName = "Sheet1" ; let sourceSheet = workbook.getWorksheet(sourceSheetName); // 检查源工作表是否存在 if (sourceSheet === null) { console.log(`源工作表 ${sourceSheetName} 不存在,请确认名称正确。`); return ; } // 获取源工作表的使用范围,这将是我们要读取的所有行 let sourceRange = sourceSheet.getUsedRange(); // 检查源工作表是否为空 if (sourceRange === null) { console.log(`源工作表 ${sourceSheetName} 为空。`); return ; } // 读取源工作表中的所有数据 let sourceValues = sourceRange.getValues(); // 遍历源数据的每一行 for (let i = 0 ; i < sourceValues.length; i++) { let rowValues = sourceValues[i]; // 检查第一个单元格是否有值 if (rowValues[0 ] !== null && rowValues[0 ] !== "" ) { // 用第一个单元格的值作为新工作表的名称 let newSheetName = rowValues[0 ].toString(); // 在工作簿中添加新工作表,如果存在同名工作表,就清空内容 let newSheet = workbook.getWorksheet(newSheetName); if (newSheet) { newSheet.getUsedRange()?.clear(); } else { newSheet = workbook.addWorksheet(newSheetName); } // 复制源数据行的值到新工作表的第一行 let targetRange = newSheet.getRange(`A1:${columnLetter(rowValues.length)}1 `); targetRange.setValues([rowValues]); // 设置单元格内容的自动换行 for (let j = 0 ; j < rowValues.length; j++) { let cell = targetRange.getCell(0 , j); let cellText = cell.getText(); if (cellText.length > 20 ) { //console.log(cellText); cell.getFormat().setColumnWidth(200 ); } //cell.getFormat().autofitColumns; //cell.getFormat().autofitRows; } targetRange.getFormat().autofitColumns(); } } } // 将列的索引转化为列的字母标识,比如:1 -> A, 2 -> B, 27 -> AA function columnLetter(columnNumber: number) { let temp = 0 ; let letter = while (columnNumber > 0 ) { temp = (columnNumber - 1 ) % 26 ; letter = String .fromCharCode(temp + 65 ) + letter; columnNumber = (columnNumber - temp - 1 ) / 26 ; } return letter; }