基于单元格值将行数据复制到Google Sheets新工作表的Apps Script实现
Google Apps Script 解决方案:勾选行复制与删除功能
完整实现脚本
// 打开表格时自动创建自定义菜单 function onOpen() { const ui = SpreadsheetApp.getUi(); ui.createMenu('数据操作') .addItem('复制勾选行到历史表', 'copyCheckedRows') .addItem('删除所有勾选行', 'deleteCheckedRows') .addToUi(); } // 复制勾选行到历史记录工作表 function copyCheckedRows() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sourceSheet = ss.getSheetByName('源工作表名称'); // 替换为你的源表名称 const historySheet = ss.getSheetByName('历史记录工作表名称'); // 替换为你的历史表名称 if (!sourceSheet || !historySheet) { SpreadsheetApp.getUi().alert('请检查工作表名称是否正确!'); return; } const dataRange = sourceSheet.getDataRange(); const values = dataRange.getValues(); const checkedRows = []; // 遍历所有行,筛选出C列(索引2)勾选的行 for (let i = 1; i < values.length; i++) { // 跳过表头行(如果表头在第1行) if (values[i][2] === true) { // 提取行数据(保留实际值,避免历史表引入动态公式) const rowData = [values[i][0], values[i][1], values[i][2], values[i][3]]; checkedRows.push(rowData); // 清除原行的A、D列内容,保留B列公式和C列复选框 sourceSheet.getRange(i+1, 1).clearContent(); sourceSheet.getRange(i+1, 4).clearContent(); sourceSheet.getRange(i+1, 3).setValue(false); // 自动取消勾选 } } if (checkedRows.length === 0) { SpreadsheetApp.getUi().alert('没有勾选的行需要复制!'); return; } // 将勾选行数据粘贴到历史表的最后一行 const nextRow = historySheet.getLastRow() + 1; historySheet.getRange(nextRow, 1, checkedRows.length, 4).setValues(checkedRows); SpreadsheetApp.getUi().alert(`成功复制 ${checkedRows.length} 行数据到历史表!`); } // 删除所有勾选行(保留公式结构) function deleteCheckedRows() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sourceSheet = ss.getSheetByName('源工作表名称'); // 替换为你的源表名称 if (!sourceSheet) { SpreadsheetApp.getUi().alert('请检查源工作表名称是否正确!'); return; } const dataRange = sourceSheet.getDataRange(); const values = dataRange.getValues(); const rowsToDelete = []; // 遍历所有行,收集C列勾选的行号(行号从1开始) for (let i = 1; i < values.length; i++) { // 跳过表头行 if (values[i][2] === true) { rowsToDelete.push(i+1); // 转换为实际行号 } } if (rowsToDelete.length === 0) { SpreadsheetApp.getUi().alert('没有勾选的行需要删除!'); return; } // 从下往上删除行,避免行号偏移导致的错误 for (let i = rowsToDelete.length - 1; i >= 0; i--) { sourceSheet.deleteRow(rowsToDelete[i]); } SpreadsheetApp.getUi().alert(`成功删除 ${rowsToDelete.length} 行!`); }
关键功能说明
- 自定义菜单:通过
onOpen函数在表格加载时自动生成菜单,无需手动触发 - 复制逻辑:
- 仅复制C列勾选的行,将实际值(而非公式)写入历史表,避免历史表出现动态计算问题
- 复制完成后自动取消原行勾选状态,清除A、D列内容,保留B列的自动日期公式
- 删除逻辑:
- 从下往上删除勾选行,避免删除行后后续行号偏移导致的错误
- 删除整行后,原表下方行自动上移,不会破坏原有公式结构
使用步骤
- 打开目标Google表格,进入「扩展程序」>「Apps脚本」
- 清空编辑器默认代码,粘贴上述脚本
- 将脚本中
源工作表名称和历史记录工作表名称替换为表格实际名称 - 点击编辑器顶部保存按钮,命名脚本(例如「数据操作脚本」)
- 首次运行需授权:点击运行按钮选择
onOpen函数,按提示完成权限授权 - 回到表格刷新页面,即可看到顶部「数据操作」菜单,点击对应按钮执行功能
内容的提问来源于stack exchange,提问作者Jayden Schmidt
相关产品推荐
相关产品推荐

