0

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

我知道我可以通过将数据乘以 24 将数据转换为“小时整数”,但这是一个令人讨厌的解决方法,因为它需要复制许多单元格。我更想要一个允许在谷歌脚本本身中做到这一点的解决方案。

4

1 回答 1

2

这是一个可以解决问题的工作函数。

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

要使其正常工作,您应该在某处设置一个带有值的单元格00:00:00,我们将在电子表格标准中将其用作参考日期。在我的代码中它是单元格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)
}

在此处输入图像描述

在此处输入图像描述


编辑:这里有 2 个“功能”版本,带有相应的测试功能,展示了如何使用它

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);
}

或者

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));
}
于 2013-03-29T22:08:53.840 回答