3

この質問のテストケースを抽出しようとして、再び完全に混乱するまで、これがどのように機能するかを理解し始めていると本当に思っていました。

Googleスプレッドシートを使用すると、次のようなカスタム関数を記述できます。

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

25分21秒の不一致があります。一体何?

また、スクリプトから日付オブジェクトを返し、時刻としてフォーマットする場合は、次のように実行できます。

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の入力が与えられた場合)、次のような日付としてフォーマットされます。

1970年1月1日01:00:00

これは、より伝統的な1970年の時代から1時間後に解釈されているように見えますか?私が以前に見た振る舞いは、25m 21sのオフセットで少し対称的であると思いました、そして私は見るでしょう:

10:34:39

私のテストケースはここにあります

4

2 に答える 2

1

= dateToSeconds()とtest()関数の動作には、何か奇妙なことが起こっているようです。2つの間に時間の不一致を引き起こしているバグがあるようです。課題追跡システムでそのバグを報告してください。

ただし、セルの数値フォーマットを使用することで、これを機能させることができました。スプレッドシートの私の変更されたコピーを見てください。セルA2に「29/04/201211: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;
}

それがお役に立てば幸いです。

于 2012-04-29T15:00:36.410 に答える
0

正しい値を取得する方法については、この投稿を参照してください。スプレッドシートの時間とJavaスクリプトの時間は同じではないため、開始点が異なるため、修正係数があります。

GAS:Googleスプレッドシートから正しい時間値を読み取る方法

于 2013-07-19T06:01:26.857 に答える