一列中有日期,如果更改其他列的状态,则会自动更新。如果从" Open"到"进展中"它确定了今天的日期。
我需要一个自动执行的功能""如果日期比今天早。
到目前为止有这个代码,但它不起作用,我不知道为什么。 感谢
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")}
}
}
答案 0 :(得分:0)
此脚本仅在此时由用户提示时才起作用。
您有两个选择,要么在其上设置一个触发器,例如每5分钟运行一次脚本,请参阅here。
或者以onEdit(e)启动该功能,当工作表中的任何内容发生变化时,该功能会自动触发脚本。但是,这可能会减慢在工作表中的工作速度,请参阅here。
我不确定你是说你的脚本没有正常工作,也没有被触发。如果您希望我查看您的脚本,请将链接添加到Google工作表。
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")}
}
}
答案 1 :(得分:0)
您实际上不需要解析日期来比较它们,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);
}