0

我创建了多个部门必须使用的工作表。(例如,Dept 1、Dept 2、Dept 3。)所有这些部门都有自己的内容,具体项目位于电子表格的第二张表上。(例如,部门 1 = A2:F35,部门 2 = A38:F60,部门 3 = A63:F89)

下拉菜单(下拉菜单 1(单元格 H60))用于选择部门。

选择部门后,我需要更改第二个下拉列表(单元格 B67)的数据验证,以便仅显示所选部门的信息。我使用多个 V-LOOKUP 函数

工作表片段

我已经坐了几个小时试图创建和编辑脚本以在编辑第一个下拉单元格的数据时自动更改第二个下拉数据,但没有运气。

请让我知道是否有人可以提供帮助。

这是工作表的链接

4

2 回答 2

0
  • 您有一个下拉列表 #1(在此示例中,在 中H5),其中包含不同部门的名称。
  • 您有一系列下拉列表 #2(在列中B,从第 12 行开始),其中包含属于某个部门的项目(有关哪些项目属于哪些部门的信息包含在 sheet 中Content)。
  • 当在下拉列表 #1 中选择了不同的选项时,您想要更改在每个下拉列表 #2 中选择的项目。

如果这是正确的,您可以使用以下onEdit触发器(检查内联注释):

function onEdit(e) {
  var range = e.range;
  var sheet = range.getSheet();
  var column = range.getColumn();
  var row = range.getRow();
  var dropdown1 = range.getValue();
  var options = range.getDataValidation().getCriteriaValues()[0];
  var depts = {}; // Object with key-values like: { departmentName: [itemNames] }
  var currentProp = "";
  if (sheet.getName() === "Main" && column === 8 && row === 5) { // Check that edited cell is dropdown #1
    var contentSheet = e.source.getSheetByName("Content");
    var content = contentSheet.getRange(1, 1, contentSheet.getLastRow()).getValues().map(function(value) {
      return value[0]; // Get departments and items from "Content"
    });
    // Create properties for each department / items in "Content"
    for (var i = 0; i < content.length; i++) {
      if(options.indexOf(content[i]) !== -1) {
        depts[content[i]] = [];
        currentProp = content[i];
      } else {
        depts[currentProp].push(content[i])
      }
    }
    var firstRow = 12;
    var column = 2;
    var numRows = sheet.getLastRow() - firstRow + 1;
    for (var j = 0; j < numRows; j++) { // Iterate through each dropdown #2
      var dropdownRange = sheet.getRange(firstRow + j, column);
      var dropdownValues = dropdownRange.getDataValidation().getCriteriaValues()[0];
      for (var k = 0; k < dropdownValues.length; k++) { // Find element from dropdown that belongs to selected department
        if (depts[dropdown1].indexOf(dropdownValues[k]) !== -1) {
          dropdownRange.setValue(dropdownValues[k]); // Change dropdown value
          break; // End loop
        }
      }
    }
  }
}

笔记:

  • 我假设下拉列表已经填充,并且您唯一要做的就是在编辑下拉列表 #1 的值时更改每个下拉列表 #2 中的选定值。
于 2020-02-27T15:05:25.597 回答
0

我做了以下工作,效果很好:

    function onEdit(e) {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var cr = SpreadsheetApp.getActiveSpreadsheet().getSheetName();
    var type = sheet1.getRange("L57").getValue(); //GET DROPDOWN VALUE
    var prefix = sheet1.getRange("K57"); //NA
    var suffix = sheet1.getRange("J57"); //NA
    var sheet1 = ss.getSheets()[0];  //get sheet 1

 if(cr == "sheetname"){          //confirm sheet edited
       if((e.range.columnStart==12) && (e.range.rowStart==57)){  //confirm range editied


               if(type == "type I want"){  //DROPDOWN VALUE 
               // ss.toast("this one SELECTED"); //confirmation
                var cell = ss.getRange("B68:B72");  
                cell.setValue("");  //clear all values for no errors when validation changes
                var datarange = sheet4.getRange("A3:A24"); //range info i want as new data validation
                var rule = SpreadsheetApp.newDataValidation().requireValueInRange(datarange).build();  //get datavalitation
                cell.setDataValidation(rule); //Set data validation
                prefix = "WB";//NA
                sheet1.getRange("K57").setValue(prefix);//NA
               }  //added else if's here for other dropdown values
}
}
于 2020-05-14T14:50:12.563 回答