В настоящее время я пытаюсь написать пользовательскую функцию для листов Google, которая, учитывая одномерный диапазон, сообщает мне, где в этом диапазоне совокупная сумма достигает (или превосходит) данную сумму, или выдает ошибку, если накопительная сумма никогда не достигает заданной суммы.
В качестве примера приведем такой диапазон:
10
12
14
15
18
3
8
9
Если запрашиваемая сумма равна «24», функция вернет 3.
Если запрошенная сумма равна "60", функция вернет 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';
}
Я достиг точки, когда она дает мне позицию, но не правильную. Если я даю сумму, равную или меньшую, чем первое число в диапазоне, оно корректно возвращает 1, но любое другое заданное число всегда возвращает 2 (и никогда не выдает ошибку), и я достиг своих пределов отладочной способности.
Где в этом коде я ошибаюсь? Или есть лучший подход к этой проблеме? Можно ли это сделать без пользовательских функций?