1C и гугл таблицы: переношу многоуровневый текст из журнала операций в отдельный столбец

Раз уж заговорил об автоматизации работы с 1С в части гугл таблиц, то тут невозможно не затронуть тему спецсимволов и переноса текста по столбцам.

В экселе это все было просто. Спецсимволом Ctrl + j все прекрасно разбивалось:

excel текст по столбцам

Далее тот самый ctrl+j:

excel текст по столбцам со спецсимволом

и все это имело следующий вид:

результат применения спец символа

Что такое Ctrl+J?

Согласно таблице спецсимволов это перевод строки:

таблица спец символов

То же самое в Google sheets

Вот так же просто через Данные — Разделить текст на столбцы… не работает

гугл таблицы текст по столбцам

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

(Если у вас получится сделать — напишите в комментариях — как — буду очень благодарен)

Посмотрим что внутри?

Итак, имею этот же столбец в гугл таблицах:

изначальный вставленный вариант

Переношу его в массив и смотрю на содержимое:

function get1CRangeToFormat() {
  const rowToFormat = 1
  const initialArr = ws.getRange(1, rowToFormat, ws.getLastRow()).getValues();
  console.log(initialArr)
  
  const formattedArr = initialArr.map(row => row[0].split('\n'))
  
  console.log(formattedArr)

  return formattedArr
}

Получаю в логгере следующее по initialArr:

массив в скриптах

где абсолютно четко вижу тот самый спецсимвол перевода строки \n

Дальше, через map создаю форматированный массив, который разбивает каждый нулевой элемент вложенного массива (потому что это строка) по правилу — initialArr.map(row => row[0].split('\n')), получая следующую картину:

форматированный массив в скриптах

Теперь у меня каждый элемент — на своем разделенном месте.

Однако, если присмотреться, то длина вложенных массивов — разная и в таком случае подобный объект невозможно вставить обратно в гугл таблицу.

Приведение всех элементов к единой длине

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

function getMaxLength() {
  const incomingArr = get1CRangeToFormat();
  let maxLen = 0;

  for (let elem of incomingArr) {
    if (elem.length > maxLen) { maxLen = elem.length }
  }

  return maxLen
}

Решение универсальное и в данном случае вернет число 3. Но если ваша выгрузка содержит больше полей аналитики — то вернет именно их максимальное количество.

Предпоследний шаг — приведение к единообразию

У меня есть некий массив массивов с разными элементами по длине вложенных массивов. И есть понимание максимальной длины одного из вложенных массивов. Чтобы перенести все это в таблицу, надо чтобы все вложенные массивы имели одинаковую длину. В данном случае — максимальную.

Напомню, есть изначальный массив:

форматированный массив в скриптах

в котором есть элементы длиной 1 — Содержание или пустые строки,

и есть элементы длиной 3 — Оплата, сумма, НДС

Надо привести все элементы к одной длине:

function getClearArr() {
  const arrToBeautify= get1CRangeToFormat();
  const maxElemlen = getMaxLength();
  for (let elem of arrToBeautify) {

    if (elem.length == 1) {
      for (let i = 1; i < maxElemlen; i++) {
        elem.push("")
      }
    }
  }
  console.log(arrToBeautify)
  return arrToBeautify
}

Получаю приведенный массив для вставки:

итоговый массив для вставки

Последний шаг. Вставка массива в гугл таблицы

Тут всё просто:

function insertIntoGS() {
  const formattedArr = getClearArr();
  ws.getRange(1, 2, formattedArr.length, formattedArr[0].length).setValues(formattedArr);
}

И в результате получаю:

текст по столбцам со спец символом

по сути повторив Текст по столбцам из Экселя, но оставив еще и изначальный столбец для истории.

Добавить комментарий