Google 工作表 - 将 VLOOKUP 与命名范围相结合以创建下拉列表
Google Sheets - Combine VLOOKUP with Named Ranges to create Drop Down
我有 3 个工作表 - Stocks、Products 和 Sizes.
我创建了 3 个命名范围:
'Adults'、'Kids' 和 'Shoes'。
在 Stock 工作表上,添加产品后 - 我希望尺寸列成为包含该产品正确尺寸的下拉列表 - 基于Products.
中设置的命名范围
示例
Product 'redshirt1' in Products 已分配范围 'Adults'。
因此,Stock 中的以下单元格应包含以下尺寸的下拉列表:L、XL、XXL
希望我说得足够清楚了,在此先感谢您的帮助。
这是我的 Google Sheet:
https://docs.google.com/spreadsheets/d/1bxmItQpOOQ-WTBsd0uA0WmzYACVUdtCVRaex879KgcE/edit?usp=sharing
您可以通过以下方式获得:
=INDEX(IFNA(VLOOKUP(VLOOKUP(A2:A, Products!A1:D, 4, 0),
SPLIT(SUBSTITUTE(TRIM(FLATTEN(
QUERY(Sizes!A1:C,,9^9))), " ", "×", 1), "×"), 2, 0)))
但要将其变成下拉菜单,请尝试:
根据产品中定义的范围,以下公式还将 return 正确的命名范围:
=INDIRECT(IFNA(VLOOKUP(A2:A,Products!A2:Z,4, FALSE), ""))
但是,Google Sheet 中的数据验证列表不接受公式作为输入。
为了避免必须为 Stock 中的每一行创建一个“辅助列”来填充下拉列表,使用 Apps 脚本,您可以使用 Simple Trigger onEdit() 来实现,以根据所选的“代码".
示例代码(编辑):
function onEdit(){
//This method runs every time a cell is modified
var ss = SpreadsheetApp.getActiveSpreadsheet();
var ws = ss.getActiveSheet();
var activeCell = ws.getActiveCell();
if (activeCell.getColumn() == 10 && activeCell.getRow() > 1 && ws.getSheetName() == "Pending") { //Only runs if the value changed is on the "J" column of Pending except first row
var wsStyles = ss.getSheetByName("Styles");
var selectedValue = activeCell.getValue();
activeCell.offset(0, 2).clearContent().clearDataValidations().setValue("Loading...");
//Get style Range column from Styles based on Code
var styles = wsStyles.getDataRange().getValues();
var rangeStyle = "";
for (row of styles) { //looping through Styles and storing Range value in rangeStyle
if (row[0] == selectedValue) {
//Slightly edit here, since the Size name defined in Styles contains spaces, which Named Ranges doesn't accept as valid
//Make sure to declare your named ranges exactly as declared in "Styles" but replacing any spaces with "_" in order for this code to run
rangeStyle = row[2].replace(" ", "_");
break
}
}
//Looping through defined Named Ranges to identify and set drop-down list
var namedRangeList = ss.getNamedRanges();
for (namedRange of namedRangeList) {
if (namedRange.getName() == rangeStyle) { //if the Range name defined in Styles is the same as Named Range name...
var rangeSizes = namedRange.getRange();
activeCell.offset(0, 2).clearContent().clearDataValidations(); //cleaning column D from the modified row
var validationRule = SpreadsheetApp.newDataValidation().requireValueInRange(rangeSizes).build(); //Instantiating DataValidation object with the range of data retrieved previously
activeCell.offset(0, 2).setDataValidation(validationRule); //Setting DataValidation object as value of column D from the modified row
}
}
}
}
EDIT:
确保声明您的命名范围用“_”替换空格,以便此代码在新提供的 Sheet 上工作。
尝试
function onEdit(e){
var sh = e.source.getActiveSheet()
for (var i = e.range.rowStart;i<=e.range.rowEnd;i++){
for (var j = e.range.columnStart;j<=e.range.columnEnd;j++){
validationManagement(sh,sh.getRange(i,j))
}
}
}
function validationManagement(sh,cel){
if (sh.getName()=='Pending' && cel.getRow()>1 && cel.getColumn()==10){
if (cel.getValue()==''){
cel.offset(0, 2).clearContent().clearDataValidations();
}else{
var ss = SpreadsheetApp.getActiveSpreadsheet()
var styles = ss.getSheetByName('Styles').getDataRange().getValues().filter( r => (r[0]==cel.getValue()) )
var sizes = ss.getSheetByName('Sizes')
var col = sizes.getRange(1,1,1,sizes.getLastColumn()).getValues().flat().indexOf(styles[0][2])+1
cel.offset(0, 2).clearContent().clearDataValidations();
var validationRule = SpreadsheetApp.newDataValidation().requireValueInRange(sizes.getRange(2,col,sizes.getLastRow()-1,1)).build()
cel.offset(0, 2).setDataValidation(validationRule);
}
}
}
这将允许您一次更改多个值。
https://docs.google.com/spreadsheets/d/1tfs3fIj8pgMkmfySzbXUCqgXainG2o1rchLg4foVZeo/edit?usp=sharing
参考文献
我有 3 个工作表 - Stocks、Products 和 Sizes.
我创建了 3 个命名范围: 'Adults'、'Kids' 和 'Shoes'。
在 Stock 工作表上,添加产品后 - 我希望尺寸列成为包含该产品正确尺寸的下拉列表 - 基于Products.
中设置的命名范围示例
Product 'redshirt1' in Products 已分配范围 'Adults'。 因此,Stock 中的以下单元格应包含以下尺寸的下拉列表:L、XL、XXL
希望我说得足够清楚了,在此先感谢您的帮助。
这是我的 Google Sheet:
https://docs.google.com/spreadsheets/d/1bxmItQpOOQ-WTBsd0uA0WmzYACVUdtCVRaex879KgcE/edit?usp=sharing
您可以通过以下方式获得:
=INDEX(IFNA(VLOOKUP(VLOOKUP(A2:A, Products!A1:D, 4, 0),
SPLIT(SUBSTITUTE(TRIM(FLATTEN(
QUERY(Sizes!A1:C,,9^9))), " ", "×", 1), "×"), 2, 0)))
但要将其变成下拉菜单,请尝试:
根据产品中定义的范围,以下公式还将 return 正确的命名范围:
=INDIRECT(IFNA(VLOOKUP(A2:A,Products!A2:Z,4, FALSE), ""))
但是,Google Sheet 中的数据验证列表不接受公式作为输入。 为了避免必须为 Stock 中的每一行创建一个“辅助列”来填充下拉列表,使用 Apps 脚本,您可以使用 Simple Trigger onEdit() 来实现,以根据所选的“代码".
示例代码(编辑):
function onEdit(){
//This method runs every time a cell is modified
var ss = SpreadsheetApp.getActiveSpreadsheet();
var ws = ss.getActiveSheet();
var activeCell = ws.getActiveCell();
if (activeCell.getColumn() == 10 && activeCell.getRow() > 1 && ws.getSheetName() == "Pending") { //Only runs if the value changed is on the "J" column of Pending except first row
var wsStyles = ss.getSheetByName("Styles");
var selectedValue = activeCell.getValue();
activeCell.offset(0, 2).clearContent().clearDataValidations().setValue("Loading...");
//Get style Range column from Styles based on Code
var styles = wsStyles.getDataRange().getValues();
var rangeStyle = "";
for (row of styles) { //looping through Styles and storing Range value in rangeStyle
if (row[0] == selectedValue) {
//Slightly edit here, since the Size name defined in Styles contains spaces, which Named Ranges doesn't accept as valid
//Make sure to declare your named ranges exactly as declared in "Styles" but replacing any spaces with "_" in order for this code to run
rangeStyle = row[2].replace(" ", "_");
break
}
}
//Looping through defined Named Ranges to identify and set drop-down list
var namedRangeList = ss.getNamedRanges();
for (namedRange of namedRangeList) {
if (namedRange.getName() == rangeStyle) { //if the Range name defined in Styles is the same as Named Range name...
var rangeSizes = namedRange.getRange();
activeCell.offset(0, 2).clearContent().clearDataValidations(); //cleaning column D from the modified row
var validationRule = SpreadsheetApp.newDataValidation().requireValueInRange(rangeSizes).build(); //Instantiating DataValidation object with the range of data retrieved previously
activeCell.offset(0, 2).setDataValidation(validationRule); //Setting DataValidation object as value of column D from the modified row
}
}
}
}
EDIT:
确保声明您的命名范围用“_”替换空格,以便此代码在新提供的 Sheet 上工作。
尝试
function onEdit(e){
var sh = e.source.getActiveSheet()
for (var i = e.range.rowStart;i<=e.range.rowEnd;i++){
for (var j = e.range.columnStart;j<=e.range.columnEnd;j++){
validationManagement(sh,sh.getRange(i,j))
}
}
}
function validationManagement(sh,cel){
if (sh.getName()=='Pending' && cel.getRow()>1 && cel.getColumn()==10){
if (cel.getValue()==''){
cel.offset(0, 2).clearContent().clearDataValidations();
}else{
var ss = SpreadsheetApp.getActiveSpreadsheet()
var styles = ss.getSheetByName('Styles').getDataRange().getValues().filter( r => (r[0]==cel.getValue()) )
var sizes = ss.getSheetByName('Sizes')
var col = sizes.getRange(1,1,1,sizes.getLastColumn()).getValues().flat().indexOf(styles[0][2])+1
cel.offset(0, 2).clearContent().clearDataValidations();
var validationRule = SpreadsheetApp.newDataValidation().requireValueInRange(sizes.getRange(2,col,sizes.getLastRow()-1,1)).build()
cel.offset(0, 2).setDataValidation(validationRule);
}
}
}
这将允许您一次更改多个值。
https://docs.google.com/spreadsheets/d/1tfs3fIj8pgMkmfySzbXUCqgXainG2o1rchLg4foVZeo/edit?usp=sharing