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

如何修改Google Sheets脚本仅复制有效数据到History表无空行

Google Sheet 工时复制脚本优化方案

下面提供两种适配不同场景的可直接使用的代码:

方案1:动态读取有效行(适合源表无零散空行场景)

直接获取「Real Time」表A-C列的实际最后一行有效内容行号,不需要固定写死30行范围:

function dailyLogv2() {    
  var ss = SpreadsheetApp.getActiveSpreadsheet();    
  var sourceSheet = ss.getSheetByName('Real Time');    
  var logSheet = ss.getSheetByName('History');    
  // 获取A-C列最后一个有内容的行号
  var sourceLastRow = sourceSheet.getRange('A:C').getLastRow();
  // 仅读取有效范围的内容
  var range = sourceSheet.getRange(1, 1, sourceLastRow, 3);
  var logLastRow = logSheet.getLastRow();    
  range.copyTo(logSheet.getRange(logLastRow + 1, 1), {contentsOnly: true});
}

这个方案执行速度快,适合源表的有效记录是连续排布、没有中间空行的场景。

方案2:getValues()过滤空行(通用全场景)

如果你无法保证源表没有零散空行,可以用你提到的getValues()方法读取所有内容后过滤掉空行再写入:

function dailyLogv2() {    
  var ss = SpreadsheetApp.getActiveSpreadsheet();    
  var sourceSheet = ss.getSheetByName('Real Time');    
  var logSheet = ss.getSheetByName('History');    
  var sourceLastRow = sourceSheet.getRange('A:C').getLastRow();
  // 读取A-C列所有内容
  var sourceValues = sourceSheet.getRange(1, 1, sourceLastRow, 3).getValues();
  // 过滤三列全为空的无效行
  var filteredValues = sourceValues.filter(row => {
    return row.some(cell => cell !== "" && cell !== null);
  });
  // 仅当存在有效内容时写入历史表
  if (filteredValues.length > 0) {
    var logLastRow = logSheet.getLastRow();
    logSheet.getRange(logLastRow + 1, 1, filteredValues.length, 3).setValues(filteredValues);
  }
}

这个方案可以彻底避免写入空行,适配所有使用场景。

适配说明

如果你的「Real Time」表第一行是表头不需要复制到历史表,只要把代码中getRange的第一个行号参数从1改为2即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 07:45:04