我有一组从数据库中提取的日期时间数据。问题在于数据被分成两列,一列用于日期,一列用于时间。
我正在尝试编写一个谷歌应用程序脚本,可以将它们两者结合起来,这样我就可以进行一些有意义的分析,但无济于事。
我尝试了常见的getDate(),getYear(),getMonth()或者将它们连接起来但它不起作用。
以下是电子表格的链接。 https://docs.google.com/spreadsheets/d/1VjhT7Hu8rl1wZgFxItf3unU8jN9Gw3905dNgQ9qICyI/edit#gid=0
如果有人知道如何使这些数据更易于管理,请告诉我吗?
谢谢!
答案 0 :(得分:0)
您可以在JavaScript中使用parse
来获取日期的毫秒数,然后将毫秒数添加到它:
首先创建一个新列,将时间转换为不同的值:
= TIMEVALUE(C2)
4:00:00 PM 0.6666666667
11:44:00 PM 0.9888888889
4:51:00 AM 0.2020833333
8:42:04 AM 0.3625462963
7:15:00 AM 0.3020833333
11:46:33 AM 0.4906597222
12:23:00 PM 0.5159722222
5:28:00 PM 0.7277777778
5:37:00 PM 0.7340277778
12:52:00 AM 0.03611111111
6:00:00 AM 0.25
11:49:00 AM 0.4923611111
然后运行脚本将日期转换为毫秒
var milliSkonds = Date.parse("3/21/2012");
Logger.log('milliSkonds :' + milliSkonds);
//This returns 1332302400000
使用时间值获取列的十进制值。然后将毫秒和时间值加在一起。
1332302400000.6666666667
代表2012年3月21日下午4点
我没有展示如何使用Apps脚本从电子表格中检索数据,或循环遍历每一行。这只是我建议的策略。
答案 1 :(得分:0)
另一个答案是不正确的。它混合了两种不同的东西。
在Javascript日期和时间是相同的对象,没有时间对象没有日期,没有时间没有时间:它们的原始值是从1970年1月1日午夜(这是一个整数)开始计算的毫秒数。
在电子表格中,日期的原始值为整数,表示自1899年12月31日以来的天数,时间是小数值,即一天的小数(6小时=一天的1/4,例如0.25天)。
因此,当您在电子表格中添加DATE + TIME(整数+小数) 时,您会得到一个完整的日期。
但是当然不是JavaScript的情况,你不能(显然)添加毫秒和小数值来获得有效的结果,因为JS日期中没有小数值。
有关日期的完整详情,我建议您搜索网页并查看MDN date page
关于您的具体问题,您可以运行如下所示的小功能强制格式化电子表格(尽管您也可以使用123菜单手动制作)
function myFunction() {
var sh = SpreadsheetApp.getActive().getActiveSheet();
sh.getRange('A2:A').setNumberFormat('MMM/dd/yyyy');
sh.getRange('B2:B').setNumberFormat('hh:mm:ss');
}
并使用SS中的第三列简单地添加A列和B列,然后您将获得完整的日期值(随着时间的推移,显示格式应该自动正确)
如果您无法使用这个简单的解决方案,那么日期和时间的组合会更复杂一些,请查看this recent post以获取一些建议。
以下是将所有日期和时间转换为JS日期对象的代码。
function getFullDates(){
var sh = SpreadsheetApp.getActive().getActiveSheet();
var data = sh.getDataRange().getValues();
data.shift();
for(var n in data){
var time = new Date(data[n][1]);
var date = new Date(data[n][0]);
var hrs = Number(Utilities.formatDate(time,Session.getScriptTimeZone(),'HH'));
var min = Number(Utilities.formatDate(time,Session.getScriptTimeZone(),'mm'));
var sec = Number(Utilities.formatDate(time,Session.getScriptTimeZone(),'ss'));
Logger.log('date = '+Utilities.formatDate(date, Session.getScriptTimeZone() ,'dd-MM-yyyy HH:mm:ss'));
Logger.log('time = '+hrs+':'+min+':'+sec);
var dateAndTime = new Date(date).setHours(hrs,min,sec,0);
Logger.log('full date object = '+Utilities.formatDate(new Date(dateAndTime), Session.getScriptTimeZone() ,'dd-MM-yyyy HH:mm:ss'))
}
}
注意:一定要检查你的SS TimeZone和脚本TimeZone,看来你在GMT + 8中国,我测试了这些值。
注意2:我必须在上面的代码中使用一个小技巧来获得小时/分钟和秒,因为正常的getHours(),getMinutes()getSeconds()返回错误的结果。这是一个已经在这里讨论过的问题,但我不记得确切的时间,而且我现在还没有找到帖子参考...
我只显示信息代码,随时测试以查看问题; - )。
function getFullDatesBug(){
var sh = SpreadsheetApp.getActive().getActiveSheet();
var data = sh.getDataRange().getValues();
data.shift();
for(var n in data){
var time = new Date(data[n][1]);
var date = new Date(data[n][0]);
var hrs = time.getHours();
var min = time.getMinutes();
var sec = time.getSeconds();
Logger.log('date = '+Utilities.formatDate(date, Session.getScriptTimeZone() ,'dd-MM-yyyy HH:mm:ss'));
Logger.log('time = '+hrs+':'+min+':'+sec);
var dateAndTime = new Date(date).setHours(hrs,min,sec,0);
Logger.log('full date object = '+Utilities.formatDate(new Date(dateAndTime), Session.getScriptTimeZone() ,'dd-MM-yyyy HH:mm:ss'))
}
}
答案 2 :(得分:0)
这可能是一个老问题,但也许我的解决方法可能对某人有用。 我有类似的;尝试在一个日期上撰写startTime和endTime,以便填充表单中的选项。
从电子表格中的有效选择中获取数据:
var firstRowNumber = sheet.getActiveRange().getRow();
var numRows = sheet.getActiveRange().getNumRows();
var sourceData= sheet.getRange(firstRowNumber, 1, numRows, sheet.getLastColumn()).getValues();
然后,迭代此数据集中的(两个)时间值并替换值,如:
1899年12月30日星期六10:00:00 GMT + 0100(CET)
进入所需的时间表示,如:
0时
for(var i = 0; i < sourceData.length; i++){
for(var j = 8; j < 10; j++){
sourceData[i][j] = Utilities.formatDate(new Date(sourceData[i][j]), "GMT-8", "HH:mm");
}
}
为了找出GMT的确切偏差,我对GMT +使用了一些试错值。这可能会导致不同时区出现问题,或者夏令时发生变化。
在三个活动行上,这会产生可用的开始和结束日期/时间值:
Fri Dec 30 2016 09:00:00 GMT + 0100(CET) 00:00 Fri Dec 30 2016 09:00:00 GMT + 0100(CET) 01:00 < /强>
2016年12月31日星期六09:00:00 GMT + 0100(CET) 01:30 2016年12月31日星期六09:00:00 GMT + 0100(CET) 02:15 < /强>
Thu Dec 29 2016 09:00:00 GMT + 0100(CET) 01:30 周四2016年12月29日09:00:00 GMT + 0100(CET) 02:15 < /强>
我可以使用它来填充表单中的选项。