Google Sheets脚本优化:仅复制含数据及图片的行至目标表空白行
修改Google Sheets脚本:仅复制含数据或图片的行
原脚本会复制B12:W44的全部行(包括空白行),以下是修改后的版本,只会复制包含数据或图片的行:
function Movedata3() { var ss = SpreadsheetApp.getActive(); var srcSheet = ss.getSheetByName("INVOICE"); var dstSheet = ss.getSheetByName("HISTORICAL SALES"); // 定义源数据的行列范围 var startRow = 12; var endRow = 44; var startCol = 2; // B列对应索引 var endCol = 23; // W列对应索引 // 获取源范围的所有单元格值 var values = srcSheet.getRange(startRow, startCol, endRow - startRow + 1, endCol - startCol + 1).getValues(); // 收集源范围内图片所在的行(转为相对索引) var images = srcSheet.getImages(); var imageRows = new Set(); images.forEach(img => { var imgRow = img.getAnchorCell().getRow(); if (imgRow >= startRow && imgRow <= endRow) { imageRows.add(imgRow - startRow); } }); // 过滤出有数据或包含图片的行 var filteredRows = values.filter((row, index) => { // 判断行是否有非空数据 var hasData = row.some(cell => cell !== "" && cell !== null); // 判断行是否关联图片 var hasImage = imageRows.has(index); return hasData || hasImage; }); if (filteredRows.length === 0) return; // 无有效内容时直接退出 // 获取目标工作表的下一个空白行 var dstStartRow = dstSheet.getLastRow() + 1; // 将过滤后的有效行写入目标表 dstSheet.getRange(dstStartRow, 1, filteredRows.length, filteredRows[0].length).setValues(filteredRows); // 同步复制图片到目标表对应位置 images.forEach(img => { var imgRow = img.getAnchorCell().getRow(); if (imgRow >= startRow && imgRow <= endRow) { var originalIndex = imgRow - startRow; // 找到该行在过滤后数组中的位置 var filteredIndex = values.findIndex((row, idx) => idx === originalIndex && (row.some(cell => cell !== "" && cell !== null) || imageRows.has(idx))); if (filteredIndex !== -1) { var newImg = img.copyTo(dstSheet); newImg.setAnchorCell(dstSheet.getRange(dstStartRow + filteredIndex, 1)); } } }); }
核心修改说明:
- 行过滤逻辑:同时检查每行是否有非空数据,以及是否包含图片,确保两种类型的行都能被保留
- 避免空白行写入:仅将过滤后的有效行写入目标工作表,不会复制原范围中的空白行
- 图片同步处理:单独提取原范围的图片,复制到目标表对应的有效行位置
内容的提问来源于stack exchange,提问作者Bella Curt
相关产品推荐
相关产品推荐

