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函数中跳过标识列的标红操作,仅对比其他列的内容差异;若标识在另一表中不存在,则整行标红。 - 中文界面优化:将菜单和提示文本改为中文,提升使用体验。
使用步骤
- 打开目标Google表格,点击「扩展程序」→「Apps脚本」,替换原有脚本为上述代码。
- 保存脚本后刷新表格,顶部会出现「查找变更」菜单。
- 点击「点击查找变更」,依次输入两个工作表名称、玩家名称所在列号(如D列输入4),脚本将自动对比并标红变更值。
内容的提问来源于stack exchange,提问作者Ken
相关产品推荐
相关产品推荐

