Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Плоский список из 2х этажной таблицы - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
Плоский список из 2х этажной таблицы
yurakhl Дата: Среда, 14.08.2024, 17:10 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 28
Репутация: 0 ±
Замечаний: 0% ±

2021
друзья!
Есть гугл таблица - https://docs.google.com/spreads....0#gid=0
"сырые" данные у нас на листе data
на нем таблица с 2х-ярусной шапкой

Задача такая - сделать "плоский" список, который выводит данные в "плоском виде", т.е. где поцессы СА и пр отображаются в строках а не в столбцах
Образец того что хочу отобразил на листе "что хочу"

Нашел на просторах интернета скрипт, который делает примерно то что нужно и выгружает на лист flat, но он сам по себе довольно сложный, особенно с 21 строки. Он работает, но дату начала и конца пишет в 1 колонку, а в следующих столбцах пишет вообще непонятно по какому принципу другие данные

Помогите разобраться, особенно с 21 строки)

спасибо


Сообщение отредактировал yurakhl - Среда, 14.08.2024, 17:11
 
Ответить
Сообщениедрузья!
Есть гугл таблица - https://docs.google.com/spreads....0#gid=0
"сырые" данные у нас на листе data
на нем таблица с 2х-ярусной шапкой

Задача такая - сделать "плоский" список, который выводит данные в "плоском виде", т.е. где поцессы СА и пр отображаются в строках а не в столбцах
Образец того что хочу отобразил на листе "что хочу"

Нашел на просторах интернета скрипт, который делает примерно то что нужно и выгружает на лист flat, но он сам по себе довольно сложный, особенно с 21 строки. Он работает, но дату начала и конца пишет в 1 колонку, а в следующих столбцах пишет вообще непонятно по какому принципу другие данные

Помогите разобраться, особенно с 21 строки)

спасибо

Автор - yurakhl
Дата добавления - 14.08.2024 в 17:10
doober Дата: Четверг, 15.08.2024, 21:12 | Сообщение № 2
Группа: Друзья
Ранг: Ветеран
Сообщений: 970
Репутация: 331 ±
Замечаний: 0% ±

Excel 2010
Проставьте в первой строке заголовки столбцов[vba]
Код
function flatchart() {
  const srcSheetName = "data"; // This is the source sheet name.
  const dstSheetName = "flat"; // Please set the destination sheet name.
  let out = [];
  Object.prototype.get1stNonEmptyRowFromBottom = function (columnNumber, offsetRow = 1) {
    const search = this.getRange(offsetRow, columnNumber, this.getMaxRows()).createTextFinder(".").useRegularExpression(true).findPrevious();
    return search ? search.getRow() : offsetRow;
  };
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const srcSheet = ss.getSheetByName(srcSheetName);
  const lastRow = srcSheet.get1stNonEmptyRowFromBottom(1);
  const [[, , , ...header1], ...srcValues] = srcSheet.getRange("A1:AG" + lastRow).getValues();
  for (var i = 1; i < srcValues.length; i++) {
    for (var c = 3; c < srcValues[0].length - 1; c++) {
      let x = [];
      x.push(srcValues[i][0])
      x.push(srcValues[i][1])
      x.push(srcValues[i][2])
      x.push(header1[c - 3])
      x.push(srcValues[i][c])
      x.push(srcValues[i][c + 1])
      c++;
      out.push(x)
    }
  }
  const dstSheet = ss.getSheetByName(dstSheetName);
  dstSheet.getRange(dstSheet.getLastRow() + 1, 1, out.length, out[0].length).setValues(out);
}
[/vba]




Сообщение отредактировал doober - Пятница, 16.08.2024, 00:47
 
Ответить
СообщениеПроставьте в первой строке заголовки столбцов[vba]
Код
function flatchart() {
  const srcSheetName = "data"; // This is the source sheet name.
  const dstSheetName = "flat"; // Please set the destination sheet name.
  let out = [];
  Object.prototype.get1stNonEmptyRowFromBottom = function (columnNumber, offsetRow = 1) {
    const search = this.getRange(offsetRow, columnNumber, this.getMaxRows()).createTextFinder(".").useRegularExpression(true).findPrevious();
    return search ? search.getRow() : offsetRow;
  };
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const srcSheet = ss.getSheetByName(srcSheetName);
  const lastRow = srcSheet.get1stNonEmptyRowFromBottom(1);
  const [[, , , ...header1], ...srcValues] = srcSheet.getRange("A1:AG" + lastRow).getValues();
  for (var i = 1; i < srcValues.length; i++) {
    for (var c = 3; c < srcValues[0].length - 1; c++) {
      let x = [];
      x.push(srcValues[i][0])
      x.push(srcValues[i][1])
      x.push(srcValues[i][2])
      x.push(header1[c - 3])
      x.push(srcValues[i][c])
      x.push(srcValues[i][c + 1])
      c++;
      out.push(x)
    }
  }
  const dstSheet = ss.getSheetByName(dstSheetName);
  dstSheet.getRange(dstSheet.getLastRow() + 1, 1, out.length, out[0].length).setValues(out);
}
[/vba]

Автор - doober
Дата добавления - 15.08.2024 в 21:12
yurakhl Дата: Пятница, 16.08.2024, 09:17 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 28
Репутация: 0 ±
Замечаний: 0% ±

2021
Цитата
const [[, , , ...header1], ...srcValues] = srcSheet.getRange("A1:AG" + lastRow).getValues();
for (var i = 1; i < srcValues.length; i++) {
for (var c = 3; c < srcValues[0].length - 1; c++) {
let x = [];
x.push(srcValues[i][0])
x.push(srcValues[i][1])
x.push(srcValues[i][2])
x.push(header1[c - 3])
x.push(srcValues[i][c])
x.push(srcValues[i][c + 1])
c++;
out.push(x)
}


Спасибо! Работает как надо!

можете немного объяснить что происходит? Точнее я опишу что вижу а вы дайте свои комментарии

const [[, , , ...header1], ...srcValues] = srcSheet.getRange("A1:AG" + lastRow).getValues();

Делаем 3 пропуска (это именно помтоу что их в моей таблице 3 пустых? т.е. в теории если я колонку добавлю то надо 4 пропуска делать?), потом заголовок 1, потом уже искомые величины. Не могу понять почему дважды квадратные скобки использованы?
это массив это первая строка до последней строки вычисленной ранее в функции 1

Цитата
for (var i = 1; i < srcValues.length; i++) {
for (var c = 3; c < srcValues[0].length - 1; c++) {
let x = [];
x.push(srcValues[i][0])
x.push(srcValues[i][1])
x.push(srcValues[i][2])
x.push(header1[c - 3])
x.push(srcValues[i][c])
x.push(srcValues[i][c + 1])
c++;
out.push(x)
}


Делаем цикл по i от 1 и по С от 3
а какая конечная величина обеих переменных
т.е. i будет считать строки? а с - столбцы? или как?

и 6 строк кода обозначают 6 целевых столбцов?

Х - пустой массив
берем 3 ячайки - это 3 заголовка которые одноэтажные, т.е. ячейки А2, В2, С2.? и потом значения под ними
Потом берем заоголовек 1 минус 3, но переменная С у нас и так 3, поэтому просто берем заголовок 1, который у нас "верхний этаж"
Потом берем заголовки "нижнего этажа"с 3 строки, и все что под ними
и потом берем зачем то С+1, понять не могу зачем....

вроде как в итоге мы наполняем массив Х данными
и потом зачем то берем массив OUT и наполняем данными из Х ??? это действие понять не могу

дальше понятно копируем вставляем))))

И еще, как бы сделать скрипт более универсальным? т.е. у нас например 3 столбца одноэтажные, потом 5 2х-этажние?
или

2 столбца 1 этажные, потом 3 2 х этажные?

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


Сообщение отредактировал yurakhl - Пятница, 16.08.2024, 10:02
 
Ответить
Сообщение
Цитата
const [[, , , ...header1], ...srcValues] = srcSheet.getRange("A1:AG" + lastRow).getValues();
for (var i = 1; i < srcValues.length; i++) {
for (var c = 3; c < srcValues[0].length - 1; c++) {
let x = [];
x.push(srcValues[i][0])
x.push(srcValues[i][1])
x.push(srcValues[i][2])
x.push(header1[c - 3])
x.push(srcValues[i][c])
x.push(srcValues[i][c + 1])
c++;
out.push(x)
}


Спасибо! Работает как надо!

можете немного объяснить что происходит? Точнее я опишу что вижу а вы дайте свои комментарии

const [[, , , ...header1], ...srcValues] = srcSheet.getRange("A1:AG" + lastRow).getValues();

Делаем 3 пропуска (это именно помтоу что их в моей таблице 3 пустых? т.е. в теории если я колонку добавлю то надо 4 пропуска делать?), потом заголовок 1, потом уже искомые величины. Не могу понять почему дважды квадратные скобки использованы?
это массив это первая строка до последней строки вычисленной ранее в функции 1

Цитата
for (var i = 1; i < srcValues.length; i++) {
for (var c = 3; c < srcValues[0].length - 1; c++) {
let x = [];
x.push(srcValues[i][0])
x.push(srcValues[i][1])
x.push(srcValues[i][2])
x.push(header1[c - 3])
x.push(srcValues[i][c])
x.push(srcValues[i][c + 1])
c++;
out.push(x)
}


Делаем цикл по i от 1 и по С от 3
а какая конечная величина обеих переменных
т.е. i будет считать строки? а с - столбцы? или как?

и 6 строк кода обозначают 6 целевых столбцов?

Х - пустой массив
берем 3 ячайки - это 3 заголовка которые одноэтажные, т.е. ячейки А2, В2, С2.? и потом значения под ними
Потом берем заоголовек 1 минус 3, но переменная С у нас и так 3, поэтому просто берем заголовок 1, который у нас "верхний этаж"
Потом берем заголовки "нижнего этажа"с 3 строки, и все что под ними
и потом берем зачем то С+1, понять не могу зачем....

вроде как в итоге мы наполняем массив Х данными
и потом зачем то берем массив OUT и наполняем данными из Х ??? это действие понять не могу

дальше понятно копируем вставляем))))

И еще, как бы сделать скрипт более универсальным? т.е. у нас например 3 столбца одноэтажные, потом 5 2х-этажние?
или

2 столбца 1 этажные, потом 3 2 х этажные?

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

Автор - yurakhl
Дата добавления - 16.08.2024 в 09:17
doober Дата: Пятница, 16.08.2024, 18:22 | Сообщение № 4
Группа: Друзья
Ранг: Ветеран
Сообщений: 970
Репутация: 331 ±
Замечаний: 0% ±

Excel 2010
Делаем 3 пропуска (это именно помтоу что их в моей таблице 3 пустых?
Да.
Массив.
а какая конечная величина обеих переменных
srcValues.length и srcValues[0].length
и потом зачем то берем массив OUT и наполняем данными из Х ??? это действие понять не могу
OUT-это выходной массив, Х-это массив строки
и потом берем зачем то С+1, понять не могу зачем
Для вывода Дата конца


 
Ответить
Сообщение
Делаем 3 пропуска (это именно помтоу что их в моей таблице 3 пустых?
Да.
Массив.
а какая конечная величина обеих переменных
srcValues.length и srcValues[0].length
и потом зачем то берем массив OUT и наполняем данными из Х ??? это действие понять не могу
OUT-это выходной массив, Х-это массив строки
и потом берем зачем то С+1, понять не могу зачем
Для вывода Дата конца

Автор - doober
Дата добавления - 16.08.2024 в 18:22
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!