Как можно создать скрипт или формулу для перемещения данных на другой лист при выполнении определённых условий?

В "Лист1" у меня есть список задач, а на "Лист2" находится список выполненных задач. В "Лист1" я использую формулы для отметки задач галочкой и окраски строки в определённый цвет. 

Мне нужно сделать так, чтобы когда задача завершена и я ставлю галочку, вся строка с этой задачей переносилась на "Лист2". 

Есть ли возможность реализовать это через окрашивание (например, если строка окрашена в определённый цвет, она переносится), или происходит перенос всей строки с галочкой? Я не очень разбираюсь в этом, поэтому надеюсь на помощь. 

Кто-нибудь может предложить решение с использованием скрипта или формулы?
  • 25 ноября 2024 г. 6:23
Ответы на вопрос 2
Да, вы можете создать скрипт на Google Apps Script, который будет перетаскивать данные между листами, если вы установите галочку. Также можно настроить перемещение строк на другой лист на основе окраски, хотя это немного сложнее, поскольку Google Sheets не предоставляет нативных функций для отслеживания окраски ячеек. Поэтому чаще используется метод с отметкой галочки. 

Вот пример того, как вы можете реализовать это с помощью Google Apps Script:

1. Откройте ваш Google Sheets документ.
2. В меню выберите: `Расширения` > `Apps Script`.
3. Удалите любой код, который может быть там, и вставьте следующий код:

```javascript
function onEdit(e) {
  var sheet = e.source.getActiveSheet();
  var range = e.range;

  // Убедитесь, что это Лист1 и что редактируемая ячейка - это столбец с галочками
  if (sheet.getName() === "Лист1" && range.getColumn() === 1) { // предположим, что галочки в первом столбце
    var row = range.getRow();
    var value = range.getValue();

    // Если галочка установлена
    if (value === true) {
      var completedTask = sheet.getRange(row, 1, 1, sheet.getLastColumn()).getValues(); // Получаем всю строку
      var destinationSheet = e.source.getSheetByName("Лист2");
      var lastRow = destinationSheet.getLastRow() + 1;

      // Переносим строку в Лист2
      destinationSheet.getRange(lastRow, 1, 1, completedTask[0].length).setValues(completedTask);
      
      // Удаляем строку из Лист1
      sheet.deleteRow(row);
    }
  }
}
```

### Как это работает:
- Скрипт срабатывает каждый раз, когда вы редактируете ячейку.
- Он проверяет, что редактируемый лист - "Лист1", и что редактируемый столбец - это столбец с галочками (в данном случае, столбец 1).
- Если галочка установлена (значение ячейки равно `true`), скрипт копирует всю строку с заданной задачей в "Лист2" и затем удаляет эту строку из "Лист1".

### Примечания:
- Не забудьте заменить номер столбца в условии `range.getColumn() === 1` на тот, где у вас находятся галочки, если это не первый столбец.
- Также вы можете настроить его так, чтобы он переносил строки, если строка окрашена в определённый цвет (это более сложный процесс и требует дополнительной проверки цвета ячейки).

### Запуск скрипта:
- После того, как вы вставили код, сохраните его и закройте редактор.
- Теперь, когда вы будете ставить галочку в указанной колонке на "Лист1", соответствующая строка будет автоматически перемещена на "Лист2". 
- Прежде чем использовать скрипт, убедитесь, что у вас есть резервная копия данных, на случай если что-то пойдет не так.

Если у вас возникнут дополнительные вопросы, или вам нужно будет внести изменения в скрипт, не стесняйтесь спрашивать!
Это же JS. Нужно получить данные с листа, перебрать строки, если галочка установлена, то переносим строку в другой лист и удаляем из первого. 
Не обещаю, что оптимально, но в целом не очень сложны алгоритм:

function mvTsks() {
  var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Лист1');
  var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Лист2');
  
  var data = sheet1.getDataRange().getValues(); 
  

  for (var i = data.length - 1; i >= 0; i--) {
    if (data[i][1] === true) {
      sheet2.appendRow(data[i]);
      
      sheet1.deleteRow(i + 1);
    }
  }
}
Похожие вопросы