Как вырезать строку из листа 1 и вставить в лист 2, если дата в ячейке старше 30 дней? - PullRequest
0 голосов
/ 11 июля 2020

Как я могу автоматически скопировать строку из Sheet1 в Sheet2, если дата ячейки на Sheet1 старше 30 дней, а затем удалить эту строку из Sheet1?

Я намерен чтобы сделать резервную копию Sheet2 строк на Sheet1, возраст которых превышает 30 дней.

Даты, которые мне нужно проверить, - это столбец H4:H.

Этот вопрос ниже почти то же самое, что мне нужно, за исключением того факта, что у меня должно быть условие даты

Автоматическое копирование данных между таблицами Google

function copyPaste() {
  var ss=SpreadsheetApp.getActive();
  var srcsh=ss.getSheetByName('CurrentData');
  var dessh=ss.getSheetByName('HistoricalData');
  var srcrg=srcsh.getRange('A2:F100');
  var data=srcrg.getValues();
  var desrg=dessh.getRange(dessh.getLastRow() + 1,1,99,6);
  desrg.setValues(data);
}

Я только новичок в Google скрипт, извините, если это звучит глупо. Спасибо.

Вот лист, над которым я работаю:

https://docs.google.com/spreadsheets/d/1LlqzlkdB5q-xZMwX-_-UnT8NO-q6oIJz9WWb3JRfWC0/edit#gid = 568293021

Ответы [ 2 ]

2 голосов
/ 11 июля 2020

Попробуйте так:

function move() {
  const ss=SpreadsheetApp.getActive();
  const csh=ss.getSheetByName('CurrentData')
  const hsh=ss.getSheetByName('HistoricalData')
  const cshsr=4;//start row for csh
  const crg=csh.getRange(cshsr,1,csh.getLastRow()-cshsr+1,csh.getLastColumn());
  const cvs=crg.getValues();
  const dt=new Date();
  const dtv=new Date(dt.getFullYear(),dt.getMonth(),dt.getDate()-30).valueOf();//thirty day threshold
  let d=0;
  cvs.forEach(function(r,i){
    if(new Date(r[7]).valueOf()<dtv) {
      hsh.appendRow(r);//appends to bottom
      csh.deleteRow(i+cshsr-d++);//includes delete counter
    }
  });  
  }
1 голос
/ 11 июля 2020

Это становится немного сложнее, если вы не хотите просто копировать все значения с одного листа на другой. В строке кода ниже 0 должен соответствовать местоположению значения даты на листе, имея в виду, что массивы начинаются с 0, а диапазоны начинаются с 1. Так, например, если ваша дата в третьем столбце электронной таблицы эта строка будет выглядеть так:

var msback= new Date() - values[i][2]

Надеюсь, это поможет!

function moveifover30() {
  
  var ss= SpreadsheetApp.getActive();
  var msperday = 1000*60*60*24 //milliseconds*seconds*minutes*hours

  //get both sheets
  var sheet = ss.getSheetByName('CurrentData')
  var sheet3 = ss.getSheetByName('HistoricalData')
  
  //This gets the whole data range
  var datarange = sheet.getDataRange();
  
  //This gets the values from the data range
  var values = datarange.getValues();
  
  //This goes through the values array one by one and checks for the condition
  for (var i = 0; i< values.length; i++) {
  
  //Date math is alwasy in milliseconds, so we can create a new date object and then subtract the date in the array which will get the difference in milliseconds
  if(values[i][0] && Object.prototype.toString.call(values[i][7]) === "[object Date]") { 
   var msback = new Date() - values[i][0]
  
   //number of milliseconds per day
    
   if(msback/msperday > 30) {
    
     sheet3.appendRow(values[i])
     sheet.getRange(i+1, 1, 1, 
     datarange.getLastColumn()).deleteCells(SpreadsheetApp.Dimension.ROWS)
    }
   }
  
  }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...