12小时内谷歌电子表格时间格式,无法转换谷歌应用程序脚本

时间:2014-08-02 13:52:39

标签: google-apps-script

我有一组从数据库中提取的日期时间数据。问题在于数据被分成两列,一列用于日期,一列用于时间。

我正在尝试编写一个谷歌应用程序脚本,可以将它们两者结合起来,这样我就可以进行一些有意义的分析,但无济于事。

我尝试了常见的getDate(),getYear(),getMonth()或者将它们连接起来但它不起作用。

以下是电子表格的链接。 https://docs.google.com/spreadsheets/d/1VjhT7Hu8rl1wZgFxItf3unU8jN9Gw3905dNgQ9qICyI/edit#gid=0

如果有人知道如何使这些数据更易于管理,请告诉我吗?

谢谢!

3 个答案:

答案 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 < /强>

我可以使用它来填充表单中的选项。