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

Вход

Регистрация

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

 

= Мир MS Excel/Как исправить скрипт для копирования из сводной таблицы? - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
Как исправить скрипт для копирования из сводной таблицы?
-marusa122- Дата: Четверг, 03.08.2023, 17:13 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

2019
Здравствуйте.
Пытаюсь сделать скрипт для копирования данных из сводной таблицы Google Sheets в нужном формате.
Сводная таблица, из которой нужно копировать, находится на листе Статистика - https://docs.google.com/spreads....ve_link
Проблемный скрипт - function copyFormattedData()
Если скопировать без скрипта все ячейки сводной таблицы с заголовками:
[vba]
Код
Дата    Клиент1    Клиент2    Клиент3    Итого
01.01.2023    1/1    1/1  2/2
02.01.2023    1/1    1/0    1/1    3/2
03.01.2023    2/2    1/0    2/1    5/3
[/vba]
При вызове скрипта copyFormattedData (кнопка Копировать) в появившейся форме для копирования предлагается такой текст:
[vba]
Код
01.01  1/1,  1/1,  2/2
02.01  1/1,  1/0,  1/1,  3/2
03.01  2/2,  1/0,  2/1,  5/3
[/vba]
А должен быть такой:
[vba]
Код
01.01 Клиент1 1/1, Клиент2 1/1
02.01 Клиент1 1/1, Клиент2 1/0, Клиент3 1/1
03.01 Клиент1 2/2, Клиент2 1/0, Клиент3 2/1
[/vba]
Как исправить скрипт так, чтобы при копировании перед значениями вставлялись соответствующие им имена столбцов?
И второй вопрос: как сделать так, чтобы форматирование применялось только к выделенным строкам? Сейчас скрипт пытается отформатировать все строки в сводной таблице, какой бы диапазон ячеек я ни выбрала.


Сообщение отредактировал -marusa122- - Четверг, 03.08.2023, 17:14
 
Ответить
СообщениеЗдравствуйте.
Пытаюсь сделать скрипт для копирования данных из сводной таблицы Google Sheets в нужном формате.
Сводная таблица, из которой нужно копировать, находится на листе Статистика - https://docs.google.com/spreads....ve_link
Проблемный скрипт - function copyFormattedData()
Если скопировать без скрипта все ячейки сводной таблицы с заголовками:
[vba]
Код
Дата    Клиент1    Клиент2    Клиент3    Итого
01.01.2023    1/1    1/1  2/2
02.01.2023    1/1    1/0    1/1    3/2
03.01.2023    2/2    1/0    2/1    5/3
[/vba]
При вызове скрипта copyFormattedData (кнопка Копировать) в появившейся форме для копирования предлагается такой текст:
[vba]
Код
01.01  1/1,  1/1,  2/2
02.01  1/1,  1/0,  1/1,  3/2
03.01  2/2,  1/0,  2/1,  5/3
[/vba]
А должен быть такой:
[vba]
Код
01.01 Клиент1 1/1, Клиент2 1/1
02.01 Клиент1 1/1, Клиент2 1/0, Клиент3 1/1
03.01 Клиент1 2/2, Клиент2 1/0, Клиент3 2/1
[/vba]
Как исправить скрипт так, чтобы при копировании перед значениями вставлялись соответствующие им имена столбцов?
И второй вопрос: как сделать так, чтобы форматирование применялось только к выделенным строкам? Сейчас скрипт пытается отформатировать все строки в сводной таблице, какой бы диапазон ячеек я ни выбрала.

Автор - -marusa122-
Дата добавления - 03.08.2023 в 17:13
Gustav Дата: Пятница, 04.08.2023, 03:39 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2763
Репутация: 1140 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
А должен быть такой:
01.01 Клиент1 1/1, Клиент2 1/1
02.01 Клиент1 1/1, Клиент2 1/0, Клиент3 1/1
03.01 Клиент1 2/2, Клиент2 1/0, Клиент3 2/1

Чтобы был такой - в двух соседних строках:
[vba]
Код
    for (var j = 1; j < sourceData[i].length; j++) {
      var srm = sourceData[1][j]; // Get the SRM name from the second row
[/vba]делаем такие изменения: в 1-й добавляем -1 к length, во 2-й меняем индекс [1] на [3]:
[vba]
Код
    for (var j = 1; j < sourceData[i].length-1; j++) {
      var srm = sourceData[3][j]; // Get the SRM name from the second row
[/vba]
А табличка симпатичная, мне понравилась. Прямо HTML-формочки, все дела! specool


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
А должен быть такой:
01.01 Клиент1 1/1, Клиент2 1/1
02.01 Клиент1 1/1, Клиент2 1/0, Клиент3 1/1
03.01 Клиент1 2/2, Клиент2 1/0, Клиент3 2/1

Чтобы был такой - в двух соседних строках:
[vba]
Код
    for (var j = 1; j < sourceData[i].length; j++) {
      var srm = sourceData[1][j]; // Get the SRM name from the second row
[/vba]делаем такие изменения: в 1-й добавляем -1 к length, во 2-й меняем индекс [1] на [3]:
[vba]
Код
    for (var j = 1; j < sourceData[i].length-1; j++) {
      var srm = sourceData[3][j]; // Get the SRM name from the second row
[/vba]
А табличка симпатичная, мне понравилась. Прямо HTML-формочки, все дела! specool

Автор - Gustav
Дата добавления - 04.08.2023 в 03:39
-marusa122- Дата: Пятница, 04.08.2023, 09:17 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

2019
Gustav, спасибо, тут исправила. Но остается вторая проблема - скрипт пытается копировать всю сводную таблицу. Даже если я с помощью среза оставлю одну строку или выделю ячейку вне таблицы, он все равно показывает все строки. Нужно, чтобы он предлагал для копирования только те строки сводной таблицы, которые выделил пользователь (если в сводной таблице 20 строк, а выделено 5 - в форме должны показываться только эти 5 строк)


Сообщение отредактировал -marusa122- - Пятница, 04.08.2023, 09:56
 
Ответить
СообщениеGustav, спасибо, тут исправила. Но остается вторая проблема - скрипт пытается копировать всю сводную таблицу. Даже если я с помощью среза оставлю одну строку или выделю ячейку вне таблицы, он все равно показывает все строки. Нужно, чтобы он предлагал для копирования только те строки сводной таблицы, которые выделил пользователь (если в сводной таблице 20 строк, а выделено 5 - в форме должны показываться только эти 5 строк)

Автор - -marusa122-
Дата добавления - 04.08.2023 в 09:17
Gustav Дата: Пятница, 04.08.2023, 12:54 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2763
Репутация: 1140 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
Нужно, чтобы он предлагал для копирования только те строки сводной таблицы, которые выделил пользователь

Наваял функцию получения выделенных строк, точнее, строк, проходящих через текущее выделение. Не обязательно выделять целые строки, достаточно выделить диапазон, содержащий более одной ячейки, и будут запомнены номера всех строк, затрагиваемых этим выделением (само собой, можно выделять несколько несмежных диапазонов):
[vba]
Код
// Функция получения номеров строк, пересекающих выделение
function getSelectedRows(sheet) {
  var rows = [];
  var ranges = sheet.getActiveRangeList().getRanges();
  if (ranges.length == 1 && ranges[0].getNumRows() == 1 && ranges[0].getNumColumns() == 1) {
    // сразу на выход с пустым массивом, если выделена только одна ячейка
  } else {
    // иначе заполняем массив уникальными номерами строк по возрастанию
    ranges.forEach(rng => {
      for (var row = rng.getRow(); row <= rng.getLastRow(); row++) rows.push(row)
    });
    rows = Array.from(new Set(rows)); // уникалим массив
    rows.sort((a, b) => a - b); // сортируем по возрастанию чисел
  }
  return rows;
}
[/vba]
Далее, уже имея в своем распоряжении такую замечательную функцию (чего стоит одно использование объекта Set в алгоритме!), внесем правки в функцию copyFormattedData:
[vba]
Код
  var selectedRows = getSelectedRows(sourceSheet); // выделенные строки листа //ADD
  for (var i = 1; i < sourceData.length; i++) {
    var date = new Date(sourceData[i][0]);
    if (isNaN(date)) continue;
    // если массив не пустой И строка не выделена, то пропускаем //ADD
    if (selectedRows.length && !~selectedRows.indexOf(i)) continue; //ADD
    var dateString = formatDate(date);
    var rowData = dateString + ' ';
    for (var j = 1; j < sourceData[i].length-1; j++) { //CHANGE
      var srm = sourceData[3][j]; // Get the SRM name from the second row //CHANGE
      var order = formatOrderValue(sourceData[i][j]);
      if (order !== null) {
        rowData += srm + ' ' + order + ', ';
      }
    }
    formattedText += rowData.slice(0, -2) + '\n'; // Remove the extra comma
  }
[/vba]
Метками //ADD указаны добавленные строки, метками //CHANGE - ранее исправленные.

[p.s.]После копирования и вставки фрагментов в Ваш код придайте им красивость уже на месте (ПКМ \ Форматировать выделенный фрагмент). А то движок Форума съедает двухпробельный отступ - ему 4 подавай, тогда сохранит. А специально вставлять в код доп.пробелы только для обеспечения красивости этого сообщения - устал :(


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Пятница, 04.08.2023, 13:10
 
Ответить
Сообщение
Нужно, чтобы он предлагал для копирования только те строки сводной таблицы, которые выделил пользователь

Наваял функцию получения выделенных строк, точнее, строк, проходящих через текущее выделение. Не обязательно выделять целые строки, достаточно выделить диапазон, содержащий более одной ячейки, и будут запомнены номера всех строк, затрагиваемых этим выделением (само собой, можно выделять несколько несмежных диапазонов):
[vba]
Код
// Функция получения номеров строк, пересекающих выделение
function getSelectedRows(sheet) {
  var rows = [];
  var ranges = sheet.getActiveRangeList().getRanges();
  if (ranges.length == 1 && ranges[0].getNumRows() == 1 && ranges[0].getNumColumns() == 1) {
    // сразу на выход с пустым массивом, если выделена только одна ячейка
  } else {
    // иначе заполняем массив уникальными номерами строк по возрастанию
    ranges.forEach(rng => {
      for (var row = rng.getRow(); row <= rng.getLastRow(); row++) rows.push(row)
    });
    rows = Array.from(new Set(rows)); // уникалим массив
    rows.sort((a, b) => a - b); // сортируем по возрастанию чисел
  }
  return rows;
}
[/vba]
Далее, уже имея в своем распоряжении такую замечательную функцию (чего стоит одно использование объекта Set в алгоритме!), внесем правки в функцию copyFormattedData:
[vba]
Код
  var selectedRows = getSelectedRows(sourceSheet); // выделенные строки листа //ADD
  for (var i = 1; i < sourceData.length; i++) {
    var date = new Date(sourceData[i][0]);
    if (isNaN(date)) continue;
    // если массив не пустой И строка не выделена, то пропускаем //ADD
    if (selectedRows.length && !~selectedRows.indexOf(i)) continue; //ADD
    var dateString = formatDate(date);
    var rowData = dateString + ' ';
    for (var j = 1; j < sourceData[i].length-1; j++) { //CHANGE
      var srm = sourceData[3][j]; // Get the SRM name from the second row //CHANGE
      var order = formatOrderValue(sourceData[i][j]);
      if (order !== null) {
        rowData += srm + ' ' + order + ', ';
      }
    }
    formattedText += rowData.slice(0, -2) + '\n'; // Remove the extra comma
  }
[/vba]
Метками //ADD указаны добавленные строки, метками //CHANGE - ранее исправленные.

[p.s.]После копирования и вставки фрагментов в Ваш код придайте им красивость уже на месте (ПКМ \ Форматировать выделенный фрагмент). А то движок Форума съедает двухпробельный отступ - ему 4 подавай, тогда сохранит. А специально вставлять в код доп.пробелы только для обеспечения красивости этого сообщения - устал :(

Автор - Gustav
Дата добавления - 04.08.2023 в 12:54
-marusa122- Дата: Пятница, 04.08.2023, 13:45 | Сообщение № 5
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

2019
Gustav, большое спасибо, все работает!
 
Ответить
СообщениеGustav, большое спасибо, все работает!

Автор - -marusa122-
Дата добавления - 04.08.2023 в 13:45
  • Страница 1 из 1
  • 1
Поиск:

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