如何修改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
相关产品推荐
相关产品推荐

