Раз уж заговорил об автоматизации работы с 1С в части гугл таблиц, то тут невозможно не затронуть тему спецсимволов и переноса текста по столбцам.
В экселе это все было просто. Спецсимволом Ctrl + j все прекрасно разбивалось:
Далее тот самый ctrl+j:
и все это имело следующий вид:
Что такое 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);
}
И в результате получаю:
по сути повторив Текст по столбцам из Экселя, но оставив еще и изначальный столбец для истории.