8

Tôi đã đi vòng trong vòng tròn trên này ... Tôi đã có một bảng tính chứa hai ngày, và tôi cần phải tìm số lượng năm trôi qua giữa hai (ví dụ như tuổi của một ai đó tại một ngày nhất định; đây là sự thay thế cho DATEDIF của Excel).Chuyển đổi ngày bảng tính của Google thành đối tượng Ngày tháng JS?

Bước đầu tiên là chuyển số sê-ri của Google thành đối tượng Ngày tháng, nhưng dường như không có hàm tạo ngày thực hiện việc này. Bất kỳ ý tưởng?

Cảm ơn.

+0

Hãy xem công thức trong bảng tính này: https://docs.google.com/spreadsheet/ccc?key=0AqhqY231XZd3cFBiY2VqeWdmNWdaZ1BqVVZ2Q1pxWVE&hl=vi#gid=0 – jfriend00

+0

Không, tôi sợ - bạn không thể sử dụng các hàm bảng tính trong ứng dụng-script, vì vậy bạn phải viết nó từ đầu. – EML

+0

Bài đăng cuối cùng trong [chủ đề này] (http://productforums.google.com/forum/#!category-topic/apps-script/services/47tY3PTkExo) gợi ý rằng bạn có thể lấy ngày bảng tính, sử dụng một số tiện ích javascript của bảng tính để chuyển đổi nó thành định dạng văn bản mà hàm tạo ngày javascript có thể xử lý và sau đó cấp chuỗi đó cho hàm tạo ngày javascript. Nếu bạn nghiêm túc về việc Googling vấn đề này, tôi nghi ngờ bạn sẽ tìm thấy câu trả lời. – jfriend00

Trả lời

1

Bằng "số sê-ri", tôi đoán bạn đang nói về thời gian unix tính bằng giây hoặc mili giây từ thời đại. Bạn chỉ có thể sử dụng đối tượng Ngày Javascript chuẩn:

new Date(value); 

Google là bạn của bạn từ đó. Dưới đây là một số tài liệu tham khảo để bạn bắt đầu:

Javascript cho phép bạn làm phép trừ đơn giản với hai ngày, trở về bạn sự khác biệt thời gian tính bằng ms.

var timeDiffInMS = date2 - date1; 

Đó là tất cả những gì bạn cần để tìm hiểu, vì vậy tôi sẽ để lại phép tính năm như một bài tập cho người đọc.

+0

Google dường như lưu trữ các giá trị ngày theo cùng cách như Excel, như ngày kể từ ngày cuối cùng của năm 1899, do đó, Google phải thực hiện một số phép thuật ở đâu đó. Tuy nhiên, 'ngày tháng mới (giá trị)' hoạt động, vì vậy tôi sẽ đánh dấu bạn ... :) – EML

1

Sau một số thử nghiệm khác, hóa ra nó chỉ hoạt động, điều này thật bất ngờ. new Date(cell) dường như chuyển đổi nội bộ số sê-ri thành một chuỗi đủ để tạo đối tượng ngày tháng. Full câu trả lời:

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

Tôi biết bạn đang hạnh phúc với giải pháp của bạn như nó đứng, nhưng tôi chỉ muốn thêm các quan sát của tôi về cách Google Apps Script giao dịch với "ngày", hoặc thông qua vào một chức năng tùy chỉnh, hoặc lấy ra từ một ô có getValue().

Quy tắc chung của tôi là nếu Trang tính (ứng dụng bảng tính) đang cung cấp giá trị được định dạng làm ngày (hoặc do tự động cưỡng chế hoặc người dùng đặt định dạng), thì Google Apps Script sẽ tự động giữ giá trị này như một đối tượng ngày tháng.

Ví dụ:

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

Nếu bạn nhập 1/1/13 trong A1, và trong tế bào khác bạn gọi =returnDate(A1), nó sẽ trở lại cùng ngày (như nó sẽ nếu bạn chỉ đơn giản là có return value; trong code). Tuy nhiên, hãy xem điều gì sẽ xảy ra khi bạn định dạng A1 là "Bình thường" (chuyển đổi nó thành giá trị bằng số). Ở đây, "Số sê-ri Trang tính" (số ngày từ ngày 30/12/1899) được Google Apps Script chuyển đổi thành đối tượng ngày, nhưng ở GAS, "số lượt xem" là số mili giây từ nửa đêm 1/1/1970 . Vì vậy, bạn có thể nhận được kết quả không mong muốn nếu bạn đang chuyển các giá trị số mà bạn tin là đại diện cho một ngày.

Ngoài ra so sánh:

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

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

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

=returnDate("1/1/13")

=returnDate("1/1/2013")

Sau hai "công việc", bởi vì new Date() tạo thành công đối tượng ngày từ một chuỗi hợp lệ, nhưng lưu ý rằng Trang tính tự động liên kết với thế kỷ hiện tại, trong khi GAS kết hợp một năm hai chữ số với năm 1900. Vì vậy, IMO nếu bạn muốn nó hoạt động chính xác như trong Excel (nghĩa là, "coi" một giá trị số như một số sê-ri cho một ngày), trước tiên bạn sẽ cần kiểm tra nếu tham số đã truyền là một ngày tháng hay chưa. đối tượng (hoặc chuỗi văn bản "hợp lệ"), và nếu không, chuyển đổi toán học từ "days from 30/12/1899" thành "mili giây từ 1/1/1970", và sau đó là new Date() nó.

Xin lỗi cho bài đăng có thời lượng dài.

+0

Một phiên bản của hàm Adam mô tả nằm trong [câu trả lời này] (http://stackoverflow.com/a/33813783/ 1677912). – Mogsdad

2

Đây là những gì tôi đã làm:

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

Điều này có thể có vẻ hơi bẩn, nhưng đây là giải pháp duy nhất tôi thấy bây giờ

6

Để chuyển đổi một ngày bảng tính Google để một ngày javascript:

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

để chuyển đổi một ngày javascript để một ngày bảng tính của Google:

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 ; 
} 
Các vấn đề liên quan