0%

excel自动执行脚本

去年还是用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;
}