Нарисовать таблицу с динамическим объединением ячеек в первом и втором столбце

Всем доброго дня!

Недавно задавал вопрос по поводу подсчета строк с идущими друг за другом одинаковыми элементами вот этого массива с вложенными массивами строк (фрагмент ниже). Массив уже отсортирован по нулевым и потом первым элементам вложенных массивов.

    ["02.01.01.02.Формирование программы","Ответственный за формирование Программы ","Формирование/ Корректировка  Программы ","Исполнитель"],
    ["02.01.01.02. Формирование программы","Ответственный за формирование Программы","Проведение совещания по рассмотрению и утверждению Программы","Консультант"],
    ["02.01.01.04. Корректировка годовой инвестиционной программы","Куратор статьи ИП","Формирование комментариев  по отклонениям ИП","Исполнитель"],
    ["02.01.01.05. Разработка квартальных инвестиционных программ","Куратор статьи ИП","Формирование плана на  следующий квартал","Исполнитель"],
    ["02.01.01.05. Разработка квартальных инвестиционных программ","Куратор статьи ИП","Консолидация проекта  квартального плана","Консультант"],
    ["02.01.02.02. Мониторинг инвестиционной программы","Куратор статьи ИП","Проведение  ежеквартального мониторинга","Консультант"],
    ["02.01.02.02. Мониторинг инвестиционной программы","Куратор статьи ИП","Формирование месячного отчета по  фактическому исполнению  по направлению","Исполнитель"],
    ["02.01.02.02. Мониторинг инвестиционной программы","Куратор статьи ИП","Проведение анализа  изменений лимитов инвестиций","Консультант"],
    ["02.01.02.02. Мониторинг инвестиционной программы","Куратор статьи ИП","Проведение анализа  изменения объемных  показателей за год","Консультант"]];```

Полученные ответы помогли продвинуться и подойти вплотную к задаче вывода этой таблицы. Но сижу с этой задачей уже 3й день и пока смог добиться только динамического объединения ячеек 1м столбце. И пока не могу придумать, как объединять еще и ячейки во втором столбце. Под "динамическим" имею ввиду,что количество объединяемых ячеек рассчитывается в момент формирования таблицы.
Итак, есть вышеупомянутый массив с вложенными массивами строк. Нулевые и первые элементы вложенных массивов могут быть одинаковыми в случайном порядке. Когда одинаковые элементы выводятся в таблицу, их надо объединять. Чтобы получилась таблица вида

[![Пример таблицы для последних 4х строк массива][1]][1]
  [1]: https://i.stack.imgur.com/5lVwy.jpg

Т.к. я пока еще не настоящий программист, то с алгоритмами у меня слабо. Плюс накладывает ограничения то, что отчет делается не для веба, а как бы на внутреннем скриптовом языке спецсофта, соответствующего требованиям ES4. Таблицы тоже формируются своеобразно, могу ошибаться но в html логика немного другая по-моему.
Вот фрагмент статичного кода, который формирует таблицу как на картинке выше (1я цифра, которая в скобках идет после строковой части, отвечает за количество объединяемых ячеек).
oO.TableRow();
//peaceOfBigArr[5][0]
oO.TableCell("02.01.02.02. Мониторинг инвестиционной программы (квартал/год/месяц)",4,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);   
//peaceOfBigArr[5][1]
oO.TableCell("Куратор статьи AAA",2,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
//peaceOfBigArr[5][3]
oO.TableCell("Проведение  ежеквартального мониторинга  фактического исполнения ИП",1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
//peaceOfBigArr[5][4]
oO.TableCell("Консультант",1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0); 
        oO.TableRow();
        //peaceOfBigArr[6][3]
        oO.TableCell("Формирование месячного/  квартального отчета по  фактическому исполнению  по направлению",1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
        //peaceOfBigArr[6][4]
        oO.TableCell("Исполнитель",1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
oO.TableRow();
//peaceOfBigArr[7][1]
oO.TableCell("Куратор статьи BBB",2,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
//peaceOfBigArr[7][3]
oO.TableCell("Проведение анализа  изменений лимитов инвестиций",1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
//peaceOfBigArr[7][4]
oO.TableCell("Исполнитель",1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
        oO.TableRow();
        //peaceOfBigArr[8][3]
        oO.TableCell("Проведение анализа  изменения объемных  показателей за год",1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);                      
        //peaceOfBigArr[8][4]
        oO.TableCell("Консультант",1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);     ```

У меня алгоритм планировался укрупненно такой:

  1. Прогоняю по всему массиву функцию, которая считает количество строк, с одинаковыми нулевыми элементами. Получаю новый массив с длинами "серий".
  2. Отрезаю в минимассив от большого массива количество строк, равных длине первой серии.
  3. Прогоняю по нему функцию подсчета серий по первым элементам вложенных массивов (пока не использую этот шаг).
  4. Вывожу в таблицу минимассив с объединенными первыми ячейками ("Вывожу" в данном случае - в память. Окончательно в файл все пишется когда в памяти сформирована вся таблица. Это механизм вывода такой в ПО реализован.)
  5. Беру следующий элемент из массива со счетчиками серий нулевых элементов, отрезаю кусок от большого массива и т.п. на рекурсию не заморачиваюсь, просто в цикле бы реализовать все сначала.

В целом все работает, за исключением того, что я пока не придумал как внутрь кода, который выводит таблицу с объединенными ячейками 1го столбца увязать еще код, объединяющий ячейки 2го столбца. Сломал всю голову уже. Идея где-то рядом, но не могу ухватить. Надеюсь рассказал все понятно. Ну и напоследок работающий фрагмент кода, которые сейчас выводит таблицу с объединенными ячейками 1го столбца:

var countBpArray = count(bigArray,0);
    //Dialogs.MsgBox(countBpArray.join("\n"));
    for (var i=0; i<countBpArray.length; i++){
        var peaceOfBigArr = bigArray.splice(0,countBpArray[i]);
        oO.TableRow();
        oO.TableCell(peaceOfBigArr[0][0],countBpArray[i],1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
        oO.TableCell(peaceOfBigArr[0][1],1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
        oO.TableCell(peaceOfBigArr[0][3],1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
        oO.TableCell(peaceOfBigArr[0][4],1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
        if (countBpArray[i]>1){
            for (var j=1;j<countBpArray[i];j++){
                oO.TableRow();
                oO.TableCell(peaceOfBigArr[j][1],1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
                oO.TableCell(peaceOfBigArr[j][3],1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
                oO.TableCell(peaceOfBigArr[j][4],1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
            }
        }
    }
oO.EndTable("",100,"Times New Roman",12,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);

Ответы (0 шт):