Google Sheets脚本问题:找到指定值后修改另一单元格并同步下拉列表
问题描述
我在Google Sheets里有两列数据:
- 一列是普通数据(对应代码里的"bill column")
- 另一列是下拉列表(对应代码里的"drop-list column")
需求:当我在某行的下拉列表选中一个选项时,自动为所有普通数据列值与当前行普通数据值相同的行,把它们的下拉列表也设为相同选项,避免重复操作。
当前遇到的问题:使用textFinder找到普通数据列中特定值的单元格后,不知道如何定位到对应行的下拉列表单元格并修改其值,之前的代码会直接修改找到的普通数据单元格,不符合需求。
现有代码
function onEdit() { var activesheet = SpreadsheetApp.getActiveSheet() var Cell = SpreadsheetApp.getActiveSheet().getActiveCell(); var Column = Cell.getColumn(); if (activesheet.getName()=='Transacties'){ if (Column == 5 && SpreadsheetApp.getActiveSheet()){ var Target = SpreadsheetApp.getActiveSheet().getRange(Cell.getRow(), Column + 1); var Reknr = SpreadsheetApp.getActiveSheet().getRange(Cell.getRow(), Column + -1); //this is the bill column var Juistecat = SpreadsheetApp.getActiveSheet().getRange(Cell.getRow(), Column + 0); //this is the drop-list column var Options = SpreadsheetApp.getActiveSpreadsheet().getRangeByName(Cell.getValue()); var Valrek = Reknr.getValue(); //waarde huidig rekening nr var Valcat = Juistecat.getValue(); //waarde huidig rekening nr SubcategoryDropdown(Target, Options); } //Reknr.setValue("Hello"); //werkt, juiste cell iig // var vv = SpreadsheetApp.getActiveSheet().getActiveCell().getValue(); SpreadsheetApp.getUi().alert("The active cell value is "+Valrek); SpreadsheetApp.getUi().alert("The active cell value is "+Valcat); var textFinder = Reknr.createTextFinder(Valrek); var range = SpreadsheetApp.getActive().getRangeByName("Reknr"); var values = range.getValues(); SpreadsheetApp.getUi().alert("The active cell value is "+valrek); values.forEach(function(row) { row.forEach(function(col) { textFinder.replaceAllWith(Valrek); // But I dont want to replace the current, I need to replace //Target.setValue("Hello"); }); }); } }
解决方案
下面是修改后的脚本,核心逻辑是找到所有普通数据值匹配的行,批量修改对应行的下拉列表单元格值:
function onEdit(e) { const activeSheet = e.source.getActiveSheet(); // 仅在"Transacties"工作表、且编辑的是第5列(下拉列表列)时执行 if (activeSheet.getName() !== 'Transacties' || e.range.getColumn() !== 5) return; const currentRow = e.range.getRow(); // 获取当前行的普通数据值(第4列,因为下拉列是第5列) const targetReknr = activeSheet.getRange(currentRow, 4).getValue(); // 获取当前选中的下拉列表值 const targetCat = e.value; // 获取整个普通数据列(已命名范围"Reknr") const reknrRange = SpreadsheetApp.getActive().getRangeByName("Reknr"); const reknrValues = reknrRange.getValues(); const rowsToUpdate = []; // 遍历所有行,找出普通数据值匹配的行号 reknrValues.forEach((row, index) => { if (row[0] === targetReknr) { // 计算工作表中的实际行号(兼容命名范围非首行的情况) const sheetRow = reknrRange.getRow() + index; // 跳过当前编辑行,避免重复设置 if (sheetRow !== currentRow) { rowsToUpdate.push(sheetRow); } } }); // 批量修改对应行的下拉列表列(第5列) rowsToUpdate.forEach(row => { activeSheet.getRange(row, 5).setValue(targetCat); }); }
关键说明
- 触发条件优化:使用
onEdit(e)的事件对象e,减少重复的活跃单元格获取操作,提升脚本效率。 - 匹配行定位:遍历普通数据列的所有值,筛选出与当前行普通数据值相同的行,排除当前编辑行避免冗余操作。
- 精准修改目标:直接定位到匹配行的下拉列表列(第5列)设置值,不会误修改普通数据列内容。
- 命名范围兼容:如果"Reknr"命名范围不是从工作表第1行开始,通过
reknrRange.getRow()获取起始行,计算出工作表中的实际行号。
内容的提问来源于stack exchange,提问作者wjp79
相关产品推荐
相关产品推荐

