Google Apps Script/Sheets如何从列末数据单元格自动填充至表格最后一行
问题场景
- 现有电子表格中A、C、D等其余列数据均延伸至表格最后一行(如第40行),仅B列数据仅填充到第25行左右
- 需求:从B列最后一个有数据的单元格开始,自动识别已有内容的序列规则,延续填充到表格最后一行,效果和手动拖拽单元格右下角填充一致,不能仅复制相同值覆盖空单元格
- 现有初步脚本运行时报错:第7行抛出
Exception: Range not found,无法正确指定序列起始范围

现有报错脚本如下:
function fillDownFunction() { var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var sc = ss.getRange("B1:B").getValues(); var scr = sc.filter(String).length; var lr = ss.getLastRow(); var fillDownRange = ss.getRange(scr,2,lr) ss.getRange(scr).copyTo(fillDownRange); }
报错原因
ss.getRange(scr)写法不符合API规则:单参数传入getRange时仅支持A1格式的字符串,传入数字会直接触发范围不存在的报错getRange(row, column, numRows)的第三个参数代表需要选取的总行数,不是截止行号,直接传入最后一行号lr会导致选取范围长度错误- 普通
copyTo方法仅复制单元格内容/格式,不会触发表格自带的序列识别填充逻辑,达不到手动填充的效果
可用修复代码
function fillDownFunction() { const activeSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // 计算B列最后一个有数据的行号 const lastColBDataRow = activeSheet.getRange("B:B").getValues().filter(String).length; // 获取全表最后一行行号 const sheetLastRow = activeSheet.getLastRow(); // 选中从B列最后一个有数据单元格开始,到全表最后一行的完整范围 const fillRange = activeSheet.getRange(lastColBDataRow, 2, sheetLastRow - lastColBDataRow + 1); // 调用官方自动填充方法,使用默认序列识别规则,和手动拖拽填充效果完全一致 fillRange.autoFill(fillRange, SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES); }
使用说明
- 脚本运行后会自动识别B列已有内容的序列规则,支持等差/等比数字、日期、预设文本序列等所有手动填充支持的规则
- 范围计算已做边界处理,不会出现越界、选不中范围的问题
- 不需要手动指定序列步长、规则,全部由表格内置逻辑自动判断
内容的提问来源于stack exchange,提问作者alanWall
相关产品推荐
相关产品推荐

