我想您已经看到this post OP 想要更改工作表中今天日期的背景颜色,您的情况非常相似,除了 - 如果我理解你的话 - 今天不一定存在于工作表中。
那么我们需要的是找到离今天最近的日期?您提到它必须是星期一,我没有走那么远,下面的脚本在 A 列中找到最接近的日期,您只需调整数组中的索引即可使其适应您的需要。 (不要忘记数组从 0 开始计数)
代码:
function onOpen() { // runs automatically
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getActiveSheet();
var data = sh.getDataRange().getValues();
var today = new Date().setHours(0,0,0,0);
var diffref = today;
var diff;
var idx;
for(var n=0;n<data.length;n++){
var date = new Date(data[n][0]).setHours(0,0,0,0);
diff=today-date;
if(diff==0){break}
Logger.log("diffref = "+diffref+" today-date = diff = "+diff);
if(diff < diffref && diff > 0){idx=n ; diffref=diff}
}
if(n==data.length){n=idx}
n++;
sh.getRange(n, 1).activate();
}
编辑:
要检查星期几(是的,我天生就很好奇 ;-) 您可以尝试像这样更改条件:
Logger.log("diffref = "+diffref+" today-date = diff = "+diff+" day = "+new Date(date).getDay());
if(diff < diffref && diff > 0 && new Date(date).getDay()==1){idx=n ; diffref=diff}
从我的测试来看,它似乎按预期工作。
编辑 2:
根据您的评论,您正在寻找的似乎要简单得多:
function onOpen2() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getActiveSheet();
var data = sh.getDataRange().getValues();
var today = new Date().setHours(0,0,0,0);
for(var n=0;n<data[0].length;n++){
var date = new Date(data[0][n]).setHours(0,0,0,0);
if(date==today){break};
}
n++;
sh.getRange(1,n).activate();
}
编辑 3
出于某种原因,我忽略了(请任何人提供建议!!)您的工作表不会从单元格中的日期返回日期值,而是返回与数字对应的本机电子表格值自 1899 年 12 月 30 日以来的天数...
所以我所做的是从 javascript today 变量中减去这个偏移值,除以一天中的毫秒数(JS 以毫秒为单位),然后取结果的整数部分。
我承认有点麻烦,但我没有找到更简单的方法......
真正奇怪的是,在我尝试的任何其他工作表中,日期总是作为日期返回...
无论如何,目前,这是您的电子表格的有效代码:
function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getActiveSheet();
var data = sh.getDataRange().getValues();
var offsetToSS = new Date('1899/12/30').setHours(0,0,0,0);
var today = parseInt((new Date().setHours(0,0,0,0)-offsetToSS)/86400000,10)+1;
for(var n=0;n<data[0].length;n++){
var date = data[0][n];
Logger.log("date = "+data[0][n]+" =? "+today);
if(date==today){break};
}
n++;
sh.getRange(1,n).activate();
}
最后一点:为了更好的用户体验,在var sh = ss.getActiveSheet();之后添加这行代码
sh.getRange(1,sh.getLastColumn()).activate();
这将在激活今天的列之前选择最后一列,并将选择放在更“自然”的左侧(靠近工作表中的冻结列)。