谷歌电子表格/文档,在开放

时间:2015-06-28 10:08:56

标签: google-apps-script spreadsheet

我已经搜索了这个主题并找到了一些主题 - 然而,这些主题中的答案(通常以脚本形式)都没有证明对我来说是成功的。我想我搞砸了一些变数。

我在Google文档中有一个包含工作名单的电子表格。在B1行:OI1只是超过一年的日期,即B1 = 2015年5月1日星期五,B2 = 2015年5月2日星期六,OI = 2016年6月1日星期三。

我希望无论何时打开工作表,工作表都会跳转到今天或当周的星期一的名单。

我如何做到这一点?

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:5)

我想你已经看过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();

这将在激活今天的列之前选择最后一列,并将选择放在左侧(在工作表中的冻结列附近),这更加自然&#34;。

答案 1 :(得分:0)

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();
}

答案 2 :(得分:0)

当日期在第一列(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);
}