【问题标题】:Google spreadsheet / docs , jump to current date cell on Open谷歌电子表格/文档,跳到打开的当前日期单元格
【发布时间】:2015-06-28 10:08:55
【问题描述】:

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

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

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

我该如何做到这一点?

提前感谢您的帮助!

【问题讨论】:

  • 具体问题是什么?您知道如何获取今天的日期,但在比较代码中的日期时遇到问题?

标签: google-apps-script spreadsheet


【解决方案1】:

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

这将在激活今天的列之前选择最后一列,并将选择放在更“自然”的左侧(靠近工作表中的冻结列)。

【讨论】:

  • 非常感谢您的快速回复!日期范围在第 1 行(而不是第 1 列)。我不太希望找到最接近的日期,因为所有日期都应该在文档中 - 我的目标是让文档在(跳转到)当前日期打开,所以我想这会导致将焦点设置到单元格今天什么的。我将在您编写的代码中进行编辑,谢谢!
  • 再次感谢您的新编辑。很抱歉,即使进行了简化,我仍然无法使其正常工作。这一定是我想念的东西。我用相同的数据制作了一个公开文件。如果不是太多要求,您可以在那里测试您的脚本吗? docs.google.com/spreadsheets/d/… 再次感谢!
  • 我一回到电脑就可以了……手机不理想;-)
  • 很高兴不只是我感到困惑,非常感谢您提供这个解决方案!它完美运行,为我的团队节省了很多滚动时间,所​​以也代表他们感谢!
  • 很高兴,我只是希望有人能解释为什么会在您的电子表格中发生这种情况...感谢您的接受。
【解决方案2】:
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();
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      • 1970-01-01
      • 2015-08-16
      相关资源
      最近更新 更多