Google Sheets: как перемещать данные между листами на основе текста и даты - PullRequest
0 голосов
/ 04 марта 2019

У меня есть три листа, по которым я хочу передавать строки данных между ними на основе определенных условий.От листа1 до листа2 на основе текстовой строки и от листа2 до листа3 на основе разницы между сегодняшней датой и введенной датой.Однако мои попытки пока были довольно бесплодными.

Я хочу переместить данные с листа1 на лист2 в зависимости от того, читается ли в столбце «P» значение «Завершено» или «Выброшено».Я также хотел записать дату, когда она была изменена на один из вышеуказанных вариантов в столбце «O».

function onEdit() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var c = ss.getSheetByName("Case Logs");
  var r = ss.getSheetByName("Recent Cases");
  var data = c.getDataRange().getValues().map(function(x) {return x[16];});
  var numColumns = c.getLastColumn();
  var current = new Date();


  for (var i= data.length-1; i>=0; i--) {
    if(["Completed"].indexOf(data[i])>-1) {
        var row = i+1;
        var target = r.getRange(r.getLastRow() + 1, 1);
        c.getRange('O').setValue(current);
        c.getRange(row, 1, 1, numColumns).copyTo(target);
        c.getRange(row, 1, 1, numColumns).clearContent();
        c.getRange(row, 1, 1, numColumns).clearNote();
     }
    if(["Thrown Out"].indexOf(data[i])>-1) {
        var row = i+1;
        var target = r.getRange(r.getLastRow() + 1, 1);
        c.getRange('O').setValue(current);
        c.getRange(row, 1, 1, numColumns).copyTo(target);
        c.getRange(row, 1, 1, numColumns).clearContent();
        c.getRange(row, 1, 1, numColumns).clearNote();
    }
  }
}

Для второго условия я хотел переместить строки с листа2 на лист3, основываясь на том, что датаперечисленные в столбце «O» больше или равны четырехмесячной разнице с текущей датой.

function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var r = ss.getSheetByName("Recent Cases");
  var a = ss.getSheetByName("Archived Cases");
  var data = r.getDataRange().getValues().map(function(x) {return x[16];});
  var numColumns = r.getLastColumn();
  var TIME_FRAME = 1000 * 60 * 60 * 24 * 120;
  var now = new Date();
  var past = new Date(now.getTime() - TIME_FRAME);

  for (var i= data.length-1; i>=0; i--) {
    if (["**Column DATE**"].indexOf(logs[i])>-1 >= past){
      var row = i+1;
      var target2 = a.getRange(a.getLastRow() + 1, 1);
      r.getRange(row, 1, 1, numColumns).copyTo(target2);
      r.getRange(row, 1, 1, numColumns).clearContent();
      r.getRange(row, 1, 1, numColumns).clearNote();
    }
  }
}

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

1 Ответ

0 голосов
/ 04 марта 2019

Вот пара предложений для первой функции:

Столбец P равен 16, но массивы начинаются с нуля, а столбцы начинаются с единицы.

Я бы заменил это: var data = r.getDataRange().getValues().map(function(x) {return x[16];}); на это var data = r.getDataRange().getValues().map(function(x) {return x[15];});

Я бы заменил это if(["Completed"].indexOf(data[i])>-1) на это: if(data[i]=="Completed")

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

Я бы не советовал запускать это в onEdit (), так как вы выполняете все циклыстрок.Я бы использовал объект события, чтобы определить, в какой строке я нахожусь, через eventObject.range.rowStart и иметь дело с одной строкой за раз.

Если вы хотите переместить данные с одного листа на другой и удалить старые строки, вы можете сделать что-то вроде этого:

function moveAndDeleteRows() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Sheet85');
  var tsh=ss.getSheetByName('Sheet86');
  var rg=sh.getDataRange();
  var n=0;
  var lc=sh.getLastColumn();
  var vA=rg.getValues().map(function(r){return r[15]});//this is equivalent to your get column P
  for(var i=0;i<vA.length;i++) {
    if(vA[i]=='Complete' || vA[i]=='Thrown Out') {
      sh.getRange(i-n+1,1,1,lc).moveTo(tsh.getRange(tsh.getLastRow()+1,1));
      sh.deleteRow(i-n+1);
      n+=1;
    }
  }
}

Такую функцию я бы использовал в onEdit () он выполняет аналогичный процесс.Я настроил это, поместив проверку данных в столбец P, который «завершен» или «выброшен».Поэтому, когда вы выбираете один, он перемещается на другой лист и удаляет строку, на которой вы находитесь.

function moveData(e) {
  if(e.range.getSheet().getName()!='Case Logs') {return;}
  var tsh=e.source.getSheetByName('Recent Cases');
  if(e.range.columnStart==16) {
    if(e.value=='Completed' || e.value=='Thrown Out') {
      e.range.getSheet().getRange(e.range.rowStart,1,1,e.range.getSheet().getLastColumn()).moveTo(tsh.getRange(tsh.getLastRow()+1,1));
      e.range.getSheet().deleteRow(e.range.rowStart);
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...