Работа с большими списками задач в Google Таблицах часто требует автоматизации рутинных операций. Один из частых сценариев — перемещение строк между листами (например, из «Активные» в «Завершённые») при изменении статуса задачи. Сегодня разберём, как настроить такой механизм с точной реакцией на конкретные значения и возможностью возврата данных обратно.
Представьте: вы меняете статус задачи в выпадающем списке, и строка «переезжает» в нужный лист без ручного копирования. Звучит удобно, но стандартные инструменты Google Sheets этого не умеют. Решение — скрипт на Apps Script. Однако важно, чтобы он срабатывал только при определённых условиях (например, статус «Done») и не реагировал на случайные изменения. Ниже покажу, как это реализовать без лишних сложностей.
Как работает скрипт для перемещения строк
Любой скрипт, привязанный к событию onEdit
, запускается при редактировании ячейки. Но без фильтрации условий он будет перемещать строки при любом изменении в таблице — это основная проблема.
Ключевые моменты, которые нужно учесть:
- Проверка листа: скрипт должен работать только на определённых вкладках (например, «Active» и «Done»).
- Анализ столбца: статус задачи обычно хранится в конкретном столбце (в примере — столбец E, индекс 5).
- Значение ячейки: перемещение должно происходить только при установке статуса «Done» или его снятии.
Вот код, решающий эти задачи:
function onEdit(e) {
if (e.range.columnStart !== 5 || e.range.rowStart === 1) return;
const sheet = e.range.getSheet();
const sheetName = sheet.getName();
let targetSheet;
if (sheetName === 'Active') {
if (e.value !== 'Done') return;
targetSheetName = 'Done';
} else if (sheetName === 'Done') {
targetSheetName = 'Active';
} else {
return;
}
targetSheet = e.source.getSheetByName(targetSheetName);
sheet.getRange(e.range.rowStart, 1, 1, 12)
.moveTo(targetSheet.getRange(targetSheet.getLastRow() + 1, 1));
sheet.deleteRow(e.range.rowStart);
e.source.toast(`Строка ${e.range.rowStart} перемещена на лист '${targetSheetName}'.`);
}
Пояснения по коду:
e.range.columnStart !== 5
— проверка, что изменение произошло в столбце E (индекс 5).e.value !== 'Done'
— условие срабатывания только для значения «Done» на листе «Active».targetSheet.getLastRow() + 1
— вставка строки в конец целевого листа.e.source.toast()
— всплывающее уведомление о перемещении (полезно для отслеживания действий скрипта).
Пошаговая настройка скрипта
1. Подготовка таблицы
- Создайте два листа: «Active» (активные задачи) и «Done» (завершённые).
- В столбце E листа «Active» добавьте выпадающий список с опциями, включая «Done». Для этого: Выделите ячейки → «Данные» → «Проверка данных» → «Список из диапазона» (например,
F1:F3
, где указаны статусы).
2. Вставка скрипта
- Откройте «Расширения» → «Apps Script» → вставьте код из примера выше.
- Сохраните проект (
Ctrl + S
) и закройте редактор.
3. Тестирование
- Измените статус любой задачи на «Done» → строка переместится на лист «Done».
- Если в листе «Done» изменить статус на другой (например, «In Progress»), строка вернётся в «Active».
Важные нюансы:
- Если вы переименуете листы, обновите названия
'Active'
и'Done'
в коде. - Столбец со статусом (номер 5) можно изменить, заменив
columnStart !== 5
на другой индекс (например, 6 для столбца F). - Скрипт не сработает, если редактируется несколько ячеек одновременно — он обрабатывает только одиночные изменения.
Дополнительные оптимизации и советы
Уведомления об ошибках: добавьте блок try...catch
, чтобы отслеживать проблемы. Например:
try {
// основной код
} catch (error) {
console.error(error);
e.source.toast('Ошибка: ' + error.message);
}
Сохранение форматирования: метод moveTo
копирует данные и форматирование. Если нужно перенести только значения, используйте getValues()
и setValues()
.
Ограничение прав: скрипт требует разрешения на редактирование таблицы. Если вы делитесь файлом, убедитесь, что collaborators не имеют доступа к скрипту (настройки доступа в Apps Script).
Отладка: если скрипт не работает, проверьте:
- Названия листов и столбцов в коде.
- Привязку триггера (иногда нужно установить его вручную через «Триггеры» в Apps Script).
- Отсутствие конфликтующих скриптов в проекте.
Итог: автоматическое перемещение строк экономит время и снижает риск человеческих ошибок. Предложенный скрипт гибок — вы можете адаптировать его под свои названия листов, столбцов и статусов. Если возникнут сложности, пишите в комментарии: помогу с доработкой под ваш кейс.