首页 > 解决方案 > Google Apps 脚本:当日期 < 今天 + xx 天时删除数据

问题描述

我有一个包含 5 列和上次检查日期的 Google 表格。我只想在自上次检查后的天数大于 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); 

}

标签: javascriptgoogle-apps-script

解决方案


该解决方案忽略了代码中提到的“重复”,并专注于您提出的删除少于 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);  
}

推荐阅读