自定义 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];
如果我误解了你的问题,我很抱歉。
我目前正在尝试为 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]
oftotal = 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];
如果我误解了你的问题,我很抱歉。