Google 表格中的多个相关下拉列表

山泉

我发现这个代码片段从某些列中读取数据,然后自动从该数据中创建相关的下拉列表。

在我的示例中,它在 SheetB 上创建了相关的下拉列表,并且正在为此目的工作。

//CREATE PRIMARY DROPDOWN LIST
function createPrimaryDrpdwon() {
/* SET FOLLOWING VARIABLES */

var dataSS           = "Options";         //Name of the sheet that contain data for dropdown lists
var dropSS           = "SheetB";      //Name of the sheet which dropdown list to be created
var primaryDataRange = "N7:N500";       //Data range for primary dropdown
var primaryDropRange = "C2:C500";       //Range which primary dropdown set

var primaryDropList  = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(dataSS).getRange(primaryDataRange).getValues();
var primaryDropRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(dropSS).getRange(primaryDropRange);
var validationRule   = SpreadsheetApp.newDataValidation().requireValueInList(primaryDropList).build();

primaryDropRange.setDataValidation(validationRule);
}


//CREATE SECONDARY DROPDOWN LIST
function onEdit(){
/* SET FOLLOWING VARIABLES */
var dataSS       = "Options";         //Name of the sheet that contain data for dropdown lists
var dropSS       = "SheetB";      //Name of the sheet which dropdown list to be created
var allDataRange = "N7:O500";       //Data range for dropdown list (both primary and dependent)
var primaryDDCol = 3;               //Column number of the primary drop down

var dropSS_      = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(dropSS);
var dropDData    = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(dataSS).getRange(allDataRange).getValues();
var activeCell   = dropSS_.getActiveCell();
var activeColumn = activeCell.getColumn();
var activeRow    = activeCell.getRow();

if(activeColumn==primaryDDCol){
    var dep_Col         = primaryDDCol+1;
    var dep_Row         = activeRow;
    var depCell         = dropSS_.getRange(dep_Row, dep_Col);
    var primarySelected = activeCell.getValue();
    var validationRule  = SpreadsheetApp.newDataValidation().requireValueInList(getDependentList(dropDData,primarySelected)).build();
    
    depCell.setDataValidation(validationRule);
}
}

function getDependentList(dropDData,primarySelected){
var dependenList = [];
var j = 0;
if(dropDData != null){
    for(i=0; i<dropDData.length; i++){
    if(dropDData[i][0]==primarySelected){
        dependenList[j] = dropDData[i][1];
        j++;
    }
    }
}
return dependenList;
}

但是,如果我想要另一个下拉列表来读取选项表上不同列的数据并在 SheetC 上创建相关下拉列表,并且如果我想在未来拥有更多这样的下拉列表,该怎么办?

我尝试复制/粘贴和重命名所有变量并在第一个副本中更改输入和输出数据,但我无法使其工作。

编辑:用我想要实现的图像示例来澄清:

工作表选项 - 将显示在工作表 B 上的第一个相关下拉列表的数据范围

工作表选项 1

SheetB - 脚本生成的第一个依赖下拉列表

表 B

脚本当前如何在 SheetB 上运行的简短 Gif

表 B - 视频

工作表选项 - 将在 SheetC 上显示的第二个相关下拉列表的数据范围

工作表选项 2

SheetC - 脚本生成的第二个相关下拉列表

表 C

脚本目前在 SheetB 上生成下拉列表,但我在 SheetC 上需要同样的东西,可能是 SheetD、E 等:)

Tanaike

我相信你的目标如下。

  • 运行函数时,您希望将下拉列表放入“SheetB”和“SheetC”中的“C”列createPrimaryDrpdwon()
  • 当更改“C”列的下拉列表时,您希望通过“C”列的值将下拉列表设置为“D”列。

在这种情况下,如何进行以下修改?

示例脚本:

function createPrimaryDrpdwon() {
  var dataSS = "Options";

  // Please set the sheet names and ranges.
  var dropSSs = [
    { dropSS: "SheetB", primaryDataRange: "N7:N500" },
    { dropSS: "SheetC", primaryDataRange: "Q7:Q500" },
  ];

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  dropSSs.forEach(({ dropSS, primaryDataRange }) => {
    var primaryDropRange = "C2:C20";
    var primaryDropList = ss.getSheetByName(dataSS).getRange(primaryDataRange).getValues();
    var primaryDropRange = ss.getSheetByName(dropSS).getRange(primaryDropRange);
    var validationRule = SpreadsheetApp.newDataValidation().requireValueInList(primaryDropList).build();
    primaryDropRange.setDataValidation(validationRule);
  });
}

function onEdit(e) {
  // Please set the sheet names and ranges.
  var dropSSs = { "SheetB": "N7:O500", "SheetC": "Q7:R500" };

  const ss = e.source;
  const range = e.range;
  const sheet = range.getSheet();
  const sheetName = sheet.getSheetName();
  if (!Object.keys(dropSSs).includes(sheetName) || range.columnStart != 3 || range.rowStart == 1) return;

  // I modified your onEdit function a little as follows.
  var dataSS = "Options";
  var primaryDDCol = 3;
  var dropSS_ = sheet;
  var dropDData = ss.getSheetByName(dataSS).getRange(dropSSs[sheetName]).getValues();
  var activeCell = range;
  var activeColumn = activeCell.getColumn();
  var activeRow = activeCell.getRow();
  if (activeColumn == primaryDDCol) {
    var dep_Col = primaryDDCol + 1;
    var dep_Row = activeRow;
    var depCell = dropSS_.getRange(dep_Row, dep_Col);
    var primarySelected = activeCell.getValue();
    var validationRule = SpreadsheetApp.newDataValidation().requireValueInList(getDependentList(dropDData, primarySelected)).build();
    depCell.setDataValidation(validationRule);
  }
}

function getDependentList(dropDData, primarySelected) {
  var dependenList = [];
  var j = 0;
  if (dropDData != null) {
    for (i = 0; i < dropDData.length; i++) {
      if (dropDData[i][0] == primarySelected) {
        dependenList[j] = dropDData[i][1];
        j++;
      }
    }
  }
  return dependenList;
}
  • dropSSs运行此脚本时,通过从“选项”工作表中检索值,将下拉列表创建到工作表的“C”列。并且,当更改“C”列的下拉列表时,下拉列表将通过“C”列的值插入到“D”列。

参考:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Google表格中具有重复列下拉列表的多个相关动态下拉列表

Google表单上的动态相关下拉列表

Excel VBA中的多个相关下拉列表

如何创建可以使用 Google Apps 脚本为多列设置值的二级相关下拉列表

在 Excel 中基于另一个下拉列表创建多个相关下拉列表

PHP相关下拉列表

dhtmlx 调度程序灯箱中的相关下拉列表

基于 Google 表格中的下拉列表填充单元格

Google 表格:子公司和发票以及相关动态下拉列表

重置jQuery相关下拉列表的显示

多行相关下拉列表

相关下拉列表和偏移公式

颤振中的多重相关下拉

Google 表格 - 使用下拉列表过滤

Vee-Validate:具有多个条件的相关下拉列表

根据相关下拉列表/多个条件更新单元格值

Google表格中的相关数据验证

页面刷新后保留两个相关下拉列表中的值

无法在相关下拉列表中的更新期间自动填充数据

下拉列表未显示,Bootstrap 和 Google 应用程序脚本,从电子表格中填充下拉列表

根据Google表格中的值在Google表单中创建日期下拉列表,而是创建字符串列表

在Google表格中过滤下拉结果?

Javascript - 附加行相关下拉列表

如何使用相关下拉列表在ajax中发送数据

相关下拉列表:发布后保持用户选择

相关下拉列表在编辑时不显示值?

两列单元格列表(下拉列表)-Google表格

根据Google表格中的下拉列表更新单元格数据

是否可以在Google表格的下拉列表中设置日期格式和排序方式?