如何用Google Apps Script将数据写入指定列最后一行而非全列,避免空缺?
问题原因
当前代码使用getLastRow()获取的是「Archived Data」工作表整表的最后数据行,当A、B列已有数据的行号大于E列的最后行号时,写入位置会和A、B列的最后输入位置错位,产生空缺。
解决方法
- 替换原有整表最后行的计算逻辑,改为获取A/B列的最后非空行号
- 以该非空行号作为E列的写入起始行,对齐A、B列的最后输入位置
修改后代码
var sss = SpreadsheetApp.openById('sampleID'); var ss = sss.getSheetByName('Forecast data'); var range = ss.getRange('B126'); const now = new Date(); const data = range.getValues().map(row => row.concat(now)); var tss = SpreadsheetApp.openById('sampleID2'); var ts = tss.getSheetByName('Archived Data'); // 获取A列最后非空行号,需匹配B列则将下方'A:A'改为'B:B' const lastRowOfTargetCol = ts.getRange('A:A').getValues().filter(String).length; // 写入对应行的E、F列 ts.getRange(lastRowOfTargetCol, 5, 1, 2).setValues(data); }
适配空行场景优化
如果A/B列存在中间空行,可使用反向遍历的方法精准获取最后非空行号:
var sss = SpreadsheetApp.openById('sampleID'); var ss = sss.getSheetByName('Forecast data'); var range = ss.getRange('B126'); const now = new Date(); const data = range.getValues().map(row => row.concat(now)); var tss = SpreadsheetApp.openById('sampleID2'); var ts = tss.getSheetByName('Archived Data'); // 反向遍历获取指定列最后非空行号,匹配B列则将调用时的传参改为2 function getLastNonEmptyRow(sheet, column) { const values = sheet.getRange(1, column, sheet.getMaxRows(), 1).getValues(); for (let i = values.length - 1; i >= 0; i--) { if (values[i][0] !== '') return i + 1; } return 1; } const targetRow = getLastNonEmptyRow(ts, 1); ts.getRange(targetRow, 5, 1, 2).setValues(data); }
内容的提问来源于stack exchange,提问作者Brandon
相关产品推荐
相关产品推荐

