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

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;
}

关键调整点说明

  1. 替换最后行获取逻辑:用getLastRow_替代原脚本的pasteSheet.getLastRow(),该函数会遍历指定列的所有显示值,过滤掉无内容的空行,返回真正有数据的最后一行。
  2. 修正目标范围行数:原脚本目标范围只设了1行,但源数据是20行,这会导致粘贴时自动扩展行,也是冗余行的诱因之一,现在将目标范围行数设为和源数据一致的20行。
  3. 灵活调整检查列:如果你的Summary表中,数据的关键列不是第1列,只需修改getLastRow_(pasteSheet, 1)中的1为对应列号即可(比如第3列就写3)。

内容的提问来源于stack exchange,提问作者Ol Li

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:31:08