【发布时间】: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