Google Sheets脚本需求:勾选复选框后复制行至另一工作表并重置
修复Google Sheets脚本:将勾选行追加到Sheet2末尾
原脚本的核心问题是没有正确定位Sheet2的最后空白行,而是直接写入与Sheet1对应的行索引。下面是修改后的完整脚本,解决了这个问题,同时优化了操作效率:
function copyCheckedRows() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet1 = ss.getSheetByName("Sheet1"); const sheet2 = ss.getSheetByName("Sheet2"); // 读取Sheet1的所有数据和复选框状态(假设复选框在A列) const dataRange = sheet1.getDataRange(); const allValues = dataRange.getValues(); const checkboxStates = allValues.map(row => row[0]); const rowsToCopy = []; const rowsToProcess = []; // 遍历行(跳过表头的第1行) for (let i = 1; i < allValues.length; i++) { if (checkboxStates[i] === true) { rowsToCopy.push(allValues[i]); rowsToProcess.push(i + 1); // 记录实际行号(索引+1) } } // 没有勾选行就直接结束 if (rowsToCopy.length === 0) return; // 定位Sheet2的最后空白行,批量写入数据 const targetStartRow = sheet2.getLastRow() + 1; sheet2.getRange(targetStartRow, 1, rowsToCopy.length, rowsToCopy[0].length).setValues(rowsToCopy); // 批量清除Sheet1对应行内容并重置复选框 rowsToProcess.forEach(rowNum => { sheet1.getRange(rowNum, 1, 1, sheet1.getLastColumn()).clearContent(); sheet1.getRange(rowNum, 1).setValue(false); }); }
关键修改点
- 目标行定位:用
sheet2.getLastRow() + 1精准获取Sheet2的下一个空白行,确保数据始终追加到末尾,不会覆盖原有内容 - 批量操作:先收集所有要复制和清除的行,再一次性执行写入和清除操作,减少API调用次数,避免脚本运行超时
- 状态重置:明确将已勾选的复选框设为
false,确保Sheet1的行状态恢复初始
内容的提问来源于stack exchange,提问作者frealk
相关产品推荐
相关产品推荐

