8

Ich bin auf diesem hier im Kreis gelaufen ... Ich habe eine Tabelle, die zwei Daten enthält, und ich muss die Anzahl der verstrichenen Jahre zwischen den beiden finden (dh Alter einer Person zu einem bestimmten Datum; Dies ist ein Ersatz für DATEDIF von Excel.Google Tabellendatum in ein JS Date Objekt konvertieren?

Der erste Schritt besteht darin, Googles Seriennummer in ein JS Date-Objekt zu konvertieren, aber es scheint kein Date-Konstruktor zu sein, der dies tut. Irgendwelche Ideen?

Danke.

+0

Werfen Sie einen Blick auf die Formeln in dieser Tabelle: https://docs.google.com/spreadsheet/ccc?key=0AqhqY231XZd3cFBiY2VqeWdmNWdaZ1BqVVZ2Q1pxWVE&hl=de#gid=0 – jfriend00

+0

Nein gehen, fürchte ich - Sie können nicht verwenden Tabellenkalkulationsfunktionen in Apps-Skript, so dass Sie es von Grund auf neu schreiben müssen. – EML

+0

Der letzte Beitrag in [this thread] (http://productforums.google.com/forum/#!category-topic/apps-script/services/47tY3PTkExo) schlägt vor, dass Sie das Tabellendatum erhalten können, verwenden Sie einige Tabellenkalkulation Javascript-Dienstprogramme um es in ein Textformat zu konvertieren, das der JavaScript-Datumskonstruktor verarbeiten kann, und diese Zeichenfolge dann dem JavaScript-Datumskonstruktor zuzuführen. Wenn Sie dieses Problem googeln, werden Sie vermutlich eine Antwort finden. – jfriend00

Antwort

1

Mit "Seriennummer" vermute ich Sie sprechen über eine Unix-Zeit in Sekunden oder Millisekunden aus der Epoche. Sie können einfach das Standard-Javascript Date-Objekt verwenden:

new Date(value); 

Google ist dein Freund von dort. Hier einige Referenzen Sie beginnen:

Javascript ermöglicht es Ihnen, einfache Subtraktion mit zwei Termine zu tun, können Sie die Zeitdifferenz in ms zurück.

var timeDiffInMS = date2 - date1; 

Das ist alles was Sie brauchen, um es herauszufinden sein sollte, so werde ich für den Leser die Jahre Berechnung als Übung verlassen.

+0

Google scheint Datumswerte auf die gleiche Weise wie Excel zu speichern, so wie Tage vor dem letzten Tag des Jahres 1899, also muss Google irgendwo etwas Magie machen. Trotzdem funktioniert 'neues Datum (Wert)', also markiere ich Sie ... :) – EML

1

Nach einigen weiteren Experimenten stellte sich heraus, dass es einfach funktioniert, was eine kleine Überraschung war. new Date(cell) scheint intern auf die Seriennummer in einen String zu umwandeln, die das Date-Objekt zu erstellen ausreichend ist. Vollständige Antwort:

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

Ich weiß, dass Sie mit Ihrer Lösung zufrieden sind, wie es steht, aber ich wollte nur meine Beobachtungen, wie Google Apps Script beschäftigt sich mit „dates“ hinzuzufügen, entweder in einer benutzerdefinierten Funktion übergeben, oder abgerufen aus einer Zelle mit getValue().

Faust Meine Regel ist, dass, wenn Sheets (das Tabellenkalkulationsprogramm) ist ein Wert Bereitstellung als Datum formatiert (entweder durch automatische Zwang oder der Benutzer das Format einstellen), dann Google Apps Script automatisch diesen Wert halten als ein Datumsobjekt.

ZB:

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

Wenn Sie 1/1/13 in A1 eingeben und in einer anderen Zelle, die Sie aufrufen =returnDate(A1), wird es das gleiche Datum zurückkehren (wie wäre es, wenn Sie einfach return value; im Code hatte). Beachten Sie jedoch, was passiert, wenn Sie A1 als "Normal" formatieren (konvertieren Sie es in einen numerischen Wert). Hier wird die "Sheets-Seriennummer" (Anzahl der Tage ab dem 30.12.1899) von Google Apps Script in ein Datumsobjekt konvertiert, in GAS wird sie jedoch ab Mitternacht des 1.1.1970 als die Anzahl der Millisekunden "betrachtet" . Sie erhalten also möglicherweise unerwartete Ergebnisse, wenn Sie numerische Werte übergeben, von denen Sie glauben, dass sie für ein Datum repräsentativ sind.

Vergleichen Sie auch:

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

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

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

=returnDate("1/1/13")

=returnDate("1/1/2013")

Die letzten beiden "funktionieren", weil new Date() das Datumsobjekt erfolgreich aus einer gültigen Zeichenfolge erstellt, aber beachten Sie, dass Sheets automatisch das aktuelle Jahrhundert erzwingt, während GAS ein zweistelliges Jahr um die 1900 erzwingt.

Also IMO, wenn Sie wollten, dass es sich genauso verhält wie in Excel (das heißt, einen numerischen Wert als Seriennummer für ein Datum ansehen), müssten Sie zuerst testen, ob der übergebene Parameter ein Datum ist Objekt (oder "gültige" Textzeichenfolge), und wenn nicht, wandeln Sie es mathematisch von "Tage vom 30/12/1899" in "Millisekunden vom 1/1/1970" und dann new Date() um.

Entschuldigung für die langatmige Post. Diese

+0

Eine Version der Funktion, die Adam beschreibt, ist in [dieser Antwort] (http://stackoverflow.com/a/33813783/) 1677912). – Mogsdad

2

ist das, was ich getan habe:

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

Dies kann ein bisschen schmutzig erscheinen, aber dies ist die einzige Lösung, die ich jetzt gefunden

6

ein Google-Tabelle Datum zu einem Javascript Datum konvertieren:

var JSdate = Date.parse(Cell.getValue()) 

um ein Javascript-Datum in ein Google-Tabelle Datum zu konvertieren:

function GoogleDate(JSdate) { 
    var D = new Date(JSdate) ; 
    var Null = new Date(Date.UTC(1899,11,30,0,0,0,0)) ; // the starting value for Google 
    return ((D.getTime() - Null.getTime())/60000 - D.getTimezoneOffset())/1440 ; 
}