18

私はこれについてぐるぐる回っています... 2 つの日付を保持するスプレッドシートがあり、2 つの間の経過年数を見つける必要があります (つまり、特定の日付での誰かの年齢; これはExcel の DATEDIF の代替)。

最初のステップは、Google のシリアル番号を JS Date オブジェクトに変換することですが、これを行う Date コンストラクターはないようです。何か案は?

ありがとう。

4

8 に答える 8

11

現状のソリューションに満足していることは承知していますが、カスタム関数で渡されるか、getValue()を使用してセルから取得される、GoogleAppsScriptが「日付」をどのように処理するかについての観察結果を追加したいと思います。

私の目安では、スプレッドシート(​​スプレッドシートアプリケーション)が日付としてフォーマットされた値を提供している場合(自動強制またはユーザーがフォーマットを設定することにより)、GoogleAppsScriptはこの値を日付オブジェクトとして自動的に保持します。

例えば:

function returnDate(value) {
  return new Date(value);  
}

A1に入力1/1/13し、別のセルで呼び出す=returnDate(A1)と、同じ日付が返されます(return value;コードに入力した場合と同じように)。ただし、A1を「通常」としてフォーマット(数値に変換)するとどうなるか注意してください。ここでは、「スプレッドシートのシリアル番号」(1899年12月30日からの日数)はGoogle Apps Scriptによって日付オブジェクトに変換されますが、GASでは1970年1月1日午前0時からのミリ秒数として「見なされます」 。したがって、日付を表すと思われる数値を渡すと、予期しない結果が生じる可能性があります。

また、比較してください:

=returnDate(DATE(2013;1;1))

=returnDate(VALUE("1/1/13"))

=returnDate(DATEVALUE("1/1/13"))

=returnDate("1/1/13")

=returnDate("1/1/2013")

後者の2つnew Date()は、有効な文字列から日付オブジェクトを正常に作成するため「機能」しますが、Sheetsは自動的に現在の世紀に強制され、GASは2桁の年を1900年代に強制することに注意してください。

したがって、IMOをExcelの場合とまったく同じように動作させたい場合(つまり、数値を日付のシリアル番号として「見なす」場合)、渡されたパラメーターが日付オブジェクトであるかどうかを最初にテストする必要があります(または「有効な「テキスト文字列」)、そうでない場合は、数学的に「1899年12月30日からの日数」から「1970年1月1日からのミリ秒」に変換してからnew Date()

長い間お詫び申し上げます。

于 2013-01-16T20:36:16.923 に答える
7

これは私がしたことです:

function numberToDate(number){
  var date = new Date(number * 24 * 60 * 60 * 1000);
  date.setFullYear(date.getFullYear() - 70);
  date.setDate(date.getDate() - 1);
  return (date);
}

これは少し汚いように見えるかもしれませんが、これが今のところ私が見つけた唯一の解決策です

于 2016-10-25T13:12:09.423 に答える
1

さらに実験を重ねた結果、うまくいくことがわかりました。これには少し驚きました。new Date(cell)日付オブジェクトを作成するのに十分な文字列にシリアル番号を内部的に変換するようです。完全な答え:

function datedif(first, second, format) {
  var e1  = new Date(first);
  var e2  = new Date(second);
  var age = e2.getFullYear() - e1.getFullYear();
  if(
      (e2.getMonth() <  e1.getMonth()) || 
     ((e2.getMonth() == e1.getMonth()) && (e2.getDate() < e1.getDate())))
    age--;
  return age;
}
于 2013-01-16T17:12:47.320 に答える
-2

「シリアル番号」によって、エポックからの秒またはミリ秒単位のUNIX時間について話していると思います。標準の Javascript Date オブジェクトを簡単に使用できます。

new Date(value);

グーグルはあなたの友達です。ここにあなたを始めるためのいくつかの参考文献があります:

Javascript を使用すると、2 つの日付で単純な減算を実行して、時差をミリ秒で返すことができます。

var timeDiffInMS = date2 - date1;

理解するために必要なのはこれだけなので、年数の計算は読者の演習として残しておきます。

于 2013-01-16T17:12:16.617 に答える