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

调整跨工作表重复项删除脚本:适配版本号规则

问题说明

用户现有Google Apps Script脚本,原本逻辑为:当Sheet4的A列新增Job Number时,删除Sheet1、Sheet2、Sheet3中的对应重复项。现需求调整为:

  • 当Sheet4的A列新增Job Number时,自动在B列生成带版本号的格式(如MO123456^1),此时不删除其他表的重复项;
  • 仅当生成的版本号≥^2时(即该Job Number并非首次新增),才视为重复项,从Sheet1、Sheet2、Sheet3中删除所有对应基础Job Number的行。

用户尝试在removeMatchingRows函数中通过拆分^获取版本号并判断是否大于1,但未成功,需修改脚本逻辑。

原代码问题分析
  1. onEdit函数逻辑错误:无论生成的版本号是^1还是更高版本,都会调用删除函数,不符合“仅版本≥2时删除”的需求;
  2. removeMatchingRows函数判断逻辑偏差:原代码判断的是其他表中Job Number的版本>1,而非Sheet4中新生成的版本号;
  3. 版本号处理容错性不足:若其他表中的Job Number不带^版本标识,拆分后split("^")[1]会返回undefined,导致比较逻辑失效。
修改后的完整代码
function onEdit(e) {
  const sheet = e.source.getActiveSheet();
  const range = e.range;

  // 仅处理Sheet4的A列输入(排除表头行,假设表头在第1行)
  if (sheet.getName() === "Sheet4" && range.getColumn() === 1 && range.getRow() > 1) {
    const jobNumber = range.getValue().toString().trim();

    if (jobNumber) {
      const versionedJobNumber = generateJobNumber(jobNumber);
      sheet.getRange(range.getRow(), 2).setValue(versionedJobNumber);

      // 提取生成的版本号,仅当版本≥2时执行删除操作
      const currentVersion = parseInt(versionedJobNumber.split("^")[1], 10);
      if (!isNaN(currentVersion) && currentVersion >= 2) {
        removeMatchingRows(jobNumber);
      }
    }
  }
}

function generateJobNumber(jobNumber) {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet4");
  // 从第2行开始获取数据(排除表头)
  const data = sheet.getRange(2, 1, sheet.getLastRow() - 1, 1).getValues();
  let version = 0;

  data.forEach((row) => {
    const existingJob = row[0].toString().trim();
    if (existingJob) {
      const baseExistingJob = existingJob.split("^")[0];
      if (baseExistingJob === jobNumber) {
        version++;
      }
    }
  });

  // 版本从1开始计数,首次新增为^1
  return `${jobNumber}^${version + 1}`;
}

function removeMatchingRows(baseJobNumber) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheetsToCheck = ["Sheet1", "Sheet2", "Sheet3"];

  sheetsToCheck.forEach(sheetName => {
    const sheet = ss.getSheetByName(sheetName);
    if (!sheet) return;

    const data = sheet.getDataRange().getValues();
    const rowsToDelete = [];

    data.forEach((row, index) => {
      if (!row[0]) return; // 跳过空行
      const currentJob = row[0].toString().trim();
      const baseCurrentJob = currentJob.split("^")[0];
      // 匹配基础Job Number即可,无需判断其他表的版本
      if (baseCurrentJob === baseJobNumber) {
        rowsToDelete.push(index + 1); // 转换为实际行号(数组从0开始,行号从1开始)
      }
    });

    // 倒序删除行,避免删除后行号偏移
    rowsToDelete.reverse().forEach(rowIndex => {
      sheet.deleteRow(rowIndex);
    });
  });
}
关键修改点说明
  1. onEdit函数优化:

    • 新增表头行判断(range.getRow() > 1),避免误处理表头;
    • 提取生成的版本号,仅当版本≥2时才调用removeMatchingRows;
    • 对输入的Job Number做toString().trim()处理,避免空值或空格干扰。
  2. generateJobNumber函数修正:

    • 从第2行开始读取数据,排除表头;
    • 版本计数从1开始(首次新增生成^1),修正原代码首次新增得到^0的错误;
    • 对现有Job Number做格式处理,确保拆分逻辑稳定。
  3. removeMatchingRows函数逻辑调整:

    • 不再判断其他表中Job Number的版本,仅匹配基础Job Number即可(符合需求中“版本≥2时删除对应重复项”的逻辑);
    • 新增空行判断,避免处理无效数据;
    • 对每行的Job Number做格式处理,提升容错性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 07:28:16