Google 脚本 - 比较日期是否早于今天的函数
Google Script - function comparing if date is older than today
一列中有日期,如果其他列的状态发生变化,日期会自动更新。如果从 "Open" 更改为 "In progress",则设置今天的日期。
我需要一个自动执行 "something" 的功能,以防日期早于今天。
到目前为止有这段代码,但它不起作用,我不知道为什么。
谢谢
function backgroundformate() {
var odpovediSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Odpovědi formuláře");
var lastRow = odpovediSheet.getLastRow();
var columnH = odpovediSheet.getRange(2, 8, odpovediSheet.getLastRow(), 1).getValues();
var day = 24*3600*1000
var today = parseInt((new Date().setHours(0,0,0,0))/day);
for (var i=1; i < columnH.length; i++) {
var dataday = parseInt(new Date(columnH[i][8]).getTime()/day);
if (dataday < today) {odpovediSheet.getRange(i+1, 8, lastRow, 1).setBackground("red")}
else {odpovediSheet.getRange(i+1, 8, lastRow, 1).setBackground("yellow")}
}
}
此时只有在用户提示时此脚本才会起作用。
您有两个选择,要么在其上放置一个触发器,让脚本 运行 例如每 5 分钟一次,请参阅 here。
或者将函数作为 onEdit(e) 启动,当 sheet 中的任何内容发生更改时自动触发脚本。但是,这可能会减慢 sheet 中的工作速度,请参阅 here。
我不确定您是说您的脚本没有正常工作还是没有被触发。如果你想让我看你的脚本,请在 google sheet 中添加 link。
function backgroundformate() {
var odpovediSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Odpovědi formuláře");
var lastRow = odpovediSheet.getLastRow();
var columnH = odpovediSheet.getRange(2, 8, odpovediSheet.getLastRow(), 1).getValues();
var day = 24*3600*1000
var today = parseInt((new Date().setHours(0,0,0,0))/day);
for (var i=1; i < columnH.length; i++) {
var value = columnH[i][8].getValue();
var dataday = parseInt(value/day);
if (dataday < today) {odpovediSheet.getRange(i+1, 8, lastRow, 1).setBackground("red")}
else {odpovediSheet.getRange(i+1, 8, lastRow, 1).setBackground("yellow")}
}
}
您实际上不需要解析日期来比较它们,JavaScript 本机就可以做到这一点。
这是您的工作代码:
function backgroundformate() {
var odpovediSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Odpovědi formuláře");
SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
var lastRow = odpovediSheet.getLastRow();
var columnH = odpovediSheet.getRange(2, 8, odpovediSheet.getLastRow(), 1).getValues();
var today = new Date(new Date().setHours(23,59,59,0,0));// I set the hour to near midnight so you can get the right result today until 23:59:59
for (var i=1; i < columnH.length; i++) {
var dataday =columnH[i][0];
if (dataday < today) {odpovediSheet.getRange(i+1, 8, lastRow, 1).setBackground("red")}
else {odpovediSheet.getRange(i+1, 8, lastRow, 1).setBackground("yellow")}
}
}
此外,您在这段代码中确实犯了一个错误:
var dataday = parseInt(new Date(columnH[i][8]).getTime()/day);
您要查找的值位于索引 0 处,因为您在定义范围时仅从该列获取数据。
代码应该是
var dataday = parseInt(new Date(columnH[i][0]).getTime()/day);
但无论如何,解析是没有必要的。
也就是说,在循环中调用 ss 服务不是好的做法,您可以使用数组和单个 SS 调用更有效地做到这一点。
代码是这样的,请尝试比较执行速度
function backgroundformate() {
var odpovediSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Odpovědi formuláře");
SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
var columnH = odpovediSheet.getRange(2, 8, odpovediSheet.getLastRow()-1, 1).getValues();
var columnHBG = odpovediSheet.getRange(2, 8, odpovediSheet.getLastRow()-1, 1).getBackgrounds();
var today = new Date(new Date().setHours(23,59,59,0,0));
for (var i=0; i < columnH.length; i++) {
var dataday =columnH[i][0];
if (dataday < today) {
columnHBG[i][0]='#F00';
}else{
columnHBG[i][0]='#FF0';
}
}
odpovediSheet.getRange(2, 8, odpovediSheet.getLastRow()-1, 1).setBackgrounds(columnHBG);
}
一列中有日期,如果其他列的状态发生变化,日期会自动更新。如果从 "Open" 更改为 "In progress",则设置今天的日期。
我需要一个自动执行 "something" 的功能,以防日期早于今天。
到目前为止有这段代码,但它不起作用,我不知道为什么。 谢谢
function backgroundformate() {
var odpovediSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Odpovědi formuláře");
var lastRow = odpovediSheet.getLastRow();
var columnH = odpovediSheet.getRange(2, 8, odpovediSheet.getLastRow(), 1).getValues();
var day = 24*3600*1000
var today = parseInt((new Date().setHours(0,0,0,0))/day);
for (var i=1; i < columnH.length; i++) {
var dataday = parseInt(new Date(columnH[i][8]).getTime()/day);
if (dataday < today) {odpovediSheet.getRange(i+1, 8, lastRow, 1).setBackground("red")}
else {odpovediSheet.getRange(i+1, 8, lastRow, 1).setBackground("yellow")}
}
}
此时只有在用户提示时此脚本才会起作用。
您有两个选择,要么在其上放置一个触发器,让脚本 运行 例如每 5 分钟一次,请参阅 here。
或者将函数作为 onEdit(e) 启动,当 sheet 中的任何内容发生更改时自动触发脚本。但是,这可能会减慢 sheet 中的工作速度,请参阅 here。
我不确定您是说您的脚本没有正常工作还是没有被触发。如果你想让我看你的脚本,请在 google sheet 中添加 link。
function backgroundformate() {
var odpovediSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Odpovědi formuláře");
var lastRow = odpovediSheet.getLastRow();
var columnH = odpovediSheet.getRange(2, 8, odpovediSheet.getLastRow(), 1).getValues();
var day = 24*3600*1000
var today = parseInt((new Date().setHours(0,0,0,0))/day);
for (var i=1; i < columnH.length; i++) {
var value = columnH[i][8].getValue();
var dataday = parseInt(value/day);
if (dataday < today) {odpovediSheet.getRange(i+1, 8, lastRow, 1).setBackground("red")}
else {odpovediSheet.getRange(i+1, 8, lastRow, 1).setBackground("yellow")}
}
}
您实际上不需要解析日期来比较它们,JavaScript 本机就可以做到这一点。 这是您的工作代码:
function backgroundformate() {
var odpovediSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Odpovědi formuláře");
SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
var lastRow = odpovediSheet.getLastRow();
var columnH = odpovediSheet.getRange(2, 8, odpovediSheet.getLastRow(), 1).getValues();
var today = new Date(new Date().setHours(23,59,59,0,0));// I set the hour to near midnight so you can get the right result today until 23:59:59
for (var i=1; i < columnH.length; i++) {
var dataday =columnH[i][0];
if (dataday < today) {odpovediSheet.getRange(i+1, 8, lastRow, 1).setBackground("red")}
else {odpovediSheet.getRange(i+1, 8, lastRow, 1).setBackground("yellow")}
}
}
此外,您在这段代码中确实犯了一个错误:
var dataday = parseInt(new Date(columnH[i][8]).getTime()/day);
您要查找的值位于索引 0 处,因为您在定义范围时仅从该列获取数据。 代码应该是
var dataday = parseInt(new Date(columnH[i][0]).getTime()/day);
但无论如何,解析是没有必要的。
也就是说,在循环中调用 ss 服务不是好的做法,您可以使用数组和单个 SS 调用更有效地做到这一点。 代码是这样的,请尝试比较执行速度
function backgroundformate() {
var odpovediSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Odpovědi formuláře");
SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
var columnH = odpovediSheet.getRange(2, 8, odpovediSheet.getLastRow()-1, 1).getValues();
var columnHBG = odpovediSheet.getRange(2, 8, odpovediSheet.getLastRow()-1, 1).getBackgrounds();
var today = new Date(new Date().setHours(23,59,59,0,0));
for (var i=0; i < columnH.length; i++) {
var dataday =columnH[i][0];
if (dataday < today) {
columnHBG[i][0]='#F00';
}else{
columnHBG[i][0]='#FF0';
}
}
odpovediSheet.getRange(2, 8, odpovediSheet.getLastRow()-1, 1).setBackgrounds(columnHBG);
}