You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 19:55:22