2013-03-24 86 views
0

我有一些谷歌電子表格日誌,我以小時格式[[HH]:MM:SS]存儲一些活動的持續時間。電子表格添加這樣的單元格沒有問題。但是,當我嘗試通過Google腳本添加它們時,我得到了一些垃圾。我發現Date()對象是爲這些單元格隱式創建的,但是我找不到該值類型的API。如何在2個單元格中添加小時?

我知道我可以通過將它們乘以24來將數據轉換爲「小時整數」,但這是一個討厭的解決方法,因爲它需要複製許多單元格。我寧願喜歡一個解決方案,將允許在谷歌腳本本身做到這一點。

+0

好吧,它似乎是一個JavaScript中的日期API。不過,我仍然沒有設法在Google Script中添加兩個像36:12:00和71:34:00這樣的值的單元格,並得到一個有意義的結果。在電子表格中這樣做工作正常。 – 2013-03-24 19:31:18

+0

聽起來像一個JavaScript問題 - 谷歌腳本是Javascript – eddyparkinson 2013-03-25 23:57:35

+0

經過更多調查後,我認爲問題不在於Java Script API,而是谷歌使用Date()作爲「Hours」格式的事實。在調試器中,我看到類似'new Date(-2209045440000)'自動爲值爲33:40:00的單元格創建。 – 2013-03-26 08:02:35

回答

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

enter image description here

enter image description here


編輯:這裏有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); 
} 

OR

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)); 
} 
相關問題