You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于单元格值将行数据复制到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列的自动日期公式
  • 删除逻辑:
    • 从下往上删除勾选行,避免删除行后后续行号偏移导致的错误
    • 删除整行后,原表下方行自动上移,不会破坏原有公式结构

使用步骤

  1. 打开目标Google表格,进入「扩展程序」>「Apps脚本」
  2. 清空编辑器默认代码,粘贴上述脚本
  3. 将脚本中源工作表名称和历史记录工作表名称替换为表格实际名称
  4. 点击编辑器顶部保存按钮,命名脚本(例如「数据操作脚本」)
  5. 首次运行需授权:点击运行按钮选择onOpen函数,按提示完成权限授权
  6. 回到表格刷新页面,即可看到顶部「数据操作」菜单,点击对应按钮执行功能

内容的提问来源于stack exchange,提问作者Jayden Schmidt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 12:54:19