将成分数量数据排列在一行中,以便在别处检索

Arranging the ingredient-quantity data in a single row, to be retrieved elsewhere

我想在 Google Sheet 上实现一个 table,其中包含具有不同数据的行,其中两个字段是相关数组,我想知道最好的实现它的方法。共有三种不同的 sheet,分别命名为 Recipies、Ingredients 和 Dishes。 Recipies 包含菜品名称和配料表,Ingredients 包含每种配料的营养信息,Dishes 包含每份食物的实际营养信息。

食谱Sheet我希望它尽可能保持可读性和视觉性:

Name  Time   Ingredients
Pasta 20min  {150 spaghetti, 30 sauce, 5 marjoram, 20 cheese}

菜肴:

Name  Prot.  Carb.  Fat  KCal
Pasta    x      x     x     x

我想获取食谱的成分和数量数据,查找其营养成分并对菜肴的数量求和 sheet。成分 sheet 看起来像:

Ingredient Prot.  Carb.  Fat KCal
Pasta         x      x     x    x
Marjoram      x      x     x    x

我知道如何从不同的 sheet 中获取行数据,如果成分和数量排列在两行中,每行在不同的列中,比如求和菜中的总蛋白质:

=ArrayFormula(SUM(LOOKUP(F5:K5;Ingredients!$B:$B00;Ingredients!$D:$D00)*((F6:K6)/100)))/E5

我遇到的问题是我想在一行中列出成分列表和使用的数量,例如 {150 意大利面、30 酱汁、5 马郁兰、20 奶酪}。我想让它一目了然。我尝试使用数组,但不知道如何让它工作。

我怎样才能最好地将数据安排在一行中并能够使用它来查找其他 sheet 上的数据?

理想情况下,您会以结构化形式为每个配方输入数据,例如成分数量 table,然后 以可读形式显示使用 join 或类似的数据中的文本字符串。一般的想法是,结构化数据应该是信息的来源,而为人类消费而展示的东西是从中派生出来的。

但如果您坚持使用“150 份意大利面条、30 份酱汁、5 份马郁兰、20 份奶酪”等字符串作为信息来源,这里有一种方法可以根据它们计算营养成分。

假设A:B是一种成分-营养成分table,比如

Ingredient  Protein
spaghetti   2
sauce       4
eggs        10
cheese      6
marjoram    2

单元格 E2 有“150 份意大利面、30 份酱汁、5 份马郁兰、20 份奶酪”。以下公式计算此食谱中的蛋白质含量:

=sumproduct(
  vlookup(split(regexreplace(E2, "[\d\W]+", " "), " "), A:B, 2, 0), 
  split(regexreplace(E2, "\D+", " "), " ")
)

解释:

  • 第一个 split-regexreplace 组合从食谱中提取所有单词,方法是用 spaces 替换数字和标点符号,然后按 space 拆分。我们得到四个词的数组:spaghetti, sauce, marjoram, cheese
  • 然后,vlookup 查找蛋白质含量(范围 A:B 中的第 2 列)。如果您还有脂肪、卡路里、碳水化合物等,那么查找范围将为 A:E,要使用的列将为 2、3、4、5 之一。
  • 第二个 split-regexreplace 提取成分的数量,它从公式中删除不是数字的所有内容
  • sumproduct将这两个数组的乘积相加,计算总蛋白质含量。

由于基于正则表达式的文本解析,所有这些都是脆弱的,如果字符串偏离预期格式,就会中断;例如,如果食谱要求“1 1/2 table 勺糖”。在这种情况下,请参阅第一段。