Google Apps Script需求:按列11值复制行至Sheet2并删除原行
Google Apps Script:按列值筛选行、复制日志并删除原行
function processRows() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sourceSheet = ss.getSheetByName("原工作表"); // 替换成你的原工作表名称 const logSheet = ss.getSheetByName("Sheet2"); // 获取原工作表所有数据(第1行视为表头,从第2行开始处理) const data = sourceSheet.getDataRange().getValues(); const header = data[0]; const rowsToProcess = []; // 遍历数据,筛选第11列(数组索引为10,因JS数组从0开始)符合条件的行 for (let i = 1; i < data.length; i++) { const col11Value = data[i][10]; // 替换为你的实际筛选条件,比如 col11Value > 50 或 col11Value === "已归档" if (col11Value) { // 示例:列11不为空时处理 rowsToProcess.push({ rowData: data[i].slice(0,15), // 提取第1-15列数据 rowIndex: i + 1 // 对应表格的实际行号(从1开始) }); } } if (rowsToProcess.length === 0) return; // 无符合条件的行直接退出 // 追加数据到日志表,空表先写入表头 if (logSheet.getLastRow() === 0) { logSheet.appendRow(header.slice(0,15)); } const logData = rowsToProcess.map(item => item.rowData); logSheet.getRange(logSheet.getLastRow() + 1, 1, logData.length, 15).setValues(logData); // 倒序删除原表行,避免索引错乱 rowsToProcess.sort((a,b) => b.rowIndex - a.rowIndex).forEach(item => { sourceSheet.deleteRow(item.rowIndex); }); }
核心逻辑说明
- 定位目标行:通过遍历原表所有数据,检查第11列的数值是否符合筛选条件,将需要处理的行数据和对应行号存入数组,解决你不知道如何按列值定位行的问题。
- 批量复制日志:先判断日志表是否为空,为空则写入表头;再批量追加筛选出的行数据,比逐行
appendRow效率更高。 - 安全删行:必须倒序删除行——如果从前往后删,删除一行后后续行的行号会前移,导致漏删或误删。
自定义修改点
- 替换
sourceSheet的工作表名称为你实际的原表名称。 - 修改筛选条件:把
if (col11Value)替换为你的需求,比如:- 数值大于指定值:
if (col11Value > 100) - 等于特定文本:
if (col11Value === "已完成") - 非空且小于阈值:
if (col11Value && col11Value < 50)
- 数值大于指定值:
为什么公式无法实现?
QUERY()或FILTER()函数仅能提取数据,无法直接修改原工作表(删除行),而Google Apps Script可以直接操作表格的行数据,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者Manuel Rivera
相关产品推荐
相关产品推荐

