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

AppScript需求:指定唯一标识列,对比同文档两Google Sheets并高亮差异

解决方案

核心问题是原脚本硬编码了将第一列(A列)作为唯一标识列,我们需要修改脚本,让它支持用户指定的列作为唯一标识,同时适配对应的对比逻辑。

修改后的完整脚本

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('查找变更')
      .addItem('点击查找变更', 'menuItem1')
      .addToUi();
}

function menuItem1() {
  var ui = SpreadsheetApp.getUi();
  var result1 = ui.prompt("请输入第一个工作表名称");
  var result2 = ui.prompt("请输入第二个工作表名称");
  var playerNameColumnResp = ui.prompt("请输入玩家名称所在列号(示例:A列=1)");
  // 将用户输入的1开始列号转为0索引(适配数组逻辑)
  var playerColNum = parseInt(playerNameColumnResp.getResponseText()) - 1;
  compare(result1.getResponseText(), result2.getResponseText(), playerColNum);
}

function compare(sheetName1, sheetName2, playerColIndex) {
  // 获取当前表格及目标工作表
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = ss.getSheetByName(sheetName1);
  var sheet2 = ss.getSheetByName(sheetName2);

  // 获取两个工作表的全部数据
  var range1 = sheet1.getDataRange();
  var values1 = range1.getValues();
  var range2 = sheet2.getDataRange();
  var values2 = range2.getValues();

  // 构建以指定列值为唯一键的查找对象
  const createLookupObj = (values, keyIndex) => {
    return values.reduce((obj, row) => {
      const key = row[keyIndex];
      obj[key] = [...row]; // 存储整行数据用于后续对比
      return obj;
    }, {});
  };

  const obj1 = createLookupObj(values1, playerColIndex);
  const obj2 = createLookupObj(values2, playerColIndex);

  // 生成背景色数组的逻辑
  const generateColors = (sourceValues, targetObj, keyIndex) => {
    return sourceValues.map(row => {
      const key = row[keyIndex];
      const targetRow = targetObj[key];
      // 若目标表无该标识,整行标红
      if (!targetRow) {
        return Array(row.length).fill("red");
      }
      // 逐列对比,标识列保持白色,其他列不同则标红
      return row.map((cell, idx) => {
        if (idx === keyIndex) return "white";
        return cell === targetRow[idx] ? "white" : "red";
      });
    });
  };

  // 生成并设置背景色
  const colors1 = generateColors(values1, obj2, playerColIndex);
  const colors2 = generateColors(values2, obj1, playerColIndex);
  range1.setBackgrounds(colors1);
  range2.setBackgrounds(colors2);
}

关键修改说明

  • 动态传递列索引:在菜单交互中获取用户输入的列号,转换为数组所需的0索引后传递给对比函数,不再固定依赖第一列。
  • 灵活构建查找对象:通过createLookupObj函数,根据指定列索引提取唯一标识作为键,存储整行数据,适配任意列作为唯一标识的场景。
  • 精准对比逻辑:generateColors函数中跳过标识列的标红操作,仅对比其他列的内容差异;若标识在另一表中不存在,则整行标红。
  • 中文界面优化:将菜单和提示文本改为中文,提升使用体验。

使用步骤

  1. 打开目标Google表格,点击「扩展程序」→「Apps脚本」,替换原有脚本为上述代码。
  2. 保存脚本后刷新表格,顶部会出现「查找变更」菜单。
  3. 点击「点击查找变更」,依次输入两个工作表名称、玩家名称所在列号(如D列输入4),脚本将自动对比并标红变更值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 12:15:28