8

Sto girando in tondo su questo ... Ho un foglio di calcolo che contiene due date, e ho bisogno di trovare il numero di anni trascorsi tra i due (cioè l'età di qualcuno in una certa data; questo è un sostituto di DATEDIF di Excel).Conversione della data del foglio di lavoro Google in un oggetto Date JS?

Il primo passo è convertire il numero di serie di Google in un oggetto Date JS, ma non sembra che il costruttore Date lo faccia. Qualche idea?

Grazie.

+0

Dai un'occhiata alla formula in questo foglio di calcolo: https://docs.google.com/spreadsheet/ccc?key=0AqhqY231XZd3cFBiY2VqeWdmNWdaZ1BqVVZ2Q1pxWVE&hl=en#gid=0 – jfriend00

+0

No go, ho paura - non puoi usare funzioni di fogli di calcolo in app-script, quindi devi scriverlo da zero. – EML

+0

L'ultimo post in [questo thread] (http://productforums.google.com/forum/#!category-topic/apps-script/services/47tY3PTkExo) suggerisce che è possibile ottenere la data del foglio di calcolo, utilizzare alcune utilità javascript del foglio di calcolo per convertirlo in un formato di testo che può essere gestito dal costruttore di date javascript e quindi alimentare quella stringa con il costruttore di date javascript. Se si prende sul serio Googling questo problema, ho il sospetto che troverete una risposta. – jfriend00

risposta

1

Per "numero di serie" suppongo che tu stia parlando di un tempo unix in secondi o millisecondi dell'epoca. Puoi semplicemente utilizzare l'oggetto standard Data JavaScript:

new Date(value); 

Google è tuo amico da lì. Ecco alcuni riferimenti per iniziare voi fuori:

Javascript permette di fare una semplice sottrazione con due date, è restituendo la differenza di tempo in ms.

var timeDiffInMS = date2 - date1; 

Questo dovrebbe essere tutto ciò che serve per capirlo, quindi lascio il calcolo anni come esercizio per il lettore.

+0

Google sembra memorizzare i valori delle date nello stesso modo di Excel, come giorni dall'ultimo giorno del 1899, quindi Google deve fare un po 'di magia da qualche parte. Ancora, 'nuova data (valore)' funziona, quindi ti segnerò ... :) – EML

1

Dopo un po 'di sperimentazioni, si è scoperto che funziona, ed è stata una sorpresa. new Date(cell) sembra convertire internamente il numero seriale in una stringa che è sufficiente per creare l'oggetto data. risposta completa:

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

So che sei felice con la soluzione così com'è, ma volevo solo aggiungere le mie osservazioni di come le offerte di Google Apps Script con "date", sia passato in una funzione personalizzata, o recuperate da una cella con getValue().

La mia regola è che se Sheets (il foglio di calcolo) sta fornendo un valore formattato come una data (o con la coercizione automatica, o l'impostazione del formato utente), allora Google Apps Script terrà automaticamente questo valore come un oggetto data.

Esempio:

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

Se si immette 1/1/13 in A1, e in un'altra cella si richiama =returnDate(A1), ritornerà la stessa data (come sarebbe se semplicemente avuto return value; nel codice). Tuttavia, guarda cosa succede quando formatthi A1 come "Normale" (convertilo in un valore numerico). Qui, il "Numero di serie di fogli" (numero di giorni dal 30/12/1899) viene convertito in un oggetto data da Google Apps Script, ma in GAS viene "considerato" come il numero di millisecondi dalla mezzanotte 1/1/1970 . Quindi potresti ottenere risultati imprevisti se passi valori numerici che ritieni rappresentativi di una data.

confronta anche:

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

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

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

=returnDate("1/1/13")

=returnDate("1/1/2013")

Gli ultimi due "funzionano", poiché new Date() crea correttamente l'oggetto data da una stringa valida, ma nota che Fogli automaticamente costringe al secolo corrente, mentre GAS costringe un anno a due cifre al 1900.

Quindi IMO se si desidera che si comporti esattamente come in Excel (ovvero, "considera" un valore numerico come un numero seriale per una data), sarà necessario prima verificare se il parametro passato è una data oggetto (o stringa di testo "valida") e, in caso contrario, convertirlo matematicamente da "giorni dal 30/12/1899" a "millisecondi da 1/1/1970" e quindi new Date() esso.

Ci scusiamo per il posto molto prolisso.

+0

Una versione della funzione che Adam descrive è in [questa risposta] (http://stackoverflow.com/a/33813783/ 1.677.912). – Mogsdad

2

Questo è quello che ho fatto:

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

questo può sembrare un po 'sporca, ma questa è l'unica soluzione che ho trovato per ora

6

Per convertire una data foglio di calcolo di Google per una data javascript:

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

per convertire una data javascript per un Google data foglio di calcolo:

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