Перенос строк с помощью скрипта в гугл таблице по условию на другой лист

Статья посвящена скрипту на гугл таблицах, который переносит строки из одного рабочего листа на другой архивный лист по условию в одном из столбцов рабочего листа.
По кнопке открывается гугл документ. Вы можете скачать его и он будет в формате .txt
Нередко, в таблицах случается ситуация, когда на одном рабочем листе скапливается много неактуальных строк, например, когда статус в одном из столбцов - "Завершено" или "Уволен", "Выполнено". Такие строки логично переносить в архивный лист, для того чтобы не перегружать пользователя, который работает с актуальными строками. Для этого можно по поочереди копировать строки, переносить их в архивный лист и удалять их из основного рабочего листа, однако не всегда ручная работа может быть удобной в силу большого количества таких строк. Я написал просто гугл скрипт и привязал его к кнопке, по нажатию которой и производятся эти действия.
  • имеем лист ЗП, который является рабочим листом. Условие, по которому нужно переносить строку в столбце B. Если в столбце B указано "Уволен", то такую строку необходимо переносить на лист ЗП архив. Просто удалить мы её не можем, т.к. суммы должны остаться для подсчета маржи/затрат компании.
  • я привязал скрипт к кнопке "Вынести в архив уволенных". По нажатию на эту кнопку гугл скрипт копирует строку и вставляет ееё в ссвободную строку на листе архив. По скриншоту: прошло нажатие кнопки. Вышло окно с отчетом: "Успешно обработана 1 строка." Нажимаем ОК.
  • я привязал скрипт к кнопке "Вынести в архив уволенных". По нажатию на эту кнопку гугл скрипт копирует строку и вставляет ееё в ссвободную строку на листе архив. По скриншоту: прошло нажатие кнопки. Вышло окно с отчетом: "Успешно обработана 1 строка." Нажимаем ОК.
  • на скриншоте лист архив, имеющий такую же структуру, что и основной рабочий лист. Строка успешно перенеслась. Для других рабочих листов мы берем суммы с Листа ЗП - по актуальным штатным работникам, а также по Архиву - по уволенным, таким образом на листе ЗП только актуальная информация, а на листе Архив - информация которая устарела, но еще нужна для подсчета сумм.
Целесообразность скрипта
Описание скрипта
перенос строки в архив - скрипт для гугл таблиц
перенос строки в архив - скрипт для гугл таблиц
function cutZPpasteArhiv() {
var ss = SpreadsheetApp.getActiveSpreadsheet();

// Получаем листы, с которыми работаем. Первый - ЗП - это рабочий лист, второй - ЗП архив - это архивный лист.
var sourceSheet = ss.getSheetByName("ЗП");
var targetSheet = ss.getSheetByName("ЗП архив");

// Если листы не найдены, выводим ошибку
if (!sourceSheet || !targetSheet) {
SpreadsheetApp.getUi().alert('Один из листов "ЗП" или "ЗП архив" не найден!');
return;
}

// Получаем данные из листа ЗП
var sourceLastRow = sourceSheet.getLastRow();
var lastCol = sourceSheet.getLastColumn();

// Если в листе нет данных (только заголовки или пусто)
if (sourceLastRow <= 1) {
SpreadsheetApp.getUi().alert('В листе "ЗП" нет данных для обработки');
return;
}

// Получаем все данные из листа ЗП
var sourceData = sourceSheet.getRange(1, 1, sourceLastRow, lastCol).getValues();

// Массивы для хранения данных
var rowsToCopy = [];
var rowsToDelete = [];

// Проходим по всем строкам снизу вверх (для корректного удаления)
for (var i = sourceLastRow - 1; i >= 1; i--) { // Начинаем с последней строки с данными
var cellValue = sourceData[i][1]; // Столбец B (индекс 1). В примере условие находится в столбце B, вы можете указать свой столбец в этой строчке во втором аргументе функции sourceData. Например, А - 1, B - 2, C - 3 и т.д.

// Проверяем, содержит ли ячейка "Уволен" или "Новый договор". В этом блоке Вы можете указать свое условие, а также добавить или удалить условия. В примере условие - "Уволен" или "Новый договор" для переноса строки.
if (cellValue &&
(cellValue.toString().toLowerCase().includes("уволен") ||
cellValue.toString().toLowerCase().includes("новый договор"))) {

// Добавляем строку для копирования
rowsToCopy.push(sourceData[i]);
// Запоминаем индекс строки для удаления (+1 потому что массив с 0)
rowsToDelete.push(i + 1);
}
}

// Если есть строки для копирования
if (rowsToCopy.length > 0) {
// НАХОДИМ ПЕРВУЮ ПО-НАСТОЯЩЕМУ СВОБОДНУЮ СТРОКУ В АРХИВЕ

// Получаем все данные из архива
var targetLastRow = targetSheet.getLastRow();
var targetData = targetSheet.getRange(1, 1, targetLastRow, lastCol).getValues();

var startRow = 4; // Начинаем поиск с 4-й строки. До 4 строки в примере - шапка, укажите свое значение.

// Ищем первую полностью пустую строку, начиная с 4-й
for (var row = 3; row < targetData.length; row++) { // row=3 соответствует 4-й строке (индексы с 0)
var isRowEmpty = true;

// Проверяем все ячейки в строке
for (var col = 0; col < targetData[row].length; col++) {
if (targetData[row][col] !== '') {
isRowEmpty = false;
break;
}
}

// Если нашли пустую строку
if (isRowEmpty) {
startRow = row + 1; // +1 потому что индексы с 0
break;
}
}

// Если не нашли пустых строк - начинаем с конца данных
if (startRow === 4 && targetLastRow >= 4) {
// Проверяем, пуста ли последняя строка
var lastRowIsEmpty = true;
var lastRowData = targetData[targetLastRow - 1];
for (var col = 0; col < lastRowData.length; col++) {
if (lastRowData[col] !== '') {
lastRowIsEmpty = false;
break;
}
}

if (lastRowIsEmpty) {
startRow = targetLastRow;
} else {
startRow = targetLastRow + 1;
}
}

// Вставляем данные в архив
if (startRow <= targetSheet.getMaxRows()) {
targetSheet.getRange(startRow, 1, rowsToCopy.length, lastCol).setValues(rowsToCopy);
} else {
// Если достигли предела строк - добавляем новые
targetSheet.insertRowsAfter(targetSheet.getMaxRows(), rowsToCopy.length);
targetSheet.getRange(startRow, 1, rowsToCopy.length, lastCol).setValues(rowsToCopy);
}

// Удаляем строки из исходного листа (отсортировано по убыванию)
rowsToDelete.sort(function(a, b) { return b - a; });

for (var j = 0; j < rowsToDelete.length; j++) {
sourceSheet.deleteRow(rowsToDelete[j]);
}

// Сообщение об успехе
var message = 'Успешно обработано ' + rowsToCopy.length + ' строк:\n';
message += '- Скопировано в архив (начиная со строки ' + startRow + ')\n';
message += '- Удалено из листа "ЗП"';
SpreadsheetApp.getUi().alert(message);

} else {
SpreadsheetApp.getUi().alert('Не найдено строк со значениями "Уволен" или "Новый договор" в столбце B');
}
}
Скрипт для гугл таблицы "Перенос строк в архив"
Разработка и ведение таблиц в Excel и Гугл таблицах
Самозанятый - Абдуллина Индира Ринатовна, ИНН 025700449805, дата постановки на учёт, в качестве налогоплательщика 12.11.2021
Email для документов: damir.abdullin248@gmail.com, Telegram - https://t.me/mmsenyy27
Made on
Tilda