无法从指定Google Sheet标签取值填充Google文档
解决Google Sheets数组公式导致getLastRow()行号错误的问题
问题根源
表头的ARRAYFORMULA会自动把公式填充到列内所有单元格——哪怕这些单元格看起来是空的,实际上已经被公式占用了。这时候getLastRow()会把这些空行也算作有内容的行,返回的行号自然不是你要的实际数据最后一行,拿不到正确的计算数据也正常。
替代方案
别用getLastRow()了,换个方式找真正有数据的最后一行:
方法1:针对必填列找最后一行
假设你的表单数据从A列开始,而且A列是必填项(不会有空值),直接过滤A列的空值来算行号:
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("FINANCEIRO"); // 取A列所有值,过滤掉空单元格后,剩下的长度就是最后一行行号 const lastRow = sheet.getRange("A:A").getValues().filter(row => row[0] !== "").length;
方法2:用getNextDataCell遍历查找
如果数据是连续的(中间没有空行),可以从数据起始行往下找最后一个非空单元格:
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("FINANCEIRO"); const firstDataRow = 2; // 假设表头在第1行,数据从第2行开始 const lastRow = sheet.getRange(firstDataRow, 1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
提醒:如果数据中间有空行,这个方法会停在第一个空行前面,只适合连续数据的场景。
方法3:限制数组公式的作用范围
要是能改表头的数组公式,别让它覆盖整个列,只在有数据的行生效:
=ARRAYFORMULA(IF(A2:A<>"", 你的计算逻辑, ""))
这样公式只会在A列有内容的行运行,空行不会被公式占用,getLastRow()就能返回正确的行号了。
验证小技巧
运行脚本前先打印lastRow的值,确认是不是和实际数据最后一行一致:
console.log("实际最后行号:", lastRow);
另外可以检查FINANCEIRO表里数组公式所在列的空行——选中单元格看编辑栏,要是有公式,那就是它导致的问题。
内容的提问来源于stack exchange,提问作者Flávio Lopes
相关产品推荐
相关产品推荐

