Пользовательская функция, используемая в функции массива листов Google, неправильно обновляет значения - PullRequest
1 голос
/ 28 февраля 2020

Я новичок в скрипте Google. Я пытаюсь написать пользовательскую функцию, которая работает с формулой массива в листах Google. Моя реализация не возвращает рассчитанное значение. Моя цель - предоставить обновленный расчет для данных, собранных в форме Google.

В двух словах, я хочу умножить число на сумму, основанную на пороге, основанном на типе. например, множитель будет применяться только для суммы, превышающей пороговое значение.

Используя следующий лист Google

count, category, amount 
2, a_type,=arrayformula(amount_calc(a2:a, b2:b, 25)) 
4, b_type, 
7, a_type, 
5, c_type,

Я хочу получить следующий результат, используя формулу массива

2, a_type, 0  //threshold: count>2
4, b_type, 75 //threshold: count>1
4, a_type, 50 //threshold: count>2
5, c_type, 25 //threshold: count>4

Я написал функцию "amount_cal c"

function amount_calc(count, cat, multiplier) {
  var amount=0
  if(cat=="a_type" && count > 2) {
    amount=(count - 2) * multiplier   
  } else if(cat=="a_type" && count <= 2) {
    amount=0
  }  
  if(cat=="b_type" && count > 1) {
    amount=(count - 2) * multiplier   
  } else if(cat=="b_type" && count <= 1) {
    amount=0
  } 
  if(cat=="c_type" && count > 4) {
    amount=(count - 4) * multiplier   
  } else if(cat=="b_type" && count <= 4) {
    amount=0
  } 
  return amount
}

Собственная пользовательская функция, как написано, дает следующий результат в листе Google

2, a_type, 0  
4, b_type, 0 
4, a_type, 0 
5, c_type, 0 

Из того, что я могу назначения в операторах if не обновляют глобальную переменную "amount"

Альтернативно, я неудачно попытался собрать результаты в массиве количества следующим образом

function amount_calc(count, cat, multiplier) {
  var amount=[]
  for (var i=0; i<count.length; i++ {
       if(cat=="a_type" && num > 2) {
    amount.push[i]((count - 2) * multiplier)    
  } else if(cat=="a_type" && count <= 2) {
    amount.push[i](0)
  }  
  if(cat=="b_type" && num > 1) {
    amount.push[i]((count - 1) * multiplier)    
  } else if(cat=="b_type" && count <= 1 {
            amount.push[i](0)
    } 
    if(cat=="c_type" && num > 4) {
      amount.push[i](count - 4) * multiplier) 
    } else if(cat=="b_type" && count <= 4 {
              amount.push[i](0)
      } 
      return amount
}

Результат ошибка «Превышено максимальное время выполнения (строка 0)».

Очевидно, я не понимаю функцию формулы массива. Я ошибаюсь, думая, что это итерация функции в каждой строке? Почему глобальная переменная «сумма» не обновляется операторами if. Любая помощь или разъяснения будут оценены. Спасибо, Кенни

1 Ответ

1 голос
/ 28 февраля 2020

Поток:

  • Создание карты Object типов: {type: threshold}
  • Использование Array.map для итерации строки и столбцы 1

Пример сценария:

/**
 * @param {number[][]} counts
 * @param {string[][]} types
 * @param {number} multiplier
 */
function amountcl(counts, types, multiplier) {
  const typeCfg = { a_type: 2, b_type: 1, c_type: 4 };
  return counts.map((row, i) =>
    row.map((count, j) => {
      let diff = count - typeCfg[types[i][j]];
      return diff > 0 ? diff * multiplier : 0;
    })
  );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...