首页 > 解决方案 > 我能否获得帮助来修复相关下拉菜单的 Apps 脚本代码?

问题描述

根据以下链接,我的 Google 表格中有相关的下拉列表:

数据库

下拉列表位于“事件/事件”表中:

活动表

D 列和 E 列依赖于 C 列。这是“下拉列表”表中下拉数据的图像:

下拉菜单

“事件/事件”表的 C 列中的下拉列表是从“下拉列表”表 A2 到 F2 的数据验证。C 列下拉列表中的选择将规定 D 和 E 列下拉列表中的标准,并且两列的数据将相同。这将从 A4 向下、B4 向下等的“下拉列表”表中获取,例如,如果选择了“Tauranga”,则 Tauranga 下的所有名称都将出现在 D & E 下拉列表中。

这是我的 onEdit 代码:

 //Dependent Dropdowns for 'Event/Incidents' Sheet
   {
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var tablists = 'Dropdown Lists';
    var tabValidation = 'Events/Incidents';
    var ss = spreadsheet.getActiveSheet();
    var datass = spreadsheet.getSheetByName(tablists);
    var activeCell = ss.getActiveCell();
    if (
      activeCell.getColumn() == 3 &&
      activeCell.getRow() > 1 &&
      ss.getSheetName() == tabValidation
    ) {
      activeCell
        .offset(0, 1)
        .clearContent()
        .clearDataValidations();
      var base = datass.getRange(2, 1, 1, 5).getValues();
      var baseIndex = base[0].indexOf(activeCell.getValue()) + 1;
      Logger.log(baseIndex);
      if (baseIndex != 0) {
        //Dynamic dropdown for 'Event Recorded By'
        var validationRange = datass.getRange(3, baseIndex, datass.getLastRow());
        var validationRule = SpreadsheetApp.newDataValidation().requireValueInRange(validationRange).build();
        activeCell.offset(0, 1).setDataValidation(validationRule);
         //Dynamic dropdown for 'Employee'
        var validationRange2 = datass.getRange(4, baseIndex, datass.getLastRow());
        var validationRule2 = SpreadsheetApp.newDataValidation().requireValueInRange(validationRange2).build();
        activeCell.offset(0, 2).setDataValidation(validationRule2);
         }
    }
    if (ss.getSheetName() == tabValidation) {
      var lock = LockService.getScriptLock();
      if (lock.tryLock(0)) {
        autoid_(ss);
        lock.releaseLock();
      }
    }
    

我无法让这段代码正常工作,希望能得到一些帮助。

标签: google-apps-scriptgoogle-sheets

解决方案


这是您可以在 onEdit 函数中实现的示例,这将根据在 C 列中选择的值为每行中的 D 列和 E 列创建下拉列表:

  var range = e.range;
  var editedRow = range.getRow();

  var spreadsheet = SpreadsheetApp.getActive();
  var dropdownSheet = spreadsheet.getSheetByName("Dropdown Lists");
  var eventsSheet = spreadsheet.getSheetByName("Events/Incidents");

  var baseSelected = eventsSheet.getRange('C' + editedRow).getValue();
  var column;

  switch (baseSelected) {
    case 'EBOP': column = 'A'; break;
    case 'Tauranga': column = 'B'; break;
    case 'Palmerston North': column = 'C'; break;
    case 'Kapiti': column = 'D'; 
  }
  var startCell = dropdownSheet.getRange( column +'4');
  var endCellNotation = startCell.getNextDataCell(SpreadsheetApp.Direction.DOWN).getA1Notation();
  var ruleRange =  dropdownSheet.getRange(startCell.getA1Notation() + ':' + endCellNotation);

  var dropdown1 = eventsSheet.getRange('D' + editedRow);
  var dropdown2 = eventsSheet.getRange('E' + editedRow);

  var rule1 = SpreadsheetApp.newDataValidation().requireValueInRange(ruleRange).build();
  var rule2 = SpreadsheetApp.newDataValidation().requireValueInRange(ruleRange).build();

  dropdown1.setDataValidation(rule1);
  dropdown2.setDataValidation(rule2);

我使用了 DataValidation [1] 和 DataValidationBuilder [2] 类。

[1] https://developers.google.com/apps-script/reference/spreadsheet/data-validation

[2] https://developers.google.com/apps-script/reference/spreadsheet/data-validation-builder


推荐阅读