Пользовательская функция Google Sheets для нахождения промежуточной суммы - PullRequest
0 голосов
/ 28 апреля 2018

В настоящее время я пытаюсь написать пользовательскую функцию для листов 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 (и никогда не выдает ошибку), и я достиг своих пределов отладочной способности.

Где в этом коде я ошибаюсь? Или есть лучший подход к этой проблеме? Можно ли это сделать без пользовательских функций?

1 Ответ

0 голосов
/ 28 апреля 2018

Как насчет этой модификации?

Точка модификации:

  • Я думаю, что причиной ошибки является range[position] из total = total + range[position]. Потому что когда значения 10,12,14,15,18, 3, 8, 9 установлены в A1:A8, range, заданный =SUBTOTALPOSITION(A1:A8, 100), равен [[10.0], [12.0], [14.0], [15.0], [18.0], [3.0], [8.0], [9.0]]. Это 2-х мерный массив. 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];

Если я неправильно понял ваш вопрос, извините.

...