Google Sheets脚本问题:复制指定行至汇总表时出现空行冗余
解决Google Sheets复制粘贴时冗余空行问题
需求
将Data工作表中指定行的仅值复制到Summary工作表,用作汇总/归档,需定位到目标表的真实最后数据行下方进行粘贴。
问题
当前使用的CopyPaste脚本每次运行后,复制行下方会出现7条非真正空的冗余行。
现状
已找到多个获取真实最后数据行的函数,但无法将其与现有脚本整合运行。
现有CopyPaste脚本
function CopyPaste() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var copySheet = ss.getSheetByName("Data"); var pasteSheet = ss.getSheetByName("Summary"); // 获取源数据范围 var source = copySheet.getRange(20, 1, 20, 5); // 获取目标粘贴范围 var destination = pasteSheet.getRange(pasteSheet.getLastRow() +1, 1, 1, 5); // 仅复制值到目标范围 source.copyTo(destination, {contentsOnly: true}); }
参考函数
参考函数1(按列字母定位真实最后行)
function getLastDataRow(sheet,col) { // 参数col为列字母,如"A" var lastRow = sheet.getLastRow(); var range = sheet.getRange(col + lastRow); if (range.getValue() !== "") { return lastRow; } else { return range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow(); } }
参考函数2(定位首空行)
function onOpen(){ const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheetname = ss.getSheets()[0].getName(); // Logger.log("DEBUG: sheetname = "+sheetname) const sheet = ss.getSheetByName(sheetname); const values = sheet.getRange('A7:A').getValues(); const firstEmptyRow = values.findIndex(row => !row[0]) + 1; const range = sheet.getRange(firstEmptyRow,1); sheet.setActiveRange(range); }
参考函数3(通用真实最后行获取函数)
function getLastRow_(sheet, columnNumber) { // version 1.5, written by --Hyde, 4 April 2021 const values = ( columnNumber ? sheet.getRange(1, columnNumber, sheet.getLastRow() || 1, 1) : sheet.getDataRange() ).getDisplayValues(); let row = values.length - 1; while (row && !values[row].join('')) row--; return row + 1; }
整合后的可用脚本
下面是将参考函数3与原脚本整合后的代码,能准确找到Summary表的真实最后数据行,彻底解决冗余空行问题:
function CopyPaste() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var copySheet = ss.getSheetByName("Data"); var pasteSheet = ss.getSheetByName("Summary"); // 调用通用函数获取Summary表的真实最后数据行(这里检查第1列,可根据实际修改列号) const lastRealRow = getLastRow_(pasteSheet, 1); // 源数据范围:Data表第20行开始,共20行5列 var source = copySheet.getRange(20, 1, 20, 5); // 目标粘贴范围:真实最后行的下一行,行数与源数据一致(20行5列) var destination = pasteSheet.getRange(lastRealRow + 1, 1, 20, 5); // 仅复制值到目标范围 source.copyTo(destination, {contentsOnly: true}); } // 通用获取真实最后数据行的函数 function getLastRow_(sheet, columnNumber) { // version 1.5, written by --Hyde, 4 April 2021 const values = ( columnNumber ? sheet.getRange(1, columnNumber, sheet.getLastRow() || 1, 1) : sheet.getDataRange() ).getDisplayValues(); let row = values.length - 1; while (row && !values[row].join('')) row--; return row + 1; }
关键调整点说明
- 替换最后行获取逻辑:用
getLastRow_替代原脚本的pasteSheet.getLastRow(),该函数会遍历指定列的所有显示值,过滤掉无内容的空行,返回真正有数据的最后一行。 - 修正目标范围行数:原脚本目标范围只设了1行,但源数据是20行,这会导致粘贴时自动扩展行,也是冗余行的诱因之一,现在将目标范围行数设为和源数据一致的20行。
- 灵活调整检查列:如果你的Summary表中,数据的关键列不是第1列,只需修改
getLastRow_(pasteSheet, 1)中的1为对应列号即可(比如第3列就写3)。
内容的提问来源于stack exchange,提问作者Ol Li
相关产品推荐
相关产品推荐

