Google Sheets脚本修改:将标记done的行移至底部且排除首标签
解决方案:合并脚本实现指定标签的Done任务自动移行
以下是整合后的脚本,完美匹配你的需求:仅在非首标签的B列被标记为done时触发,将该行移至指定位置(支持两种移行逻辑,按需选择)。
function onEdit(e) { // 获取编辑事件的关键信息 const range = e.range; const sheet = range.getSheet(); const editedValue = e.value; // 触发条件校验: // 1. 不是第一个标签(排除概览页) // 2. 编辑的是B列(状态列) // 3. 编辑后的值是"done" // 4. 编辑的行在数据行范围内(3-20行,前2行是表头) if (sheet.getIndex() === 1 || range.getColumn() !== 2 || editedValue !== "done" || range.getRow() < 3 || range.getRow() > 20) { return; // 不满足条件则直接退出 } // 选择移行逻辑:二选一即可 // --- 逻辑1:移至第20行(待办与已完成间留空行)--- const targetRow = 20; const rowToMove = range.getRow(); // 如果要移动的行已经是第20行,无需操作 if (rowToMove === targetRow) return; // 剪切该行并插入到第20行位置 const rowData = sheet.getRange(rowToMove, 1, 1, 3).getValues()[0]; sheet.getRange(rowToMove, 1, 1, 3).clearContent(); sheet.getRange(targetRow, 1, 1, 3).setValues([rowData]); // 可选:如果需要保留单元格格式,替换上面三行为: // sheet.getRange(rowToMove, 1, 1, 3).cutTo(sheet.getRange(targetRow, 1)); // --- 逻辑2:移至已填充任务的底部(空行留在标签末尾)--- // const lastFilledRow = sheet.getLastRow(); // // 如果要移动的行已经是最后一行,无需操作 // if (range.getRow() === lastFilledRow) return; // // 剪切该行并粘贴到最后一行的下一行 // sheet.getRange(range.getRow(), 1, 1, 3).cutTo(sheet.getRange(lastFilledRow + 1, 1)); }
关键功能说明
- 精准触发控制:通过多重条件判断,只响应符合要求的编辑操作(排除首标签、仅B列设为
done、仅数据行范围内),避免不必要的执行。 - 两种移行逻辑:
- 逻辑1严格将Done任务移至第20行,保持待办区(3-19行)和已完成区(20行)的分隔,完全匹配你的理想效果。
- 逻辑2将Done任务移至当前标签已填充内容的底部,适合任务数量不固定的场景。
- 不影响概览页:通过
sheet.getIndex() === 1直接排除首标签,确保概览页的A3提取逻辑不受干扰。
使用步骤
- 打开你的Google Sheets表格,点击顶部菜单栏的「扩展程序」→「Apps脚本」。
- 删除默认的
myFunction代码,粘贴上面的脚本。 - 选择你需要的移行逻辑(注释掉另一个逻辑的代码)。
- 点击保存按钮,命名项目(比如"TaskManagerScript")。
- 回到表格,在任意非首标签的B列标记
done,测试功能是否生效。
内容的提问来源于stack exchange,提问作者jjami
相关产品推荐
相关产品推荐

