Google Apps Script移动脚本无法定位B列最后一行求助
问题解决:将行粘贴到Pipe表的B列起始位置
原脚本使用appendRow会默认从A列插入整行,后续的insertCells操作逻辑有误,导致无法实现从B列开始粘贴的需求。以下是修正后的实现方案:
修正思路
- 舍弃
appendRow默认从A列插入的逻辑,通过getLastRow_函数准确获取Pipe表B列的最后非空行 - 以该行的下一行、B列(第2列)为起始位置,粘贴需要移动的行数据
- 保留原有的日期判断与源行删除逻辑,确保核心功能正常
完整修正脚本
function MoveAll() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const targetSh = ss.getSheetByName("Pipe"); const sheets = ["Resting","Bokad","Återkomster"]; const dateCol = { "Resting": 20, "Bokad": 15, "Återkomster": 14 }; for (const sheetName of sheets) { const sourceSh = ss.getSheetByName(sheetName); const sheetData = sourceSh.getDataRange().getValues(); // 从后往前遍历避免删除行导致的索引偏移 for (let i = sheetData.length - 1; i >= 0; i--) { const dateCell = sheetData[i][dateCol[sheetName] - 1]; if (isValidDate(dateCell)) { const today = new Date(); const testDate = new Date(dateCell); if (testDate <= today) { // 获取B列最后非空行,下一行作为插入起始行 const targetStartRow = getLastRow_(targetSh, 2) + 1; // 从B列(第2列)开始粘贴当前行数据 targetSh.getRange(targetStartRow, 2, 1, sheetData[i].length).setValues([sheetData[i]]); // 删除源工作表对应行 sourceSh.deleteRow(i + 1); } } } } } function getLastRow_(sheet, columnNumber) { // version 1.5, written by --Hyde, 4 April 2021 const values = ( columnNumber ? sheet.getRange(1, columnNumber, sheet.getLastRow() || 1, 1) : sheet.getDataRange() ).getDisplayValues(); let row = values.length - 1; while (row && !values[row].join('')) row--; return row + 1; } // 日期验证函数(确保脚本完整性) function isValidDate(date) { return date instanceof Date && !isNaN(date); }
关键修改说明
- 移除了
appendRow和insertCells的错误组合逻辑,改用getRange直接指定B列起始位置插入数据 - 通过
getLastRow_(targetSh, 2)精准定位B列的最后非空行,保证每次插入都从B列最新的空白行开始 - 优化变量命名(如
test改为testDate),提升代码可读性
内容的提问来源于stack exchange,提问作者Eric M
相关产品推荐
相关产品推荐

