javascript - Google Apps 脚本:当日期 < 今天 + xx 天时删除数据
问题描述
我有一个包含 5 列和上次检查日期的 Google 表格。我只想在自上次检查后的天数大于 10 天时保留条目。
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);
}
解决方案
该解决方案忽略了代码中提到的“重复”,并专注于您提出的删除少于 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);
}
推荐阅读
- android - 如何在 android studio 的导航菜单中添加自定义菜单选项,如下图所示
- kendo-asp.net-mvc - 无法降低asp.net mvc中剑道网格的高度
- c# - 在断开连接的情况下更新实体框架中的几列的最佳方法
- angularjs - 如何处理 Spring Boot、AngularJS 应用程序中的 CORS 错误?
- c++ - 使用 uint16_t c++ 未解决的外部符号错误
- docker - VirtualBox 中的 Docker 无法访问共享文件夹
- ios - iOS - 从应用程序打开应用程序推送通知设置屏幕
- flutter - 推送到新路由时应用程序崩溃并出现错误:响应
>(脏,状态 - vue.js - 仅使用字符串实例化 Vue 组件
- kubernetes-helm - 对 Helm 依赖管理感到困惑