我已经搜索了这个主题,并找到了一些线索——然而,这些主题中的答案(通常以脚本的形式)对我来说还没有成功。我想我搞砸了一些变量。
我在谷歌文档中有一个电子表格,里面有一个工作名册。在B1行中:OI1是一年多的日期,即B1=2015年5月1日星期五,B2=2015年五月2日星期六,OI=2016年6月1日周三。
我希望无论何时打开单子,单子都能跳到今天或本周周一的名单上。
我该如何做到这一点?
提前感谢您的帮助!
我想你已经看到过这篇文章,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();
这将选择激活今天的列之前的最后一列,并将选择放在左侧(靠近工作表中冻结的列),这更"自然"。
function onOpen() {
// Activate cell with current date
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(),
data = sheet.getDataRange().getValues(),
now = new Date(),
columnWithDate = 0,
i, delta,
epsilonInMs = 0;
for (i = 0; data.length > i; i++) {
delta = now - new Date(data[i][columnWithDate]);
if (delta < epsilonInMs) break;
}
sheet.getRange(i, columnWithDate + 1).activate();
}
当日期在第一列(A列),并且您想转到当前日期附近的行时(您可以根据需要调整数字),这是有效的:
function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var d1 = new Date().getTime();
var a;
for (a = 1; (Math.floor((d1-sheet.getRange(a,1).getValue())/86400000)) > 5; a++)
try { var range = sheet.getRange(a+25,2); }
catch(err) { var range = sheet.getRange(2, 2) }
sheet.setActiveSelection(range);
}