Перемещать строки с одного листа на другой - PullRequest
0 голосов
/ 05 мая 2020

Мне нужно переместить строки из ожидающего листа в архивный лист в зависимости от цвета фона. Я нашел сценарий и смог отредактировать его, чтобы приспособить к моим потребностям, за исключением нескольких вещей, которые я не могу понять (я не знаю, как кодировать, за исключением некоторых школьных материалов basi c). Я работал над следующим:

function onEdit(event) {
  // assumes source data in sheet named Pendientes
  // target sheet of copy to named Enviados
  // getColumn with color is currently set to colu 3 or C
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

  if(s.getName() == "Pendientes" && r.getColumn() == 3 && r.getBackground() == "#00ff00") {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("Enviados");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).copyTo(target, {contentsOnly:true});
    s.deleteRow(row);
    targetSheet.getRange(targetSheet.getLastRow(), 7).setValue(new Date()).setNumberFormat("dd-mm-yy");
    targetSheet.insertRowAfter(targetSheet.getLastRow())
  }
}

То, что я не могу понять:
Первоначально скрипт запускается, когда вы редактируете содержимое ячейки (цвет фона не учитывается, взял мне нужно время, чтобы выяснить, почему это не работает) и переместил строки, когда значение изменилось с false на true.
Я бы хотел изменить триггер на пользовательское меню, которое я создал, поэтому, когда вы щелкнув по нему, он просматривает все строки, находит ячейки с зеленым фоном и перемещает их в архив. Поскольку исходный сценарий использует событие, которое запускает сценарий каждый раз, когда выполняется редактирование, и анализирует этот единственный момент, я не уверен, как это сделать.
Я также хотел бы, если возможно, чтобы ячейки передавались в порядке, основанном в столбце 2, поэтому сначала он ищет зеленые ячейки в столбце 3 с помощью OptionA в столбце 2 и перемещает их, затем с помощью OptionB и так далее.

Я также не уверен, что строка, которую я добавил для вставки 1 строки для каждой перемещенной строки, будет работать при массовом перемещении строк, то есть, если она перемещает 10 строк, она вставит 10 новых строк или 1 отдельную строку.

Я сделал образец листа, в котором экспериментировал:
https://docs.google.com/spreadsheets/d/1tzGnuT107u1msx6BchZAEHE7NbsxIVcqXasGilQeTbA/edit?usp=sharing

Спасибо!

1 Ответ

1 голос
/ 05 мая 2020

Эта функция получает данные и цвета фона в одном диапазоне. Находит цвет в любом месте строки, пока я жду, когда вы объясните остальную часть вашего вопроса. Затем In берет соответствующую строку в массиве данных и помещает метку времени в конец, а затем добавляет ее в целевой лист. Используя индекс i, он удаляет строку и считает удаленные строки счетчиком удаления d. Потому что, пока строки удалялись с листа, они не удалялись из массива vA или cA.

function deleteRowWithGreenBackGroundAnyWhere() {
  const ss=SpreadsheetApp.getActive();
  const sh=ss.getSheetByName('Penientes');
  const rg=sh.getRange(3,1,sh.getLastRow()-2,sh.getLastColumn());
  const vA=rg.getValues();
  const cA=rg.getBackgrounds();
  const tsh=ss.getSheetByName("Enviados");
  const ts=Utilties.formatDate(new Date(),Session.getScriptTimeZone(),"dd-MM-yy");
  var d=0;
  cA.forEach(function(r,i){
    r.forEach(function(c,j){
      if(c=='#00ff00') {
        var tA=vA[i].slice();
        sh.appendRow(tA.push(ts));
        sh.deleteRow(i+3-d++);
      }
    });
  });
}
...