如何在Google Apps Script中复制带分组信息的单元格区域?
解决Range.copyTo()不复制分组信息的问题
Google Apps Script的Range.copyTo()方法确实不会自动复制行/列的分组折叠信息,要保留分组得手动提取源工作表的分组配置,再应用到目标工作表。以下是完整的实现代码:
var destSheet = some_sheet; var sourceSheet = SpreadsheetApp.getActiveSheet(); var sourceRange = sourceSheet.getRange("A1:H10"); // 先执行基础复制(值、格式、公式) sourceRange.copyTo(destSheet.getRange(1,1)); // ---------------------- 处理行分组 ---------------------- var startRow = sourceRange.getRow(); var endRow = sourceRange.getLastRow(); // 记录每行的分组深度 var rowDepths = []; for (var i = startRow; i <= endRow; i++) { rowDepths.push(sourceSheet.getRowGroupDepth(i)); } // 遍历深度数组,应用分组到目标工作表 var currentDepth = 0; var groupStartRow = 1; // 目标区域起始行是1 for (var j = 0; j < rowDepths.length; j++) { var targetRow = groupStartRow + j; var depth = rowDepths[j]; if (depth > currentDepth) { // 开始新分组:从当前行到下一个同深度的行结束 var nextSameDepthIndex = rowDepths.slice(j+1).findIndex(d => d === depth) + j + 1; var endTargetRow = nextSameDepthIndex !== -1 ? (groupStartRow + nextSameDepthIndex - 1) : endRow; destSheet.groupRows(targetRow, endTargetRow, depth - currentDepth); } currentDepth = depth; } // ---------------------- 处理列分组 ---------------------- var startCol = sourceRange.getColumn(); var endCol = sourceRange.getLastColumn(); // 记录每列的分组深度 var colDepths = []; for (var k = startCol; k <= endCol; k++) { colDepths.push(sourceSheet.getColumnGroupDepth(k)); } // 遍历深度数组,应用分组到目标工作表 var currentColDepth = 0; var groupStartCol = 1; // 目标区域起始列是1 for (var l = 0; l < colDepths.length; l++) { var targetCol = groupStartCol + l; var depth = colDepths[l]; if (depth > currentColDepth) { // 开始新分组:从当前列到下一个同深度的列结束 var nextSameDepthIndex = colDepths.slice(l+1).findIndex(d => d === depth) + l + 1; var endTargetCol = nextSameDepthIndex !== -1 ? (groupStartCol + nextSameDepthIndex - 1) : endCol; destSheet.groupColumns(targetCol, endTargetCol, depth - currentColDepth); } currentColDepth = depth; }
代码说明
- 先执行原有的
copyTo完成基础内容复制 - 通过
getRowGroupDepth()和getColumnGroupDepth()获取源区域每行/列的分组层级 - 遍历深度数组,找到每个分组的起始和结束位置,用
groupRows()/groupColumns()在目标工作表上创建对应分组 - 注意目标区域的行/列起始位置要和源区域对应,这里目标从(1,1)开始,所以直接映射即可
内容的提问来源于stack exchange,提问作者Eric Ricalens
相关产品推荐
相关产品推荐

