如何用Google Apps Script将非相邻列数据迁移至对应工作表
修改脚本支持非相邻列数据迁移
需求说明
需要用Google Apps Script替代QUERY(IMPORTRANGE),因为后续要对迁移的数据执行公式无法实现的操作。表单采用分支提问逻辑,不同集群对应的数据列不连续,例如Cluster 2需要迁移A-D列和G-H列,现有脚本仅支持复制连续列,需调整以适配非相邻列的迁移需求。
修改后的脚本
function copyNonAdjacentColumns() { const sSheet = SpreadsheetApp.getActiveSpreadsheet(); const srcSheet = sSheet.getSheetByName("Form responses 1"); const tarSheet = sSheet.getSheetByName("Cluster 2"); const lastRow = srcSheet.getLastRow(); // 定义需要迁移的非相邻列(按目标表需要的顺序排列) const targetColumns = ["A", "B", "C", "D", "G", "H"]; for (let i = 3; i <= lastRow; i++) { const clusterVal = srcSheet.getRange("B" + i).getValue(); if (clusterVal === "Cluster 2") { const tarRow = tarSheet.getLastRow() + 1; // 批量获取需要的列数据 const srcRanges = targetColumns.map(col => srcSheet.getRange(col + i)); const values = srcRanges.map(range => range.getValue()); // 将数据写入目标表的对应行 tarSheet.getRange(tarRow, 1, 1, values.length).setValues([values]); } } }
关键改动说明
- 新增
targetColumns数组,明确指定需要迁移的非相邻列,可根据不同集群需求灵活修改列名 - 改用
map方法批量获取指定列的单元格数据,避免重复的范围调用 - 一次性将整行数据写入目标表,比逐列写入更高效
- 变量名更具语义化,提升代码可读性
如果数据量较大,可使用更高效的批量范围获取方式优化性能:
function copyNonAdjacentColumnsOptimized() { const sSheet = SpreadsheetApp.getActiveSpreadsheet(); const srcSheet = sSheet.getSheetByName("Form responses 1"); const tarSheet = sSheet.getSheetByName("Cluster 2"); const lastRow = srcSheet.getLastRow(); const targetColumns = ["A", "B", "C", "D", "G", "H"]; for (let i = 3; i <= lastRow; i++) { const clusterVal = srcSheet.getRange("B" + i).getValue(); if (clusterVal === "Cluster 2") { const tarRow = tarSheet.getLastRow() + 1; // 构造范围列表字符串 const rangeListStr = targetColumns.map(col => col + i).join(","); const srcRangeList = srcSheet.getRangeList(rangeListStr); // 获取所有值并整理为二维数组 const values = [srcRangeList.getRanges().map(range => range.getValue())]; tarSheet.getRange(tarRow, 1, 1, values[0].length).setValues(values); } } }
内容的提问来源于stack exchange,提问作者Parr
相关产品推荐
相关产品推荐

