英文:
Google Sheets - Data Validation - Conditional based on Column in another sheet
问题
我目前正在为一个美食节设计菜单。我使用Google表格。我有一张填满食物选择的表格。给定周的菜单不应包含上周的食物项目。这是一个强制要求,如果我使用数据验证和自定义公式,我就无法获得下拉菜单。
我使用=FILTER('Item Suggestions'!A:A,'Item Suggestions'!E:E="Y")
作为验证数据的自定义公式。
是否有其他方法(或调整以获得数据验证下拉菜单)来获取下拉菜单并保持下拉菜单列表被筛选?
“Menu”表的每一列都应该从“Item Suggestions”表的A列中选择。但数据应该基于E列。如果E列为Y,那么该列A中的数据应该显示在下拉菜单中。
菜单表:
第A列 | 第B列 | 第C列 | 第D列 | 第E列 |
---|---|---|---|---|
开胃菜 | 主菜 | 第二道 | 甜点 | 饮料 |
汤 | 鸡肉 | 奶油面条 | 草莓慕斯 | 火与冰 |
西兰花 | 米饭和咖喱 | 烤饼和蔬菜 | 冰淇淋圣代 | 莫吉托 |
“Item Suggestions”表:
第A列 | 第B列 | 第C列 | 第D列 | 第E列 |
---|---|---|---|---|
菜肴 | 课程 | 过敏原 | 类型 | 用于上周? |
奶油面条 | 主菜 | 麸质 | 素食 | Y |
巧克力大理石蛋糕 | 甜点 | 小麦 | 素食 | N |
英文:
Im currently designing a menu for a food festival. I use google sheets. I have a sheet filled with food choices. the menu for a given week should not have food items from the previous weeks. This is a mandatory requirement & I'm not able to get the drop-down if I use Data validation & custom formula.
I use =FILTER('Item Suggestions'!A:A,'Item Suggestions'!E:E="Y")
as the custom formula for validating the data.
Is there any other way (or a tweak to get the data validation drop down) to get the drop-down & keep the drop-down list filtered?
Each of the columns in the "Menu" sheet should pick from column A of the "Item Suggestions" sheet. But the data should be based on column E. If Column E is Y, then that respective data in Column A should be shown in the drop-down
Menu Sheet:
Column A | Column B | Column C | Column D | Column E |
---|---|---|---|---|
Appetizers | Mains | Course 2 | Dessert | Drinks |
Soup | Chicken | Creamy Pasta | Strawberry Mousse | Fire and Ice |
Broccoli | Rice & Curry | Roti & Subzi | Icecream Sundae | Mojito |
Item Suggestions sheet:
Column A | Column B | Column C | Column D | Column E |
---|---|---|---|---|
Dish | Course | Allergens | Type | Used in Previous weeks? |
Creamy Pasta | Main | Gluten | Vegetarian | Y |
Chocolate Marble Cake | Dessert | Wheat | Vegan | N |
答案1
得分: 1
验证助手列
我为验证添加了一些“助手”列。
- 它们可以在同一个工作表上或不同的工作表上。
- 每门课程都有一个:
Appetizer
(开胃菜)、Main
(主菜)、Dessert
(甜点)和Drink
(饮料)。我假设Main
(主菜)和Course 2
(第二道菜)都使用相同的菜品。 - FILTER公式会返回一个与正确的“课程”匹配且尚未使用的“菜品”数组:
=IFERROR(FILTER(Dishes, Courses=thisCourse, isUsed<>"Y"), "-")
- 对于验证规则,
- 标准将是“下拉菜单(来自范围)”,范围将是每个“课程”的适当助手列。
- “应用于范围”值将是您的“菜单”表中适当的“课程”列。
- 请注意,所有填充的菜单项将始终显示错误标志(位于右上角的红色三角形)。这是因为一旦它们被使用,它们就不再是有效值。这不会影响菜单下拉列表的功能。已使用的菜单项将从下拉列表中过滤掉,您将无法使用下拉属性设置为拒绝的方式手动添加已使用的菜单项。这只是一种视觉干扰。
下拉菜单公式
单一公式
将同时生成所有下拉列表并集中修改
=BYCOL(M2:P2, LAMBDA(c,
IFERROR(FILTER(G:G, H:H=c, K:K<>"Y"), "-")))
单独公式
需要手动复制到每个列中
=IFERROR(FILTER($G:$G, $H:$H=M2, $K:$K<>"Y"), "-")
用于标记已使用菜品的公式
- 您的“菜品大全”包括一个列来标记菜品是否先前已使用。
- 您的菜单的下拉列表基于此,并且在菜品被添加或从菜单中删除时动态更新“已使用/未使用”状态是合理的。
- 这可以通过在“菜品大全”中使用公式来实现,该公式根据菜品是否存在于菜单中来标记每道菜品。
菜品“已使用”公式
请注意,“单一公式”包括列标题“已在先前几周中使用?”。
- 这是有意为之的,以便将公式放在“菜品大全”数据的上方一行。
- 通过将公式与数据相隔一行,可以在不影响公式的情况下对数据进行排序。例如,您可以按“菜品”、“课程”、“过敏原”或“类型”对“菜品大全”进行排序。
单一公式
={"已在先前几周中使用?";
BYROW(G3:G51, LAMBDA(r,
IFERROR(IF(ROWS(FILTER(r, COUNTIF(A:E, r)))>0, "Y", ""))))}
单独公式
需要复制到每一行
=IFERROR(IF(ROWS(FILTER(G3, COUNTIF(A:E, G3)))>0, "Y", ""))
英文:
Validation Helper Columns
I added some 'helper' columns for the validation.
- They can be on the same sheet or a different one.
- There is one for each course:
Appetizer
,Main
,Dessert
, andDrink
. I assumeMain
andCourse 2
both share the same dishes. - The FILTER formula would return an array of
Dishes
that match the correctCourse
, and haven't yet been used:
=IFERROR(FILTER(Dishes,Courses=thisCourse,isUsed<>"Y"),"-")
- For the validation rule,
- the criteria would be
"Dropdown (from a range)"
with the range being the appropriate helper column for eachCourse
- The
"Apply to range"
value would be the appropriateCourse
column in yourMenu
table
- the criteria would be
- Please note that all populated menu items will 'always' show the error flag (red triangle in the top right corner). This is because the moment they are used, they are no longer valid values. This doesn't affect the functionality of the menu dropdowns. Used menu items will be filtered from the dropdowns, and you will not be able to add a used menu item manually with the dropdown properties set to reject. Just a visual distraction.
Dropdown Formula
Single Formula
Will generate all dropdowns at once and centralizes modifications
=BYCOL(M2:P2, LAMBDA(c,
IFERROR(FILTER(G:G,H:H=c,K:K<>"Y"),"-")))
Individual Formula
Needs to be manually copied to each column
=IFERROR(FILTER($G:$G,$H:$H=M2,$K:$K<>"Y"),"-")
<sub>Filtering Formula</sub><br>
[<img src="https://i.stack.imgur.com/YzgOC.png" width="550" />](https://i.stack.imgur.com/YzgOC.png "click to enlarge")
<sub>Dropdown with Filtered Dishes</sub><br>
[<img src="https://i.stack.imgur.com/4AJM1.png" width="550" />](https://i.stack.imgur.com/4AJM1.png "click to enlarge")
Formula to Mark Dishes When Used
- Your
Master List
of dishes includes a column to mark if a dish has been used previously - Your menu's dropdowns are based on that and it makes sense to update the "used/not used" status dynamically when a dish is added or removed from a menu.
- This can be achieved using a formula in the
Master List
that marks each dish based on whether it exists in the menu.
Dish "Is Used" Formula
Note that the 'Single Formula' includes the column heading "Used in previous weeks?"
.
- This was intentional in order to place the formula a line above the
Master List
data - Offsetting the formula from the data by a row, allows the data to be sorted without impacting the formula. For example, you could sort the
Master List
by any ofDishes
,Courses
,Allergens
, orType
Single Formula
={"Used in previous weeks?";
BYROW(G3:G51, LAMBDA(r,
IFERROR(IF(ROWS(FILTER(r,COUNTIF(A:E,r)))>0,"Y"))))}
Individual Formulas
Needs to be copied to each row
=IFERROR(IF(ROWS(FILTER(G3,COUNTIF(A:E,G3)))>0,"Y"))
<sub>Sorted Asc. by Dishes</sub><br>
[<img src="https://i.stack.imgur.com/vcxEI.png" width="550" />](https://i.stack.imgur.com/vcxEI.png "click to enlarge")<br><br>
<sub>Sorted Asc. by Courses then Dishes</sub><br>
[<img src="https://i.stack.imgur.com/Kp8bq.png" width="550" />](https://i.stack.imgur.com/Kp8bq.png "click to enlarge")<br><br>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论