求助:将Google Sheets中状态为Complete的行移至另一工作表的脚本
Google Sheets 自动移动「Complete」状态行到「Completed」工作表脚本
正确脚本
function onOpen() { const ui = SpreadsheetApp.getUi(); ui.createMenu('自定义操作') .addItem('移动已完成行', 'moveCompletedRows') .addToUi(); } function moveCompletedRows() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sourceSheet = ss.getSheetByName('Main'); const targetSheet = ss.getSheetByName('Completed'); // 获取源表所有数据(含表头) const data = sourceSheet.getDataRange().getValues(); const header = data[0]; const rowsToKeep = []; const rowsToMove = []; // 遍历数据行(跳过表头) for (let i = 1; i < data.length; i++) { const row = data[i]; // 状态列对应H列(数组索引7,从0开始计数) if (row[7] === 'Complete') { rowsToMove.push(row); } else { rowsToKeep.push(row); } } // 写入待移动的行到目标表 if (rowsToMove.length > 0) { const targetStartRow = targetSheet.getLastRow() === 0 ? 1 : targetSheet.getLastRow() + 1; targetSheet.getRange(targetStartRow, 1, rowsToMove.length, header.length).setValues(rowsToMove); } // 重置源表:保留表头,写入剩余行 sourceSheet.clearContents(); sourceSheet.getRange(1, 1, 1, header.length).setValues([header]); if (rowsToKeep.length > 0) { sourceSheet.getRange(2, 1, rowsToKeep.length, header.length).setValues(rowsToKeep); } }
脚本说明与修改点
- 工作表匹配:替换了原脚本的
Current/OLD为你需要的Main/Completed - 状态匹配:将状态判断值从
DONE改为Complete - 批量处理优化:避免逐行移动删除导致的行号错乱问题,一次性筛选并处理所有行,效率更高
- 表头保护:跳过第一行表头,确保不会误移动表头
- 中文菜单:自定义菜单改为中文,操作更直观
使用步骤
- 打开目标Google Sheets表格
- 点击顶部菜单栏「扩展程序」→「Apps 脚本」
- 删除默认代码,粘贴上述脚本
- 点击保存,给项目命名(如「移动已完成行」)
- 刷新表格,顶部会出现「自定义操作」菜单
- 点击「自定义操作」→「移动已完成行」,首次运行需完成授权(按提示操作即可)
原脚本问题分析
- 工作表名、状态值与你的需求不匹配,导致逻辑无效
- 逐行删除行的方式会引发后续行号偏移,可能造成错误删除
- 未区分表头和数据行,存在误移动表头的风险
内容的提问来源于stack exchange,提问作者underdog7091
相关产品推荐
相关产品推荐

