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

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);
  });
}

关键说明

  1. 触发条件优化:使用onEdit(e)的事件对象e,减少重复的活跃单元格获取操作,提升脚本效率。
  2. 匹配行定位:遍历普通数据列的所有值,筛选出与当前行普通数据值相同的行,排除当前编辑行避免冗余操作。
  3. 精准修改目标:直接定位到匹配行的下拉列表列(第5列)设置值,不会误修改普通数据列内容。
  4. 命名范围兼容:如果"Reknr"命名范围不是从工作表第1行开始,通过reknrRange.getRow()获取起始行,计算出工作表中的实际行号。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:40:42