Скрипты Google Apps: удаление данных, если даты <сегодня + xx дней - PullRequest
0 голосов
/ 12 июля 2020

У меня есть Google Sheet с 5 столбцами и датами последней проверки. Я хочу сохранять записи только тогда, когда количество дней с момента последней проверки превышает 10 дней.

Лист: https://docs.google.com/spreadsheets/d/1nD7CXraydrAwOh7q7QFDLveVW76wRNU0ago4h-ORn8U/edit?usp=sharing

function check(){

/** Variables **/ 
  var ss = SpreadsheetApp.getActiveSpreadsheet(); var sh1 = ss.getSheetByName('Data Processing');

/** Remove duplicates **/ 
  var sh1data = sh1.getDataRange().getValues(); 
  var sh1newData = []; 
  for (var i in sh1data) { 
    var row = sh1data[i]; 
    var duplicate = false; 
    for (var j in sh1newData) {
/* DATE */
      var today=new Date().valueOf(); 
      var sec=1000;  var min=60*sec;  var hour=60*min;  var day=24*hour; // Do the conversions  
      var sh1DateChecked = sh1newData[j][4].valueOf(); 
      var diff=today-sh1DateChecked; 
      var days=Math.floor(diff/day); // Number of Days since the last check
      
if(row[0] == sh1newData[j][0] && row[1] == sh1newData[j][1] && days < 10)
{ duplicate = true; } } 
    if (!duplicate) { sh1newData.push(row);
                     
} 
  } 
  sh1.clearContents();
  sh1.getRange(1, 1, sh1newData.length, sh1newData[0].length).setValues(sh1newData); 

}

1 Ответ

0 голосов
/ 13 июля 2020

Это решение игнорирует упоминание в коде «дубликатов» и фокусируется на поставленном вами вопросе об удалении дат, которым меньше 10 дней. Однако, если вам также необходимо удалить дубликаты, их можно легко добавить.

Я предлагаю вам поместить свое условие в функцию, которая принимает строку данных в качестве входных данных и возвращает логическое значение (истина / ложь), например как

function dateCheckedOlderThan10Days(row) {
  return getDays(row[4]) > 10;
}

function getDays(date) {
  const sec = 1000;
  const min = 60 * sec;
  const hour = 60 * min;
  const day = 24 * hour;  
  return Math.floor((new Date() - date)/day);  
}

(Обратите внимание, как вы можете полностью извлечь функцию getDays из своей основной функции. Это сокращает объем кода, который вы должны думать внутри каждого определения функции.)

Эта функция идеально впишется в Array.prototype.filter, а название функции дает очень четкое представление о том, что вы ожидаете.

const dataOlderThan10Days = ss.getSheetByName('Data Processing')
  .getDataRange()
  .getValues()
  .filter(dateCheckedOlderThan10Days);

Вот функция checked, преобразованная в несколько функций:

Код. js

function check() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const dataSheet = ss.getSheetByName('Data Processing');
  const data = dataSheet.getDataRange().getValues();
  const dataOlderThan10Days = data
    .slice(1) // removes header row; comment out if you don't have a header row
    .filter(dateCheckedOlderThan10Days);
  dataSheet.clearContents();
  //dataOlderThan10Days.unshift(data[0]); // <-- if you want to restore the headers
  setData(dataSheet, dataOlderThan10Days);
}

function dateCheckedOlderThan10Days(row) {
  return getDays(row[HEADINGS.DATE_CHECKED]) > 10;
}

const HEADINGS = {
  FIRST_NAME: 0,
  LAST_NAME: 1,
  SALARY: 2,
  AGE: 3,
  DATE_CHECKED: 4
};

function setData(sheet, data) {
  sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
}

function getDays(date) {
  const sec = 1000;
  const min = 60 * sec;
  const hour = 60 * min;
  const day = 24 * hour;  
  return Math.floor((new Date() - date)/day);  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...