Пользовательская функция суммы в зависимости от значений в строке

240
02 июня 2018, 23:50

Функция перебрает масив.

Условия:

  1. Проверка счета на совпадение, если совпадают и поле ФИО заполнено напротив двух совпадающих счетов количество выездов плюсуются.
  2. Если совпадают счета но поле ФИО заполнено напротив одного, то выводит количество выездов напротив заполненного ФИО.
  3. Если не совпадают и поле ФИО заполнено выводит кол-во выездов.
  4. И если не заполнено ФИО и счет дублируется/не дублируется то Вывод 0

Ниже вариант, но никак не могу разобраться, как корректно записать данные в Таблицу

function departure() {
  function convertToSimpleArray(array){
    var res=[];
    for (var i=0; i<array.length; i++)
     if (!Array.isArray(array[i]))
      res.push(array[i]);
     else
      res=res.concat(convertToSimpleArray(array[i]));
     return res;}
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var invoices = sheet.getRange("B2:B14").getValues();
  var surnames = sheet.getRange("C2:C14").getValues();
  var qts = sheet.getRange("D2:D14").getValues();
  var invoice = convertToSimpleArray(invoices);
  var surname = convertToSimpleArray(surnames);
  var qt = convertToSimpleArray(qts);
  for (var i = 0; i < invoice.length; i++) {
   var numberOfqt = 0;
   for (var j = 0; j < invoice.length; j++) {
    if (invoice[i] == invoice[j]  && surname[j] != null && i != j ) 
     numberOfqt += parseInt(qt[j]);
    if (invoice[i] != invoice[j] && surname[j] != null) 
     return qt[j];
   }
    return numberOfqt;
  }

На выходе пытаюсь получить это:

Answer 1

Необходимо оперделиться с точкой входа. Пользовательские формулы требуют данных на входе. Не советую использовать getValues и все такое.

/**
 * Выводит что-то
 *
 * @param {Range} scheta - Колонка счетов.
 * @param {Range} fios - Колонка ФИО.
 * @param {Range} vizovy - Колонка вызовов.
 * @param {Number} row - Вывести для конкретной строки.
 * @return что надо.
 * @customfunction
 */
function departure(scheta, fios, vizovy, row) {
  try {
    if (!((scheta.length == fios.length) == (vizovy.length == fios.length)))
      return '#SIZEOF';
    var stack = {};
    for (var i = 0; i < scheta.length; i++) {
      var schet = ("" + scheta[i][0]) !== "" ? scheta[i][0] : "undefined";
      if (!stack.hasOwnProperty(schet)) {
        stack[schet] = {
          once: true,
          sumFio: 0,
          sumEmpty: 0,
          hasFio: false,
        };
      } else {
        stack[schet].once = false;
      }
      if (fios[i][0]) {
        stack[schet].sumFio += vizovy[i][0];
        stack[schet].hasFio = true;
      } else {
        stack[schet].sumEmpty += vizovy[i][0];
      }
    }
    if (row && row > 0) {
      var schet_ = ("" + scheta[row - 1][0]) !== "" ? 
        scheta[row - 1][0] : "undefined";
      return stack[schet_].hasFio ? stack[schet_].sumFio : 0;
    }
    var res = [];
    for (var i = 0; i < scheta.length; i++) {
      var row = [];
      var schet = ("" + scheta[i][0]) !== "" ? scheta[i][0] : "undefined";
      var item =
        stack[schet].hasFio ? stack[schet].sumFio : 0;
      row.push(item);
      res.push(row);
    }
    return res;
  } catch (err) {
    return err.message;
  }
}

Для следующих данных

  • =departure(A2:A13,B2:B13,C2:C13) вернет расчет для всего массива
  • =departure(A2:A13,B2:B13,C2:C13, 1) вернет расчет для строки 1 и указанного массива

Скопировать файл с решением

READ ALSO
Ajax with class js

Ajax with class js

Есть класс в котором нужно инициализировать переменные, что естьДоступ к этим переменным идет через json файл, но в таком случае выдает undefined,...

196
“Добавить точку” к маршруту в routePanel

“Добавить точку” к маршруту в routePanel

Как можно добавить кнопку "Добавить точку" как на скрине?

164
Как связать contenteditable блок с переменной (Vue)

Как связать contenteditable блок с переменной (Vue)

Как связать блок с contenteditable с переменной используя vue?

181