我有一张烹饪食谱表。每个食谱都有一个名称以及一份配料清单及其用量。例如
Apple Pie
x4 Apples
x8 Flour
x2 Butter
Scrambled Eggs
x2 Eggs
Burrito
x1 Tortilla
x1 Can of Beans
x2 Cheese
x1 Hot Sauce
目前我的数据组织如下:
| ... | Apple Pie | # | Scrambled Eggs | # | ... |
| ... | Apples | 4 | Eggs | 2 | ... |
| ... | Flour | 8 | | | ... |
| ... | Butter | 2 | | | ... |
如果我需要查找食谱中有哪些物品,我必须进行大量调用,例如查找 所在Apple Pie
的列。然后我必须Apple Pie
使用 来确定 下有多少种成分MATCH(ISBLANK
。一旦我知道了,我必须执行INDEX(...):INDEX(...)
来获取Apples, Flour, Butter
然后我必须再次重复所有这些操作才能获取数量。
有没有更好的方法?从编程的角度来说,我想制作一个Map<String, Map<String, Integer>>
食谱名称为钥匙我的第一张地图,成分名称是钥匙我的第二张地图给出了该成分的数量。
我的表格中还有另一部分列出了每种成分的价格:
| Ingredient | Cost (Cents) |
| Apples | 129 |
| Cheese | 45 |
我想编写一个简单的SUM
函数来计算的成本总和Apple Pie
,但是我的构造方式却使公式变得混乱,例如:
=IFERROR(ARRAYFORMULA(SUM(VLOOKUP(INDEX($F$4:$EQ$4, 1, MATCH($A3, $F$3:$EQ$3, 0)):INDEX($F$4:$EQ$11, MATCH(TRUE, ISBLANK(INDEX($F$4:$EQ$4, 1, MATCH($A3, $F$3:$EQ$3, 0)):INDEX($F$4:$EQ$11, 8, MATCH($A3, $F$3:$EQ$3, 0))), 0) - 1, MATCH($A3, $F$3:$EQ$3, 0)), 'PRICES'!$A:$G, 4, FALSE) * INDEX($F$4:$EQ$4, 1, MATCH($A3, $F$3:$EQ$3, 0) + 1):INDEX($F$4:$EQ$11, MATCH(TRUE, ISBLANK(INDEX($F$4:$EQ$4, 1, MATCH($A3, $F$3:$EQ$3, 0) + 1):INDEX($F$4:$EQ$11, 8, MATCH($A3, $F$3:$EQ$3, 0) + 1)), 0) - 1, MATCH($A3, $F$3:$EQ$3, 0) + 1))), "")
什么是更理想的数据结构方式,以便更容易地执行此类三维数组的查找?
答案1
答案2
用一个公式来得到总和:
=SUMPRODUCT(SUMIFS(I:I,H:H,INDEX(A:F,2,MATCH(M1,A1:F1,0)):INDEX(A:F,COUNTA(INDEX(A:F,MATCH(M1,A1:F1,0),0))-1,MATCH(M1,A1:F1,0)))*INDEX(A:F,2,MATCH(M1,A1:F1,0)+1):INDEX(A:F,COUNTA(INDEX(A:F,MATCH(M1,A1:F1,0),0))-1,MATCH(M1,A1:F1,0)+1))
这在 Excel 中有效,但在 Google Sheets 中无效。您将其标记为 Excel,但您提供的公式是 Google Sheets。
答案3
:警告:
根据我的理解,下面显示的方法是我发现的最好的方法,使用 OP 共享的数据,成分在前,数字在后。
- 我决定对两者使用单一公式。
- 无法找到有关将 X 与数字相加(如 x4)的线索。
单元格中的公式
A107
:=IF(IFERROR(INDEX(A$100:A$103, ROWS(A107:A$107)), IFERROR(INDEX(C$100:C$101, ROWS(A107:A$107)-ROWS(A$100:A$103)), IFERROR(INDEX(E$100:E$104, ROWS(A107:A$107)-ROWS(A$100:A$103)-ROWS(C$100:C$101)), "")))=0,"",IFERROR(INDEX(A$100:A$103, ROWS(A107:A$107)), IFERROR(INDEX(C$100:C$101, ROWS(A107:A$107)-ROWS(A$100:A$103)), IFERROR(INDEX(E$100:E$104, ROWS(A107:A$107)-ROWS(A$100:A$103)-ROWS(C$100:C$101)), ""))))
先右后下填写公式。
注意:
如果您坚持显示的输出,其中以 x 为前缀的数字首先出现,接下来是成分,那么请执行以下操作。
单元格中的公式
D107
:=IF(IFERROR(INDEX(B$100:B$103, ROWS(B$107:B107)),IFERROR(INDEX(D$100:D$101,ROWS(B$107:B107)-ROWS(B$100:B$103)),IFERROR(INDEX(F$100:F$104,ROWS(B$107:B107)-ROWS(B$100:B$103)-ROWS(D$100:D$101)),"")))=0,"","x"&IFERROR(INDEX(B$100:B$103,ROWS(B$107:B107)),IFERROR(INDEX(D$100:D$101,ROWS(B$107:B107)-ROWS(B$100:B$103)),IFERROR(INDEX(F$100:F$104,ROWS(B$107:B107)-ROWS(B$100:B$103)-ROWS(D$100:D$101)),""))))
单元格中的公式
E107
:=IFERROR(INDEX(A$100:A$103, ROWS(A107:A$107)), IFERROR(INDEX(C$100:C$101, ROWS(A107:A$107)-ROWS(A$100:A$103)), IFERROR(INDEX(E$100:E$104, ROWS(A107:A$107)-ROWS(A$100:A$103)-ROWS(C$100:C$101)), "")))
向下填充公式。
A根据需要调整公式中的单元格引用。