14

時間形式のセル (hh:mm:ss) から時間の値を取得しようとしています。値は 24:00:00 よりも大きくなる可能性があります。たとえば、20000:00:00 は 20000 になります。

テーブル:

2 つの Google スプレッドシート

E1の値を読んだ場合:

var total = sheet.getRange("E1").getValue();
Logger.log(total);

結果は次のとおりです。

4 月 12 日(土)07:09:21 GMT+00:09 1902

今、私はそれを Date オブジェクトに変換して、その Unix タイムスタンプを取得しようとしました:

  var date = new Date(total);
  var milsec = date.getTime();
  Logger.log(Utilities.formatString("%11.6f",milsec));
  var hours = milsec / 1000 / 60 / 60; 
  Logger.log(hours)

1374127872020.000000

381702.1866722222

問題は、 20000 の正しい値を取得する方法です。

4

5 に答える 5

20

Serge が行ったことを拡張して、スプレッドシートとスクリプトのタイムゾーンの違いを考慮し、読みやすくする関数をいくつか書きました。

function getValueAsSeconds(range) {
  var value = range.getValue();

  // Get the date value in the spreadsheet's timezone.
  var spreadsheetTimezone = range.getSheet().getParent().getSpreadsheetTimeZone();
  var dateString = Utilities.formatDate(value, spreadsheetTimezone, 
      'EEE, d MMM yyyy HH:mm:ss');
  var date = new Date(dateString);

  // Initialize the date of the epoch.
  var epoch = new Date('Dec 30, 1899 00:00:00');

  // Calculate the number of milliseconds between the epoch and the value.
  var diff = date.getTime() - epoch.getTime();

  // Convert the milliseconds to seconds and return.
  return Math.round(diff / 1000);
}

function getValueAsMinutes(range) {
  return getValueAsSeconds(range) / 60;
}

function getValueAsHours(range) {
  return getValueAsMinutes(range) / 60;
}

これらの関数は次のように使用できます。

var range = SpreadsheetApp.getActiveSheet().getRange('A1');
Logger.log(getValueAsHours(range));

言うまでもなく、範囲から時間数を取得するのは大変な作業です。セルからリテラル文字列値を取得する機能のリクエストであるIssue 402にスターを付けてください。

于 2013-07-18T15:09:50.067 に答える
13

2 つの新しい関数がありgetDisplayValue()getDisplayValues()日時またはスプレッドシートで表示されるものとまったく同じものを返します。こちらのドキュメントをご覧ください

于 2016-10-09T05:33:10.103 に答える