【问题标题】:How to open Google Sheets spreadsheet to cell in a single row that contains today's date如何在包含今天日期的单行中打开 Google Sheets 电子表格的单元格
【发布时间】:2016-04-12 20:33:19
【问题描述】:

我正在尝试使用脚本编辑器将 Google Sheet 文档设置为打开到第 2 行中的单元格,当前日期为当前日期。从 A2:IK2 开始,日期按时间顺序每天排列。它们的格式为 mm/dd。

我在这个网站上找到了一个类似问题的答案,但是他们的日期列在单列中,而我的日期列在单行中。以下代码由 Marshmallow 发布在这里:https://webapps.stackexchange.com/questions/78927/how-to-make-google-sheet-jump-to-todays-row-when-opened)。

棉花糖的回答:

function onOpen() {
 var menu = [{name: "Jump to today's date", functionName: "jumpToDate"}];
 SpreadsheetApp.getActiveSpreadsheet().addMenu("Custom", menu);
 jumpToDate();
}

function jumpToDate() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = ss.getActiveSheet();
 var range = sheet.getRange("A:A");
 var values = range.getValues();  
 var day = 24*3600*1000;  
 var today = parseInt((new Date().setHours(0,0,0,0))/day);  
 var ssdate; 
 for (var i=0; i<values.length; i++) {
   try {
     ssdate = values[i][0].getTime()/day;
   }
   catch(e) {
   }
   if (ssdate && Math.floor(ssdate) == today) {
     sheet.setActiveRange(range.offset(i,0,1,1));
     break;
   }    
 }
}

我修改为:

function onOpen() {
 var menu = [{name: "Jump to today's date", functionName: "jumpToDate"}];
 SpreadsheetApp.getActiveSpreadsheet().addMenu("Custom", menu);
 jumpToDate();
}

function jumpToDate() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = ss.getActiveSheet();
 var range = sheet.getRange("A2:IK2");  //given that it is in row 2
 var values = range.getValues();  
 var day = 24*3600*1000;  
 var today = ((new Date().setHours(0,0,0,0))/day);  
 var ssdate; 
 for (var i=0; i<values.length; i++) {
   try {
     ssdate = values[i][0].getTime()/day;
   }
   catch(e) {
   }
   if (ssdate && Math.floor(ssdate) == today) {
     sheet.setActiveRange(range.offset(0,i,1,1));  //to offset columns not rows
     break;
   }    
 }
}

我认为我已经考虑了从行到列的换位(范围“A:A”到“A2:IK2”并更改了指示的偏移量;但是,我没有看到代码有任何效果。更不用说开到今天。

我在这里缺少什么?有什么建议吗?

【问题讨论】:

  • 请注意,((new Date().setHours(0,0,0,0))/day) 真的不需要所有这些括号,请考虑:new Date().setHours(0,0,0,0) / day。除非您的时区是格林威治标准时间,否则结果将有一个小数部分,因为您将本地时间设置为零,而不是 UTC 小时,所以不是自纪元以来的整天,所以Math.floor(ssdate) == today(截断小数部分)永远不会除非您的时区是 GMT(因此没有小数部分),否则为 true。

标签: javascript date google-sheets editor


【解决方案1】:

转置需要更改的另外两个地方是:values[0][i] 代替 values[i][0],以及 values[0].length 代替 values.length

为了解决 RobG 的言论,我还更改了比较逻辑,用直接不等式替换除法和取地板:当前时间必须在电子表格中规定的日期的开始和结束之间。

function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var range = sheet.getRange("2:2");   // get all 2nd row
  var values = range.getValues();
  var day = 24*3600*1000;  
  var now = Date.now();  
  var ssdate; 
  for (var i = 0; i < values[0].length; i++) {
    try {
      ssdate = values[0][i].getTime();
    }
    catch(e) {
    }
    if (ssdate && ssdate <= now && now < ssdate + day) {
      sheet.setActiveRange(range.offset(0,i,1,1));
      break;
    }    
  }
}

【讨论】:

  • 元,这是完美的。非常感谢!简化肯定清理了一点。事后看来,你的解释是有道理的。再次感谢!
  • 没问题;在 Stack Exchange 上,可以通过单击左侧的复选标记将解决问题的答案标记为“已接受”。
猜你喜欢
  • 2015-01-19
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
  • 2020-05-07
  • 1970-01-01
  • 2023-02-24
相关资源
最近更新 更多