Здравствуйте. Пытаюсь сделать скрипт для копирования данных из сводной таблицы Google Sheets в нужном формате. Сводная таблица, из которой нужно копировать, находится на листе Статистика - https://docs.google.com/spreads....ve_link Проблемный скрипт - function copyFormattedData() Если скопировать без скрипта все ячейки сводной таблицы с заголовками: [vba]
[/vba] Как исправить скрипт так, чтобы при копировании перед значениями вставлялись соответствующие им имена столбцов? И второй вопрос: как сделать так, чтобы форматирование применялось только к выделенным строкам? Сейчас скрипт пытается отформатировать все строки в сводной таблице, какой бы диапазон ячеек я ни выбрала.
Здравствуйте. Пытаюсь сделать скрипт для копирования данных из сводной таблицы Google Sheets в нужном формате. Сводная таблица, из которой нужно копировать, находится на листе Статистика - https://docs.google.com/spreads....ve_link Проблемный скрипт - function copyFormattedData() Если скопировать без скрипта все ячейки сводной таблицы с заголовками: [vba]
[/vba] Как исправить скрипт так, чтобы при копировании перед значениями вставлялись соответствующие им имена столбцов? И второй вопрос: как сделать так, чтобы форматирование применялось только к выделенным строкам? Сейчас скрипт пытается отформатировать все строки в сводной таблице, какой бы диапазон ячеек я ни выбрала.-marusa122-
Сообщение отредактировал -marusa122- - Четверг, 03.08.2023, 17:14
Gustav, спасибо, тут исправила. Но остается вторая проблема - скрипт пытается копировать всю сводную таблицу. Даже если я с помощью среза оставлю одну строку или выделю ячейку вне таблицы, он все равно показывает все строки. Нужно, чтобы он предлагал для копирования только те строки сводной таблицы, которые выделил пользователь (если в сводной таблице 20 строк, а выделено 5 - в форме должны показываться только эти 5 строк)
Gustav, спасибо, тут исправила. Но остается вторая проблема - скрипт пытается копировать всю сводную таблицу. Даже если я с помощью среза оставлю одну строку или выделю ячейку вне таблицы, он все равно показывает все строки. Нужно, чтобы он предлагал для копирования только те строки сводной таблицы, которые выделил пользователь (если в сводной таблице 20 строк, а выделено 5 - в форме должны показываться только эти 5 строк)-marusa122-
Сообщение отредактировал -marusa122- - Пятница, 04.08.2023, 09:56
Нужно, чтобы он предлагал для копирования только те строки сводной таблицы, которые выделил пользователь
Наваял функцию получения выделенных строк, точнее, строк, проходящих через текущее выделение. Не обязательно выделять целые строки, достаточно выделить диапазон, содержащий более одной ячейки, и будут запомнены номера всех строк, затрагиваемых этим выделением (само собой, можно выделять несколько несмежных диапазонов): [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 }
[p.s.]После копирования и вставки фрагментов в Ваш код придайте им красивость уже на месте (ПКМ \ Форматировать выделенный фрагмент). А то движок Форума съедает двухпробельный отступ - ему 4 подавай, тогда сохранит. А специально вставлять в код доп.пробелы только для обеспечения красивости этого сообщения - устал
Нужно, чтобы он предлагал для копирования только те строки сводной таблицы, которые выделил пользователь
Наваял функцию получения выделенных строк, точнее, строк, проходящих через текущее выделение. Не обязательно выделять целые строки, достаточно выделить диапазон, содержащий более одной ячейки, и будут запомнены номера всех строк, затрагиваемых этим выделением (само собой, можно выделять несколько несмежных диапазонов): [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 }
[p.s.]После копирования и вставки фрагментов в Ваш код придайте им красивость уже на месте (ПКМ \ Форматировать выделенный фрагмент). А то движок Форума съедает двухпробельный отступ - ему 4 подавай, тогда сохранит. А специально вставлять в код доп.пробелы только для обеспечения красивости этого сообщения - устал Gustav