8

Kręciłem się w kółko po tej ... Mam arkusz kalkulacyjny, który zawiera dwie daty, i muszę znaleźć liczbę upływających lat między tymi dwoma (tj. Czyjś wiek w danej dacie; jest to zamiennik dla DATEDIF Excela).Konwertowanie daty arkusza kalkulacyjnego Google na obiekt Data JS?

Pierwszym krokiem jest zamiana numeru seryjnego Google w obiekt JS Date, ale nie wygląda to na konstruktor Date, który to robi. Jakieś pomysły?

Dzięki.

+0

Spójrz na wzór w tym arkuszu: https://docs.google.com/spreadsheet/ccc?key=0AqhqY231XZd3cFBiY2VqeWdmNWdaZ1BqVVZ2Q1pxWVE&hl=en#gid=0 – jfriend00

+0

no Go, obawiam się - nie można używać funkcje arkusza kalkulacyjnego w skryptach aplikacji, więc musisz napisać to od podstaw. – EML

+0

Ten ostatni wpis w [tym wątku] (http://productforums.google.com/forum/#!category-topic/apps-script/services/47tY3PTkExo) sugeruje, że możesz pobrać datę arkusza kalkulacyjnego, użyć niektórych narzędzi javascript dla arkusza kalkulacyjnego przekonwertować go do formatu tekstowego, który konstruktor daty javascript może obsłużyć, a następnie przekazać ten ciąg do konstruktora daty javascript. Jeśli poważnie myślisz o Googlowaniu tego problemu, podejrzewam, że znajdziesz odpowiedź. – jfriend00

Odpowiedz

1

Przez "numer seryjny" Zgaduję, że mówisz o czasie unixowym w sekundach lub milisekundach od epoki. Możesz po prostu użyć standardowego obiektu JavaScript Date:

new Date(value); 

Google jest twoim przyjacielem. Oto niektóre odniesienia, aby rozpocząć you off:

JavaScript pozwala wykonywać proste odejmowanie z dwoma datami, wracając Ci różnicę czasową w ms.

var timeDiffInMS = date2 - date1; 

To powinno być wszystko, czego potrzeba, aby to zrozumieć, więc zostawiam obliczenia lat jako ćwiczenie dla czytelnika.

+0

Google wydaje się przechowywać wartości daty w taki sam sposób jak Excel, jako dni od ostatniego dnia 1899 roku, więc Google musi gdzieś robić magię. Nadal "działa nowa data (wartość)", więc zaznaczę cię ... :) – EML

1

Po kilku dalszych eksperymentach okazało się, że to działa, co było trochę niespodzianką. new Date(cell) wydaje się wewnętrznie przekonwertować numer seryjny na ciąg znaków, który jest wystarczający do utworzenia obiektu daty. Pełna odpowiedź:

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

wiem, że jesteś zadowolony z rozwiązania, gdyż stoi, ale ja po prostu chciałem dodać moje spostrzeżenia, w jaki zajmuje Google Apps Script z „dat”, albo przekazywane w funkcji niestandardowej lub pobierane z komórki z getValue().

Moja zasada jest taka, że ​​jeśli arkuszy (arkusz kalkulacyjny) jest dostarczanie wartości sformatowany jako daty (albo poprzez automatyczną przymusu lub ustawienie formatu użytkownika), a następnie Google Apps Script zostanie automatycznie utrzymać tę wartość jako obiekt daty.

Np

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

Jeśli wpiszesz 1/1/13 w A1, aw innej komórce wywołać =returnDate(A1), zwróci tę samą datę (jak to będzie, jeśli po prostu miał return value; w kodzie). Jednak obserwuj, co się dzieje, gdy formatujesz A1 jako "Normalny" (przekształcasz go na wartość liczbową). W tym miejscu "Numer seryjny arkusza" (liczba dni od 30.12.1999) jest konwertowany na obiekt daty przez Google Apps Script, ale w GAS jest on "traktowany" jako liczba milisekund od północy 1/1/1970 . Możesz więc uzyskać nieoczekiwane wyniki, jeśli podajesz wartości liczbowe, które Twoim zdaniem są reprezentatywne dla danej daty.

porównać również:

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

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

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

=returnDate("1/1/13")

=returnDate("1/1/2013")

Dwie ostatnie "prace", ponieważ new Date() pomyślnie tworzą obiekt daty z prawidłowego ciągu, ale zauważają, że Arkusze automatycznie przymuszają do obecnego wieku, podczas gdy GAS wymusza dwucyfrowy rok do lat 1900.

Tak więc IMO, jeśli chcesz, aby zachowywał się dokładnie tak, jak w Excelu (to znaczy "uwzględnij" wartość liczbową jako numer seryjny dla daty), musisz najpierw sprawdzić, czy przekazany parametr jest datą obiekt (lub "poprawny" ciąg tekstowy), a jeśli nie, przekształć go matematycznie z "dni z 30/12/1899" na "milisekundy od 1/1/1970", a następnie new Date().

Przeprosiny za długotrwały post.

+0

Wersja funkcji opisywanej przez Adama znajduje się w [tej odpowiedzi] (http://stackoverflow.com/a/33813783/ 1677912). – Mogsdad

2

To co zrobiłem:

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

To może wydawać się trochę brudny, ale to jest jedyne rozwiązanie znalazłem na razie

6

Aby przekonwertować datę arkusza kalkulacyjnego Google do daty javascript:

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

aby przekonwertować datę javaScript, żeby data Google kalkulacyjnym:

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 ; 
} 
Powiązane problemy