将成分数量数据排列在一行中,以便在别处检索
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 勺糖”。在这种情况下,请参阅第一段。
我想在 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 勺糖”。在这种情况下,请参阅第一段。