Google sheets 带“求和”和“选择”的数组公式

Google sheets 带“求和”和“选择”的数组公式,google-sheets,array-formulas,Google Sheets,Array Formulas,我有一组值,例如: 14 ; 17 ; 12 ; 14 ; 12 ; 8 您可能会识别出一组DnD能力分数。我想计算用于这些的创建点的数量 所以我想结合总和和选择。我试过这个(和我的工作文库表一样): 我期望25(5+13+2+5+2-2),得到5。出于某种原因,它会在第一个值之后立即停止,而不进行任何求和。不幸的是,有些函数不适用于ArrayFormulae,CHOOSE似乎是其中之一 不幸的是,索引也没有,但VLookup有,所以我们必须创建这个怪物: =ArrayFormula(SUM(

我有一组值,例如:

14 ; 17 ; 12 ; 14 ; 12 ; 8
您可能会识别出一组DnD能力分数。我想计算用于这些的创建点的数量

所以我想结合总和和选择。我试过这个(和我的工作文库表一样):


我期望25(5+13+2+5+2-2),得到5。出于某种原因,它会在第一个值之后立即停止,而不进行任何求和。

不幸的是,有些函数不适用于ArrayFormulae,CHOOSE似乎是其中之一

不幸的是,索引也没有,但VLookup有,所以我们必须创建这个怪物:

=ArrayFormula(SUM(VLOOKUP(
  $C$9:$C$14 - 6, 
  {1, -4;
   2, -2;
   3, -1;
   4, 0;
   5, 1;
   6, 2;
   7, 3;
   8, 5;
   9, 7;
   10, 10;
   11, 13;
   12, 17}, 2)))
如果您有空间创建可以引用的表,那么公式当然会简单得多

另一种方法是自定义函数:

function abilityScoreCost(scores) {
  var costs = {
    7:  -4,
    8:  -2,
    9:  -1,
    10: 0,
    11: 1,
    12: 2,
    13: 3,
    14: 5,
    15: 7,
    16: 10,
    17: 13,
    18: 17
  }
  return scores
      .map(function (score) {
        return costs[score];
      }).reduce(function (x,y) {
        return x + y;
      });
}

然后您可以使用
=abilityScoreCost(C9:C14)

调用它。为了清楚起见,+Robin Gertenbach的回答比这更直观,但这要短一些:


=ArrayFormula(SUM(HLOOKUP(-4,{-4;-2;-1;0;1;2;3;5;7;10;13;17},C9:C14-6))

这确实是一个有效的解决方案,但我宁愿避免将我的数据到处传播。谢谢你,这将是我的退路。气体功能怎么样?不是更优雅,而是一个更简单的公式。HLOOKUP的第一个参数必须是查找数组中的第一个元素,在本例中为-4。因此,该值将始终“找到”在单列数组的顶部。“变量”在第三个参数中表示,它规定返回哪个行号。我明白了,聪明。我想我会用这个。我非常喜欢你。
function abilityScoreCost(scores) {
  var costs = {
    7:  -4,
    8:  -2,
    9:  -1,
    10: 0,
    11: 1,
    12: 2,
    13: 3,
    14: 5,
    15: 7,
    16: 10,
    17: 13,
    18: 17
  }
  return scores
      .map(function (score) {
        return costs[score];
      }).reduce(function (x,y) {
        return x + y;
      });
}