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

请求修改Google Apps Script实现跨表重复行转移功能

Google表格脚本修改:双表勾选重复行转移需求

需求说明

我有一个包含多个工作表的Google表格:

  • 第1、2工作表存在重复行数据
  • 两个表的第8列都设有复选框
  • 要求:当某重复行在两个表中的复选框均被勾选时,将其中一行转移至第3工作表

原实现代码(单表勾选转移)

function onEdit(e) {
let range = e.range;
let col = range.getColumn();
let row = range.getRow();
let val = range.getValue();
let source = e.source.getActiveSheet();
let ss = SpreadsheetApp.getActiveSpreadsheet();
let sourceSheet = ss.getSheetByName(source.getName());


if (sourceSheet.getName() == 'SHEET1' && col == 8 && val == true){

  let data = sourceSheet.getRange(row,1,1,7).getValues();
  let targetSheet = ss.getSheetByName('SHEET2');
  targetSheet.appendRow(data[0]);
  sourceSheet.deleteRow(row);
}

if (sourceSheet.getName() == 'SHEET2' && col == 8 && val == true){

  let data = sourceSheet.getRange(row,1,1,7).getValues();
  let targetSheet = ss.getSheetByName('SHEET3');
  targetSheet.appendRow(data[0]);
  sourceSheet.deleteRow(row);
}
}

修改后的代码(满足双表勾选重复行转移)

function onEdit(e) {
  const range = e.range;
  const col = range.getColumn();
  const row = range.getRow();
  const val = range.getValue();
  const ss = e.source;
  const activeSheet = ss.getActiveSheet();
  const sheet1 = ss.getSheetByName('SHEET1');
  const sheet2 = ss.getSheetByName('SHEET2');
  const sheet3 = ss.getSheetByName('SHEET3');

  // 仅处理第8列的复选框勾选操作
  if (col !== 8 || val !== true) return;

  // 获取当前操作行的核心数据(前7列)作为重复判断依据
  const currentRowData = activeSheet.getRange(row, 1, 1, 7).getValues()[0].join('|');

  // 定义查找重复行的函数
  function findDuplicateRow(targetSheet, compareData) {
    const allData = targetSheet.getDataRange().getValues();
    // 从第2行开始遍历(假设第1行是表头)
    for (let i = 1; i < allData.length; i++) {
      const rowData = allData[i].slice(0,7).join('|');
      const checkboxState = allData[i][7]; // 第8列是复选框(索引7)
      if (rowData === compareData && checkboxState === true) {
        return i + 1; // 返回实际行号(索引+1)
      }
    }
    return null;
  }

  // 分两种情况处理:当前操作表是SHEET1或SHEET2
  if (activeSheet.getName() === 'SHEET1') {
    const duplicateRowInSheet2 = findDuplicateRow(sheet2, currentRowData);
    if (duplicateRowInSheet2) {
      // 将SHEET1的当前行转移到SHEET3
      sheet3.appendRow(activeSheet.getRange(row,1,1,7).getValues()[0]);
      activeSheet.deleteRow(row);
      // 可选:也可以删除SHEET2中的重复行,根据需求调整
      // sheet2.deleteRow(duplicateRowInSheet2);
    }
  } else if (activeSheet.getName() === 'SHEET2') {
    const duplicateRowInSheet1 = findDuplicateRow(sheet1, currentRowData);
    if (duplicateRowInSheet1) {
      // 将SHEET2的当前行转移到SHEET3
      sheet3.appendRow(activeSheet.getRange(row,1,1,7).getValues()[0]);
      activeSheet.deleteRow(row);
      // 可选:也可以删除SHEET1中的重复行,根据需求调整
      // sheet1.deleteRow(duplicateRowInSheet1);
    }
  }
}

关键改动说明

  • 重复行判断:将每行前7列数据拼接成字符串作为唯一标识,确保能准确匹配重复行
  • 双表状态校验:当勾选某表的复选框时,自动检查另一张表中对应重复行的复选框是否也已勾选
  • 逻辑优化:仅在满足双勾选条件时执行转移操作,避免误触发;同时保留了可选的删除另一张表重复行的逻辑,可根据实际需求开启
  • 性能优化:提前获取工作表对象,减少重复调用;遍历数据时跳过表头行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:40:25