2012-04-28 4 views
2

この質問のためにテストケースを蒸留しようとするまで、これがどのように機能するのか理解し始めていたと思っていました。GASを使用してスプレッドシートの時刻値を読み書きする

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

をし、例えば実行することにより、細胞中でそれを呼び出す:Googleスプレッドシートで

あなたは次のようにカスタム関数を書くことができます

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

をし、それが正常に動作します。そうした場合:

1970年1月1日1時00分00秒

:その後、

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分〇​​〇秒の入力を与えられました)

これは伝統的な1970年代の1時間後の1時間と解釈されていますか? 25メートルの21Sは、上記オフセットと私は私が前に見ていた行動が少し対称的だと思ったと私は見たい:

10時34分39秒

私のテストケースがhere

答えて

1

ですあなたの= dateToSeconds()とtest()関数の動作には何か変わったことがあるようです。 2人の間に時間の不一致を引き起こすバグがあるようです。 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; 
} 

関連する問題