2012-04-28 80 views
2

我真的以爲我開始明白這是如何工作的,直到我試圖爲這個問題提煉出一個測試用例並且再次感到困惑。使用GAS從電子表格讀取/寫入時間值

隨着谷歌電子表格,你可以寫一個自定義的函數是這樣的:

function dateToSeconds(date) { 
    var hours = date.getHours(); 
    var minutes = date.getMinutes(); 
    var seconds = date.getSeconds(); 
    return (hours*3600) + (minutes*60) + seconds; 
} 

,並通過例如做調用它在細胞

=dateToSeconds(A1) 

並且它符合你的期望。然而,如果你這樣稱呼它:

function test() { 
    var sheet = SpreadsheetApp.getActiveSheet(); 

    sheet.getRange("A2").setValue(dateToSeconds(sheet.getRange("A1").getValue())); 
} 

有25m 21s的差異。有沒有搞錯?

此外,如果您想從腳本返回日期對象,以便將其格式化爲時間,則可以執行

function newTime(hours, minutes, seconds) { 
    // 1899-12-30 is the epoch for time values, it seems 
    // http://stackoverflow.com/questions/4051239/how-to-merge-date-and-time-as-a-datetime-in-google-apps-spreadsheet-script 
    return new Date(1899, 11, 30, hours, minutes, seconds, 0); 
} 

並做叫它:

=newTime(A1, A2, A3) 

,它工作正常。如果你這樣做:

function test() { 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var values = sheet.getRange("A1:C3").getValues(); 
    sheet.getRange("D3").setValue(newTime(values[0], values[1], values[2])); 
} 

然後(給出的11:00:00的輸入),它被格式化爲像一個日期:

01/01/1970 01:00:00

看起來它被解釋爲更傳統的1970年代後一個小時?我想我以前見過的行爲是有點對稱的25米-21上述偏移和我會看到:

10時34分39秒

我的測試用例是here

回答

1

你的= dateToSeconds()和你的test()函數的行爲看起來有些奇怪。看起來有一個錯誤導致了兩者之間的時間差異。請在issue tracker中提出一個錯誤。

但是我可以通過在單元格上使用數字格式來獲得此工作。看看我的modified copy of your spreadsheet。在單元格A2中輸入「29/04/2012 11:00:00」,然後設置格式>數字> 15:59:00時間。您也可以使用Range.setNumberFormat(「HH:mm:ss」)以編程方式執行此操作;這導致單元格A2顯示11:00:00。

然後,我修改了測試功能,有這樣的代碼:

function test() { 
    var sheet = SpreadsheetApp.getActiveSheet(); 

    sheet.getRange("E2").setValue(dateToSeconds(sheet.getRange("A2").getValue())); 
    Logger.log(sheet.getRange("A2").getValue()); 
    Logger.log(sheet.getRange("A2").getNumberFormat()); 

    var values = sheet.getRange("A4:C4").getValues(); 
    Logger.log(values[0][0] + " " + values[0][1] + " " + values[0][2]); 
    sheet.getRange("E4").setValue(newTime2(values[0][0], values[0][1], values[0][2])).setNumberFormat("HH:mm:ss"); 
} 

,而不是NEWTIME功能,我創建了一個newTime2與此代碼:

function newTime2(hours, minutes, seconds) { 
    var date = new Date(); 
    date.setHours(hours); 
    date.setMinutes(minutes); 
    date.setSeconds(seconds); 
    Logger.log(date); 
    return date; 
} 

我希望幫助。

相關問題