Как можно условно перемещать строки между 3 листами в Google Sheets? - PullRequest
0 голосов
/ 23 марта 2020

У меня есть список задач на листе, и я пытался найти простой способ перемещения строк с задачами на другой лист в зависимости от состояния в одном столбце (например, пусто, выполнено, оплачено). Например, задача в строке 2 помечена как «выполнено». Затем мне нужно удалить эту строку и переместить на лист с надписью «готово». Оттуда, когда задача будет оплачена, мне нужно, чтобы эта строка была удалена с вкладки «сделано» на вкладку «оплачено».

Я нашел код, который позволяет мне сделать это один раз для 1 строки, но это не повторяется для строк под ним. Вот код, который я использовал:

function ConditionalShimmy2(){
var ss = SpreadsheetApp.getActiveSpreadsheet();

 var sheet1 = ss.getSheetByName('not done');
 var sheet2 = ss.getSheetByName('done');
 var sheet3 = ss.getSheetByName('paid'); 

  var cell = sheet1.getRange("f2:f277").getCell(1, 1);
  var rowtoInsert = "2:277"; 

 if(cell.getValue() == "done") 
 {

   sheet2.insertRows(2); 
   var range2 = sheet2.getRange(2 ,1,1,sheet1.getLastColumn()); 
  sheet1.getRange(cell.getRow(),1, 1, sheet1.getLastColumn()).copyTo(range2); 
  sheet1.deleteRow(cell.getRow()); 
 }
}

Может кто-нибудь помочь мне закончить этот код и сообщить мне, где я ошибаюсь

1 Ответ

0 голосов
/ 23 марта 2020

Чтобы выполнить свою задачу, вы можете попробовать предложенное ниже решение , которое подойдет для вашей ситуации.

Фрагмент

function ConditionalShimmy2() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  var main = ss.getSheetByName("THE_NAME_OF_THE_MAIN_SHEET");
  var sheet1 = ss.getSheetByName("not done");
  var sheet2 = ss.getSheetByName("done");
  var sheet3 = ss.getSheetByName("paid");
  var taskNames = main.getRange(row, column, numRows, numColumns).getValues();
  var taskStatus = main.getRange(row, column, numRows, numColumns).getValues();
  var rowsDeleted = 0;
  for (var i = 0; i < taskStatus.length; i++) {
    if (taskStatus[i][0] == "not done") {
      sheet1.appendRow([taskNames[i][0]]);
      main.deleteRow((i + 1) - rowsDeleted);
      rowsDeleted++;
    } else if (taskStatus[i][0] == "done") {
      sheet2.appendRow([taskNames[i][0]]);
      main.deleteRow((i + 1) - rowsDeleted);
      rowsDeleted++;
    } else if (taskStatus[i][0] == "paid") {
      sheet3.appendRow([taskNames[i][0]]);
      main.deleteRow((i + 1) - rowsDeleted);
      rowsDeleted++;
    }
  }
}

Объяснение

Приведенный выше фрагмент проходит по всем задачам и связанным с ними состояниям, и на основе столбца status каждая строка затем добавляется к соответствующему листу с использованием метода appendRow(), а затем удаляется из листа main используя метод deleteRow().

Примечание

Чтобы приведенный выше фрагмент кода работал в вашей ситуации, вам придется настроить параметры для метода getRange, связанного с ним. на taskNames и taskStatus. Поэтому параметры row, column, numRows, numColumns представляют диапазон с верхней левой ячейкой по заданным координатам с заданным количеством строк и столбцов.

Ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...