Автоматическое перемещение строк в Google Sheets по статусу с помощью скрипта

Работа с большими списками задач в Google Таблицах часто требует автоматизации рутинных операций. Один из частых сценариев — перемещение строк между листами (например, из «Активные» в «Завершённые») при изменении статуса задачи. Сегодня разберём, как настроить такой механизм с точной реакцией на конкретные значения и возможностью возврата данных обратно.

Представьте: вы меняете статус задачи в выпадающем списке, и строка «переезжает» в нужный лист без ручного копирования. Звучит удобно, но стандартные инструменты Google Sheets этого не умеют. Решение — скрипт на Apps Script. Однако важно, чтобы он срабатывал только при определённых условиях (например, статус «Done») и не реагировал на случайные изменения. Ниже покажу, как это реализовать без лишних сложностей.

Как работает скрипт для перемещения строк

Любой скрипт, привязанный к событию onEdit, запускается при редактировании ячейки. Но без фильтрации условий он будет перемещать строки при любом изменении в таблице — это основная проблема.

Ключевые моменты, которые нужно учесть:

  1. Проверка листа: скрипт должен работать только на определённых вкладках (например, «Active» и «Done»).
  2. Анализ столбца: статус задачи обычно хранится в конкретном столбце (в примере — столбец E, индекс 5).
  3. Значение ячейки: перемещение должно происходить только при установке статуса «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).
    • Отсутствие конфликтующих скриптов в проекте.

    Итог: автоматическое перемещение строк экономит время и снижает риск человеческих ошибок. Предложенный скрипт гибок — вы можете адаптировать его под свои названия листов, столбцов и статусов. Если возникнут сложности, пишите в комментарии: помогу с доработкой под ваш кейс.

    Добавить комментарий

    Все поля обязательны к заполнению. Ваш адрес email не будет виден никому.

    Новое
    Интересное