我正在 Google Sheets 中创建一个电子表格,作为应用程序在数据库中引入一些数据。
我在创建列表动态更改的下拉列表时遇到问题。 我将尝试解释它,这是简化版本: https://docs.google.com/spreadsheets/d/1x2VwmnyiksitzeXQpGocBetef2GilvqIY8ar-6zJChc/edit#gid=307999969
我有一个下拉菜单,可以在多个选项之间进行选择(在示例中,在 A、B 和 C 之间)。 根据此选项,A 列中有不同的参数(使用 FILTER 函数)。在每个选项上,我想添加一个下拉列表,该列表取决于左侧单元格的结果(对于 B2,它应该是 A2)。该列表包含在“主”表中。 在这里,如果我选择选项 A,则会出现参数列表:设备、配方和时间。 在“设备”旁边,有一个下拉列表,我应该能够在 Eq1、Eq2 或 Eq3 之间进行选择。 我想在下拉列表中添加 FILTER 或 VLOOKUP 类型的功能,因此它会检查 MASTER 表上的参数名称并使用该列表作为下拉列表。
我尝试使用 ChatGPT,但给了我一些永远无法工作的代码。最接近的是仅当手动更改左侧单元格时才更改下拉列表的代码,但当 FILTER 函数的结果更改时从未更改它。
我无法单独创建(和隐藏)动态表,因为应用程序有数百个这样的表。
您知道如何实施吗? 谢谢你
您可以使用此答案作为您想要完成的任务的参考。
使用
Google Sheets Formulas
,您可以执行以下步骤来实现您想要做的事情。
MASTER
工作表中设置一个辅助列,该列取决于您在 Sheet31
过滤器中的选择。它看起来像这样:
在单元格中
K1
:
=QUERY(TRANSPOSE(A2:I),"Select * where Col1 ='"&Sheet31!A2&"'")
在单元格中
K2
:
=QUERY(TRANSPOSE(A2:I),"Select * where Col1 ='"&Sheet31!A3&"'")
在单元格中
K3
:
=QUERY(TRANSPOSE(A2:I),"Select * where Col1 ='"&Sheet31!A4&"'")
这使其成为动态的,因此表示例中的所有选项都将被选中。
类似这样的:
在单元格中
B2
:
=MASTER!$L$1:$Z$1
在单元格中
B3
:
=MASTER!$L$2:$Z$2
在单元格中
B4
:
=MASTER!$L$3:$Z$3
您可以根据您有多少选项更改单元格范围的最后部分。
onEdit(e)
触发器来执行您想要执行的操作。
我还添加了一些代码功能的解释
function onEdit(e) {
// Initializes the trigger
var value = e.value;
// Gets your current active spreadsheet
var ss = SpreadsheetApp.getActiveSpreadsheet();
// Gets the sheet named "MASTER"
var masterSheet = ss.getSheetByName("MASTER");
// Gets the sheet named "Sheet31"
var sheet31 = ss.getSheetByName("Sheet31");
// Gets the ranges for the dropdown
var dropdown1 = sheet31.getRange("B2");
var dropdown2 = sheet31.getRange("B3");
var dropdown3 = sheet31.getRange("B4");
// Gets the ranges of the options for the dropdown
// Option A
var equipmentOptions = masterSheet.getRange(3, 1, 3);
var formulationOptions = masterSheet.getRange(3, 2, 4);
var timeOptions = masterSheet.getRange(3, 3, 3);
// Option B
var schedOptions = masterSheet.getRange(3, 4, 3);
var templateOptions = masterSheet.getRange(3, 5, 2);
var dayOptions = masterSheet.getRange(3, 6, 2);
// Option C
var areaOptions = masterSheet.getRange(3, 7, 3);
var zoneOptions = masterSheet.getRange(3, 8, 2);
var partOptions = masterSheet.getRange(3, 9, 4);
// Initialization for the data validation
var dropdownDataValidation = SpreadsheetApp.newDataValidation();
// Sets the dropdown of data validation depending on the value
if (value == "A") {
dropdown1.setDataValidation(dropdownDataValidation.requireValueInRange(equipmentOptions));
dropdown2.setDataValidation(dropdownDataValidation.requireValueInRange(formulationOptions));
dropdown3.setDataValidation(dropdownDataValidation.requireValueInRange(timeOptions));
} else if (value == "B") {
dropdown1.setDataValidation(dropdownDataValidation.requireValueInRange(schedOptions));
dropdown2.setDataValidation(dropdownDataValidation.requireValueInRange(templateOptions));
dropdown3.setDataValidation(dropdownDataValidation.requireValueInRange(dayOptions));
} else if (value == "C") {
dropdown1.setDataValidation(dropdownDataValidation.requireValueInRange(areaOptions));
dropdown2.setDataValidation(dropdownDataValidation.requireValueInRange(zoneOptions));
dropdown3.setDataValidation(dropdownDataValidation.requireValueInRange(partOptions));
}
}