【问题标题】:Jump to current date cell (dates are in one row) Google Sheets跳转到当前日期单元格(日期在一行中)谷歌表格
【发布时间】:2020-09-01 12:12:59
【问题描述】:

我有一个谷歌表格电子表格。第 2 行包含日期,例如25/08/2020, 26/08/2020 跨越许多列。是否可以运行脚本使其跳转到包含文档首次打开时的当前日期的单元格?

我知道您定义了 OnOpen() 方法,它会在打开文档时运行,但是,它正在获取实际工作的代码,这被证明是困难的。

注意:我查看了Google spreadsheet / docs , jump to current date cell on Open,但解决方案不起作用(我假设是因为我的日期都排在一行中)。

我不太了解javascript,我了解一些基础知识。任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 嗨,Sam,您能检查一下我的解决方案是否适合您吗?谢谢

标签: javascript date google-sheets


【解决方案1】:

您在 Google spreadsheet / docs , jump to current date cell on Open 找到的代码对您不起作用,因为它只检查第一列。
我稍微修改了这段代码以连续搜索日期。
根据需要更改 rowWithDates 变量。

function onOpen() { // runs automatically
  
  var rowWithDates = 2; // change as needed
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getActiveSheet();
  var range = sh.getDataRange()
  var data = range.getValues();
  var today = new Date().setHours(0,0,0,0);
  var diffref = today;
  var diff;
  var idx;
  for(var n=0;n<range.getWidth();n++){
    var date = new Date(data[rowWithDates-1][n]).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(rowWithDates, n).activate();
}

【讨论】:

  • 我认为只要单元格格式设置为“日期”,它就会起作用。日期只是引擎盖下的一个数字。
【解决方案2】:

您可以使用您在问题中引用的答案中提供的代码,您只需要更改几件事:

  1. 让它在一行中查找,而不是在列中(注意数据数组正在更改第二个数组维度,而不是第一个);和
  2. 让它看起来在特定行中,而不是硬编码到第一行(你可以让数组使用变量“row”,而不是 0;相反,我只是有代码仅提取带有日期的行的数据 - 这对于非常大的电子表格来说更快)。
    function onOpen() {
      var row = 8;  //set this to be the row with the dates
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sh = ss.getActiveSheet();
      var data = sh.getDataRange();
      var datesrow = sh.getRange(row,data.getColumn(),row,data.getWidth()).getValues();
      var today = new Date().setHours(0,0,0,0);
      for(var n=0;n<datesrow[0].length;n++){
        var date = new Date(datesrow[0][n]).setHours(0,0,0,0);
        if(date==today){break};
      }
      console.log(n);
      n++;
      sh.getRange(row,n).activate();
    }

【讨论】:

    【解决方案3】:

    解决方案:

    虽然其他解决方案目前可能适用,但建议在使用 Dates 时考虑显示值。还强烈建议摆脱旧的 for 循环和 var 声明。

    这将是一个更具前瞻性的解决方案:

    function onOpen() {
        
      const ss = SpreadsheetApp.getActiveSpreadsheet();
      const sh =ss.getActiveSheet();
      
      const today = new Date(); 
      const today_year= today.getFullYear();
      const today_month = addZero(today.getMonth()+1);
      const today_day = addZero(today.getDate());
      const today_date =   today_day.toString() + "/" + today_month.toString() + "/" + today_year.toString();
      
      function addZero(i) {
      if (i < 10) {
        i = "0" + i;
      }
      return i;
    }
    
      const dates = sh.getRange(2,1,1,sh.getLastColumn()).getDisplayValues().flat(1);
      dates.forEach((d,index)=>{ 
         if (d===today_date){
            sh.getRange(2,index+1).activate();}});
     
    }
    

    参考资料:

    getDisplayValues()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      • 1970-01-01
      • 2014-04-15
      相关资源
      最近更新 更多