自定义 Google 工作表函数查找小计位置

Custom Google Sheets function to find position of subtotal

我目前正在尝试为 google 工作表编写一个自定义函数,在给定一维范围的情况下,它会告诉我在该范围内累计总和达到(或超过)给定总和的位置,或者如果累计总和从未达到给定的总数,则抛出错误。

例如,给定如下范围:

10
12
14
15
18
 3
 8
 9

如果请求的总和为“24”,函数将 return 3.

如果请求的总和是“60”,函数将return 5.

如果请求的总和为“1000”,函数将抛出错误。

我目前卡住的代码是:

function SUBTOTALPOSITION(range,sum)
{
 /**
 * Finds the position in a one-dimensional range where
 * the cumulative sum reaches the requested subtotal
 *
 * @range The range being searched (1-dimensional range only)
 * @sum The cumulative sum being searched for
 * @customfunction
 */
  if((range.length > 1) && (range[0].length > 1))
  {
    throw 'range is multi-dimensional';
  }

  var position = 0;
  var total = 0;
  while(position < range.length)
  {
    total = total + range[position];
    position++;

    if(total >= sum)
    {
      return position;
    }
  }
  throw 'Sum not reached';
}

我已经达到了它给了我 a 位置的地步,但不是正确的位置。如果我给出的总和等于或小于该范围内的第一个数字,它正确地 returns 1,但给出的任何其他数字总是 returns 2(并且永远不会抛出错误),并且我已经达到我调试能力的极限了。

这段代码哪里出错了?还是有更好的方法来解决这个问题?这可以不用自定义函数来完成吗?

这个修改怎么样?

修改点:

  • 我认为错误的原因是 range[position] of total = total + range[position]。因为当10,12,14,15,18, 3, 8, 9的值放到A1:A8时,=SUBTOTALPOSITION(A1:A8, 100)给出的range就是[[10.0], [12.0], [14.0], [15.0], [18.0], [3.0], [8.0], [9.0]]。这是二维数组。 range[position] 是一个对象。所以在这种情况下,当 total = total + range[position] 是 运行 时, total 被用作字符串。这样,数组的每个元素都被加起来为0101214...这样的字符串。结果,当sum为1000时,total在第二次循环时变为01012,而total >= sum变为true。所以返回2。

为了解决这个问题,请修改如下。

发件人:

total = total + range[position];

收件人:

total = total + range[position][0];

total += range[position][0];

如果我误解了你的问题,我很抱歉。