Javascript 如何从2个单元格中添加小时数?

Javascript 如何从2个单元格中添加小时数?,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我有一些谷歌电子表格日志,其中我以小时格式[[HH]:MM:SS]存储了一些活动的持续时间。电子表格中添加的这些单元格没有任何问题。然而,当我试图通过谷歌脚本添加它们时,我得到了一些垃圾。我发现Date()对象是为这些单元格隐式创建的,但我找不到该值类型的API 我知道我可以通过将数据乘以24将其转换为“小时整数”,但这是一个棘手的解决办法,因为它需要许多单元格的重复。我更希望有一个解决方案能够在谷歌脚本中实现这一点。这里有一个可以实现这一点的工作函数 我第一次尝试将其格式化为日期,但36小时并

我有一些谷歌电子表格日志,其中我以小时格式[[HH]:MM:SS]存储了一些活动的持续时间。电子表格中添加的这些单元格没有任何问题。然而,当我试图通过谷歌脚本添加它们时,我得到了一些垃圾。我发现Date()对象是为这些单元格隐式创建的,但我找不到该值类型的API


我知道我可以通过将数据乘以24将其转换为“小时整数”,但这是一个棘手的解决办法,因为它需要许多单元格的重复。我更希望有一个解决方案能够在谷歌脚本中实现这一点。

这里有一个可以实现这一点的工作函数

我第一次尝试将其格式化为日期,但36小时并不是真正的标准!!所以我做了一点数学:-))

要使其正常工作,您应该在某处设置一个单元格,其值为
00:00:00
,我们将在电子表格标准中用作参考日期。在我的代码中,它是cell
D1
(参见代码中的注释,SS中的参考日期是1900年,Javascript中的参考日期是1970年……这就是为什么它是一个以毫秒为单位的70年负常量…)

这是代码,下面是测试表+记录器的屏幕截图 最好修改此代码,使其成为一个以单元格值为参数并以数组形式返回结果的函数。例如([h,m,s]或类似内容),此代码仅用于说明其工作原理

function addHoursValues() {
  var sh = SpreadsheetApp.getActive()
  var hours1 = sh.getRange('A1').getValue();
  var hours2 = sh.getRange('B1').getValue();
  var ref = sh.getRange('D1').getValue().getTime();
//var ref = -2209161600000 // you could also use this but it would be less obvious what it really does ;-)
Logger.log(ref+' = ref');
  var h1 = parseInt((hours1.getTime()/3600000)-ref/3600000);
  var h2 = parseInt((hours2.getTime()/3600000)-ref/3600000);
Logger.log(h1+' + '+h2+' = '+(h1+h2))
  var m1 = parseInt((hours1.getTime()-h1*3600000-ref)/60000);
  var m2 = parseInt((hours2.getTime()-h2*3600000-ref)/60000);
Logger.log(m1+' + '+m2+' = '+(m1+m2))
  var s1 = parseInt((hours1.getTime()-h1*3600000-m1*60000-ref)/1000);
  var s2 = parseInt((hours2.getTime()-h2*3600000-m2*60000-ref)/1000);
Logger.log(s1+' + '+s2+' = '+(s1+s2))
  var ts=s1+s2
  var tm=m1+m2
  var th=h1+h2
    if(ts>59){ts=ts-60;tm++};
    if(tm>59){tm=tm-60;th++}
Logger.log('sum = '+th+':'+tm+':'+ts)
}


编辑:这里有两个“函数”版本,带有相应的测试函数,说明如何使用它

function getHMS(hrs) {
  var t = hrs.getTime()/1000;
  var ref = -2209161600;
  var h = parseInt((t-ref)/3600);
  var m = parseInt((t-h*3600-ref)/60);
  var s = parseInt(t-h*3600-m*60-ref);
  return[h,m,s];// returns an array of 3 discrete values
}

function testHMS(){
  var sh = SpreadsheetApp.getActive();

  var hours1 = sh.getRange('A1').getValue();
  var hours2 = sh.getRange('B1').getValue();

  var sumS = getHMS(hours1)[2]+getHMS(hours2)[2];// add seconds
  var sumM = getHMS(hours1)[1]+getHMS(hours2)[1];// add minutes
  var sumH = getHMS(hours1)[0]+getHMS(hours2)[0];// add hours
    if(sumS>59){sumS=sumS-60 ; sumM++}; // handles values >59
    if(sumM>59){sumM=sumM-60 ; sumH++}; // handles values >59
  Logger.log(sumH+':'+sumM+':'+sumS);
}


好的,看起来Date的API是一个JavaScript API。然而,我仍然没有设法在谷歌脚本中求和两个单元格的值,比如36:12:00和71:34:00,并得到一个有意义的结果。在电子表格中这样做很好。听起来像一个javascript问题-Google脚本是javascript经过更多的调查后,我认为问题不在Java脚本API中,而是Google使用Date()表示“小时”格式。在debugger中,我看到了一些类似于为值为
33:40:00
的单元格自动创建的
newdate(-2209045440000)
的内容。。。值日期(2209045440000)以毫秒为单位
function addHMS(hrs1,hrs2) {
  var t1 = hrs1.getTime()/1000;
  var t2 = hrs2.getTime()/1000;
  var ref = -2209161600;
  var h = parseInt((t1-ref)/3600)+parseInt((t2-ref)/3600);
  var m = parseInt((t1-parseInt((t1-ref)/3600)*3600-ref)/60)+parseInt((t2-parseInt((t2-ref)/3600)*3600-ref)/60);
  var s = parseInt(t1-parseInt((t1-ref)/3600)*3600-parseInt((t1-parseInt((t1-ref)/3600)*3600-ref)/60)*60-ref)
         +parseInt(t2-parseInt((t2-ref)/3600)*3600-parseInt((t2-parseInt((t2-ref)/3600)*3600-ref)/60)*60-ref);
    if(s>59){s=s-60 ; m++}; // handles values >59
    if(m>59){m=m-60 ; h++}; // handles values >59
  return[h,m,s];// returns sum in an array of 3 discrete values
}

function othertestHMS(){
  var sh = SpreadsheetApp.getActive();

  var hours1 = sh.getRange('A1').getValue();
  var hours2 = sh.getRange('B1').getValue();
  Logger.log(addHMS(hours1,hours2));
}