修复Google Apps Script:复制选中行至另一Google Sheet的异常问题
修复Google Apps Script选中行复制问题
当前脚本无法正确复制选中行,反而复制首行数据,可通过以下修改实现需求:
修改后的代码
function copySelectedRows() { var sourceSpreadsheetId = "SOURCE_SPREADSHEET_ID"; var targetSpreadsheetId = "TARGET_SPREADSHEET_ID"; var sourceSheetName = "SourceSheetName"; var targetSheetName = "TargetSheetName"; var sourceSpreadsheet = SpreadsheetApp.openById(sourceSpreadsheetId); var sourceSheet = sourceSpreadsheet.getSheetByName(sourceSheetName); var targetSpreadsheet = SpreadsheetApp.openById(targetSpreadsheetId); var targetSheet = targetSpreadsheet.getSheetByName(targetSheetName); var selection = sourceSheet.getSelection(); var selectedRanges = selection.getActiveRangeList().getRanges(); // 收集所有选中的唯一行号,避免重复处理 var selectedRowNumbers = new Set(); selectedRanges.forEach(function(range) { var startRow = range.getRow(); var endRow = startRow + range.getNumRows() - 1; for (var row = startRow; row <= endRow; row++) { selectedRowNumbers.add(row); } }); var targetData = []; // 遍历每个选中行,提取B、C、D列数据并整理格式 selectedRowNumbers.forEach(function(rowNum) { // 仅获取当前行的B(2)、C(3)、D(4)列,共3列 var sourceRange = sourceSheet.getRange(rowNum, 2, 1, 3); var sourceRow = sourceRange.getValues()[0]; // 按需求映射列:B→第1列,C→第4列,D→第5列,其余为空 targetData.push([sourceRow[0], "", "", sourceRow[1], sourceRow[2]]); }); // 无选中行时提示 if (targetData.length === 0) { SpreadsheetApp.getUi().alert("未选中任何行,请先选中需要复制的行"); return; } // 写入目标表的下一行 var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1, targetData.length, targetData[0].length); targetRange.setValues(targetData); }
关键修改说明
- 精准获取选中行:通过
Set收集所有选中的行号,不管用户选中整行、部分单元格还是不连续范围,都能确保只处理真正选中的行,避免范围判断错误。 - 修正列范围:原代码错误取了4列(B-E),实际只需要B-C-D列,改为取3列,避免多余数据干扰。
- 单行单独处理:针对每个选中行单独提取数据,彻底解决误取首行或其他非选中行的问题。
- 增加异常提示:无选中行时弹出提示,提升脚本易用性。
内容的提问来源于stack exchange,提问作者JP0710
相关产品推荐
相关产品推荐

