我有一些谷歌電子表格日誌,我以小時格式[[HH]:MM:SS]存儲一些活動的持續時間。電子表格添加這樣的單元格沒有問題。但是,當我嘗試通過Google腳本添加它們時,我得到了一些垃圾。我發現Date()對象是爲這些單元格隱式創建的,但是我找不到該值類型的API。如何在2個單元格中添加小時?
我知道我可以通過將它們乘以24來將數據轉換爲「小時整數」,但這是一個討厭的解決方法,因爲它需要複製許多單元格。我寧願喜歡一個解決方案,將允許在谷歌腳本本身做到這一點。
我有一些谷歌電子表格日誌,我以小時格式[[HH]:MM:SS]存儲一些活動的持續時間。電子表格添加這樣的單元格沒有問題。但是,當我嘗試通過Google腳本添加它們時,我得到了一些垃圾。我發現Date()對象是爲這些單元格隱式創建的,但是我找不到該值類型的API。如何在2個單元格中添加小時?
我知道我可以通過將它們乘以24來將數據轉換爲「小時整數」,但這是一個討厭的解決方法,因爲它需要複製許多單元格。我寧願喜歡一個解決方案,將允許在谷歌腳本本身做到這一點。
這裏是一個工作函數,可以做到這一點。
我第一次嘗試將其格式化爲日期,但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);
}
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));
}
好吧,它似乎是一個JavaScript中的日期API。不過,我仍然沒有設法在Google Script中添加兩個像36:12:00和71:34:00這樣的值的單元格,並得到一個有意義的結果。在電子表格中這樣做工作正常。 – 2013-03-24 19:31:18
聽起來像一個JavaScript問題 - 谷歌腳本是Javascript – eddyparkinson 2013-03-25 23:57:35
經過更多調查後,我認爲問題不在於Java Script API,而是谷歌使用Date()作爲「Hours」格式的事實。在調試器中,我看到類似'new Date(-2209045440000)'自動爲值爲33:40:00的單元格創建。 – 2013-03-26 08:02:35