Excel脚本批量实现两组1500列数据的列间插入与对齐
解决ExcelScript批量交错排列列的循环逻辑问题
核心思路
放弃手动处理列字母迭代的复杂逻辑,直接用列索引实现循环操作(ExcelScript支持通过索引定位列,比列字母更适配循环场景),同时封装列字母与索引的转换函数,方便指定起始/结束列。
完整脚本
function main(workbook: ExcelScript.Workbook) { const selectedSheet = workbook.getActiveWorksheet(); // 定义起始/结束列(字母转0-based索引) const startSourceCol = columnLetterToIndex("EC"); // 源数据起始列 const startTargetCol = columnLetterToIndex("DW"); // 目标插入起始列 const endSourceCol = columnLetterToIndex("BHT"); // 源数据结束列 // 批量循环处理每一组列 for (let sourceCol = startSourceCol, targetCol = startTargetCol; sourceCol <= endSourceCol; sourceCol++, targetCol += 2) { // 定位当前循环的各类范围(均为0-based参数) const sourceDataRange = selectedSheet.getRangeByIndexes(16, sourceCol, 9, 1); // 源数据行:17-25 const sourceTitleRange = selectedSheet.getRangeByIndexes(15, sourceCol, 1, 1); // 源标题行:16 const targetInsertRange = selectedSheet.getRangeByIndexes(1, targetCol, 9, 1); // 目标插入行:2-10 const targetTitleRange = selectedSheet.getRangeByIndexes(0, targetCol, 1, 2); // 目标标题范围:1行2列 const targetTitleCopyCell = selectedSheet.getRangeByIndexes(0, targetCol + 1, 1, 1); // 标题复制目标单元格 // 执行插入、复制、标题处理、清除操作 targetInsertRange.insert(ExcelScript.InsertShiftDirection.right); targetInsertRange.copyFrom(sourceDataRange, ExcelScript.RangeCopyType.all, false, false); sourceTitleRange.moveTo(targetTitleRange); targetTitleCopyCell.copyFrom(selectedSheet.getRangeByIndexes(0, targetCol, 1, 1), ExcelScript.RangeCopyType.all, false, false); // 动态设置标题后缀 const originalTitle = selectedSheet.getRangeByIndexes(0, targetCol, 1, 1).getValue() as string; targetTitleRange.setValues([[`${originalTitle},1`, `${originalTitle},2`]]); sourceDataRange.clear(ExcelScript.ClearApplyTo.contents); } } // 工具函数:列字母转0-based索引(例:"EC"→106) function columnLetterToIndex(letter: string): number { let index = 0; letter = letter.toUpperCase(); for (let i = 0; i < letter.length; i++) { index = index * 26 + (letter.charCodeAt(i) - 65); } return index; }
关键说明
- 列索引转换:通过
columnLetterToIndex函数将列字母转为0-based索引,彻底规避手动迭代列字母的繁琐逻辑。 - 循环规则:
- 源列从起始列到结束列逐列递增
- 目标列每次加2(插入新列后,下一个目标列会向后偏移2位,保持交错排列的结构)
- 范围定位:用
getRangeByIndexes(row, column, rowCount, columnCount)精准定位单元格,参数均为0-based,避免硬编码列字母。 - 动态标题:自动读取原标题并添加
,1/,2后缀,无需手动修改固定值。
注意事项
- 若后续新增列,只需修改
endSourceCol的列字母即可扩展循环范围 - 数据行范围(当前17-25)对应脚本中的
16到24(0-based),若数据行数变化,需调整getRangeByIndexes的rowCount参数
内容的提问来源于stack exchange,提问作者Kristen Briney
相关产品推荐
相关产品推荐

