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;
}