• Ms Access VBA và Google drive, một vài ý tưởng trong chia sẻ và đồng bộ số liệu...
  • RE: VBA và Google drive

    paulsteigel > 27-08-15, 05:28 PM

    (27-08-15, 01:43 PM)thucgia Đã viết: .....
    Hình như giao diện đường link :

    https://console.developers.google.com/project

    bi giờ đã được thay đổi, nên mình không thể lấy được Client ID và Client secret như bạn hướng dẫn. Hay là Google thay đổi chính sách không?
    1. Bạn cần login bằng tài khoản gmail của bạn trước đã
    2. Sau khi login vào thì nhấn vào link
    https://console.developers.google.com/project 

    (tất nhiên bạn cần tạo ra project của mình trước đã nhé)

    + Sau khi nhấn vào dự án mà bạn đã tạo ở bước trước thì nhấn vào Apis & Auth. Cái này là mục lớn, nó sẽ hiện ra các mục con ở dưới nó.
    + Bấm vào API, tìm đến mục Drive API
    + Nhấn Enable API
    + Sau đó chọn OAuth 2.0 client IDs...
    và thực hiện các bước tiếp theo
  • RE: VBA và Google drive

    maidinhdan > 27-08-15, 05:33 PM

    Cảm ơn anh Ngọc!

    Em đang bận làm nhiều chuyên mục và vài tuần nửa thuyết trình 1 cái đề tài ứng dụng + công việc cơ quan, nên có lẽ sẽ ít được sôi nổi cùng anh trong chuyên mục này. Em đã đọc bài này và rất thích...để khi em hoàn thành công việc mình sẽ vào đây tung tăn với anh cho đã.

    Hi. 015
  • RE: VBA và Google drive

    thucgia > 27-08-15, 05:40 PM

    (27-08-15, 02:05 PM)paulsteigel Đã viết:
    (27-08-15, 09:05 AM)paulsteigel Đã viết:
    (27-08-15, 08:53 AM)maidinhdan Đã viết: Sao không cọn Access viết vậy anh? thấy Excel là bắt đầu rầu  019

    Vì tớ lười lười - thôi để đóng vào cái demo vậy...

    Có bản demo cho access rồi nhé. Link ở bài đầu Dân ạ. Hoặc ở đây:
    http://www.sfdp.net/thuthuataccess/demo/...ects=0&d=1
    Đến tối mình sẽ trả lời bạn thugia. Giờ đang bận tí. Bạn thông cảm nhé.

    hix, cám ơn. bạn có sure là chức năng này googledriver vẫn còn còn support không để mình search tiếp!!!
  • RE: VBA và Google drive

    thucgia > 27-08-15, 05:58 PM

    (25-08-15, 01:38 PM)paulsteigel Đã viết:
    Googdrive...tiếp nào
    Sau thời gian nghiên cứu và mày mò, có vẻ công cụ tải file, upload file lên googdrive bằng VBA là hoàn toàn khả thi.
    Hôm nay tôi xin phép giới thiệu với các bạn phần đầu của nỗ lực này nhé.
    Trước hết, để tiện lợi cho việc viết bài, tôi sẽ lấy một ứng dụng mở của tôi sử dụng làm thí nghiệm.

    A. Để làm việc được với Googdrive từ VBA hoặc bất cứ ứng dụng nào không phải là giao diện Web, bạn cần thỏa mãn được mấy điều kiện sau:
    + Có một Ứng dụng được tạo ra để truy cập vào các dịch vụ của Google
    + Ứng dụng này được tạo ra với các thông số tối thiểu sau
    * AppID (Mã ứng dụng). Trong ví dụ của tôi là [openstore-1034]
    * ClientID (Mã ứng dụng khách). Trong ví dụ của tôi là ["759747656687-rjkm22bit7ob5tufc5sbgg1gsuj48fme.apps.googleusercontent.com"]
    * ClientSecret (mã bí mật của ứng dụng khách). Trong ví dụ của tôi là ["Jf5DqXlZ2G3cOtUtHIraaxvQ"]
    + Khi ứng dụng này truy cập vào bất cứ dịch vụ nào, người dùng cần phải truy cập vào tài khoản gmail sau đó phải chấp thuận cho ứng dụng sử dụng.
    ...
    ==============================================================
    Do bài viết của tôi không thể đăng được, các bạn có thể đọc ở tài liệu sau đây nhé
    Bài đọc chi tiết
    ==============================================================

    Liên kết tải file ví dụ ở đây
    http://www.sfdp.net/thuthuataccess/demo/...ects=0&d=1
    Chúng ta có thể thấy kết quả như trong sheet1 với việc dùng Json2table nhé.
    Tiếp cận với tải file lên, tải xuống, xóa ... vv sẽ làm tương tự.

    Đến đây xin tạm dừng bài viết đã nhé.
    Chúc các bạn vui vẻ.

    Có cái link này nữa chỉ rất kỹ, nhưng giao diện hôm nay của google code khác rùi
    http://www.codingsection.com/getting-api...ation.html
  • RE: VBA và Google drive

    thucgia > 27-08-15, 08:18 PM

    (27-08-15, 02:05 PM)paulsteigel Đã viết:
    (27-08-15, 09:05 AM)paulsteigel Đã viết:
    (27-08-15, 08:53 AM)maidinhdan Đã viết: Sao không cọn Access viết vậy anh? thấy Excel là bắt đầu rầu  019

    Vì tớ lười lười - thôi để đóng vào cái demo vậy...

    Có bản demo cho access rồi nhé. Link ở bài đầu Dân ạ. Hoặc ở đây:
    http://www.sfdp.net/thuthuataccess/demo/...ects=0&d=1
    Đến tối mình sẽ trả lời bạn thugia. Giờ đang bận tí. Bạn thông cảm nhé.

    hix mình tìm thấy các thông số ấy rồi, cám ơn.
    Bạn có thể demo một ví dụ đơn giản như view tên các tập tin trong google drive vào trong một cái textbox(chẳng hạn) để anh em tham khảo được không, cái nén file này rắc rỗi quá. thank you for share
  • RE: VBA và Google drive

    thucgia > 27-08-15, 11:13 PM

    (27-08-15, 02:05 PM)paulsteigel Đã viết:
    (27-08-15, 09:05 AM)paulsteigel Đã viết:
    (27-08-15, 08:53 AM)maidinhdan Đã viết: Sao không cọn Access viết vậy anh? thấy Excel là bắt đầu rầu  019

    Vì tớ lười lười - thôi để đóng vào cái demo vậy...

    Có bản demo cho access rồi nhé. Link ở bài đầu Dân ạ. Hoặc ở đây:
    http://www.sfdp.net/thuthuataccess/demo/...ects=0&d=1
    Đến tối mình sẽ trả lời bạn thugia. Giờ đang bận tí. Bạn thông cảm nhé.

    Bạn có nghiên cứu upload lên google site chưa? nếu up được thì tiện dụng hơn.
  • RE: VBA và Google drive

    paulsteigel > 27-08-15, 11:17 PM

    (27-08-15, 08:18 PM)thucgia Đã viết: ...
    hix mình tìm thấy các thông số ấy rồi, cám ơn.
    Bạn có thể demo một ví dụ đơn giản như view tên các tập tin trong google drive vào trong một cái textbox(chẳng hạn) để anh em tham khảo được không, cái nén file này rắc rỗi quá. thank you for share

    Bản mới tải lên đã có sửa đổi theo yêu cầu của bạn, đơn giản là hiển thị danh sách file và chức năng tải file lên. Các chức năng khác như tải xuống, xóa file tôi không làm. Nếu các bạn muốn tôi sẽ lại viết hướng dẫn về việc này tiếp.
    Bản DEMO
    Hiện tại tôi chỉ làm demo nên đang hiển thị lẫn lộn cả file và thư mục và hiện tất tần tật kể cả các thư mục con, các file đã bị xóa.
    Trong thời gian tới, nếu có thời gian, tôi sẽ viết hẳn một bản hoàn thiện quản lý file trên google Drive như dạng Explorer.
    Trong vài ngày tới, tôi sẽ nghiên cứu sâu vụ tải file resumable. Hiện giờ vẫn đang dùng chế độ tải đơn giản - không tốt với các đường truyền kém.
    Vì cái này nó liên quan nhiều kỹ thuật nên nếu có ai quan tâm thì đặt câu hỏi cụ thể từng chỗ, tôi sẽ giải thích.

    Tôi cũng đã bỏ hẳn rclone ra khỏi ứng dụng mẫu- nếu các bạn quan tâm thì có thể xem trên bản backup tại đường link này
    http://www.sfdp.net/thuthuataccess/demo/...ects=0&d=1
    (với tiếp cận rClone thì cũng có nhiều cái hay:
    + Mở một phiên làm việc Dos/Shell;
    + Thực thi lệnh và chờ ...
    Lấy số liệu từ Dos/Shell đưa vào ứng dụng.
  • RE: VBA và Google drive

    paulsteigel > 27-08-15, 11:29 PM

    (27-08-15, 11:13 PM)thucgia Đã viết:
    (27-08-15, 02:05 PM)paulsteigel Đã viết: ...
    Vì tớ lười lười - thôi để đóng vào cái demo vậy...
    ....
    Bạn có nghiên cứu upload lên google site chưa? nếu up được thì tiện dụng hơn.
    Quản lý với Google Site là một vấn đề hoàn toàn khác và nó có thể coi là vượt quá năng lực và nguồn lực hiện tại của mình.
    Chủ đề với Google Drive chẳng qua là mình muốn chia sẻ một công cụ cho phép đồng bộ file từ xa một cách tự động cho những người sử dụng không có khả năng tương tác với GoogleDrive (tại sao lại là GoogleDrive đơn giản vì nó miễn phí, ổn định).
    Người dùng của mình toàn là các bạn ở xã vùng núi xa xôi. Họ chỉ biết mở ứng dụng, nhập số liệu rồi đóng.
    Do có sự khó khăn quá lớn về việc gửi nhận số liệu nên mình sử dụng GoogleDrive như một trạm bưu điện để đồng bộ thông tin giữa các máy theo phương thức:
    [Có số liệu mới>>Thông báo>>Xếp hàng>>Tải xuống>>Đồng bộ>> xóa...]
    Thao tác với GoogleDrive trên các ứng dụng khác C++/Java ...vv thì có sẵn các thư viện nhưng với VB/VBA cổ điển thì chưa có một nỗ lực nào đáng kể nên tôi đành mày mò xem sao.
    Riêng với GoogleSite thì tôi thấy dùng công cụ của Google đã là quá đủ. Tất nhiên với thông tin có tại
    https://developers.google.com/google-app...adingFiles
    thì ta cũng có thể làm được một ứng dụng tạo được và sửa thông tin bằng VBA nhưng có nhất thiết phải làm thế không?

    Xin cảm ơn bạn đã quan tâm. nếu bạn có câu hỏi gì, xin chia sẻ cùng nhé.
  • RE: Ms Access VBA và Google drive, một vài ý tưởng trong chia sẻ và đồng bộ số liệu...

    paulsteigel > 28-08-15, 11:37 AM

    Mục upload đã tiến thêm được bước nữa với công cụ Resumable Upload.
    Mặc dù tôi chưa đưa vào các thủ tục kiểm tra việc đẩy file lên có thành công hay không, bẻ file thành các đoạn để đẩy lên nhưng việc thực thi tải file lên với GoogleDrive đã cơ bản đạt được yêu cầu công việc của tôi.
    Tải được các file vừa vừa (4MB trở xuống), không cần phải dùng tải phân đoạn.
    Và cơ bản thì việc ứng dụng VBA để thao tác trực tiếp với GoogleDrive là hứa hẹn và đáp ứng được yêu cầu của tôi. Loạt bài này tôi xin phép tạm dừng và sẽ tiếp tục nếu có bạn nào quan tâm và hỏi.

    Chúc các bạn thành công.

    Tải ứng dụng demo ở đây::
    http://www.sfdp.net/thuthuataccess/demo/...ects=0&d=1

    Trong ứng dụng demo tôi đã viết thêm thủ tục UploadResumable và hoàn thiện "tương đối" với đoạn code chính như sau
    Mã:
    Function UploadResumable(filename As String, Token As String, Optional FileID As String = "") As Boolean
        '============================
        'Tham số chính 
        'FileName : Tên file cần tải lên
        'Token : Mã xác thực
        'FileID : Chưa cần dùng (đây là mã file cần update)
        'Nếu tải lên thành công, hàm sẽ trả về giá trị true
        '============================
        Dim params As String, xhr As Object, res As String, urls As String, method As String, mimeType As String
        ' thiết lập các tham số tải lên
        'params = "alt=json"
        params = params + "&uploadType=resumable"
        ' Đường dẫn để tải
        urls = "https://www.googleapis.com/upload/drive/v2/files"
        
        ' Kiểm tra nếu có mã file thì thay phương thức
        If FileID <> "" Then
            params = params + "&setModifiedDate=true"
            urls = urls + FileID
            method = "P+U+T"
        Else
            method = "P+O+S+T"
        End If
        
        'Bước 1: Tải thẻ file để đăng ký khu vực lưu trữ trên GoogleDrive
        urls = urls + "?" + params
        
        ' lấy kiểu nội dung ứng dụng ví dụ application/ms word ....
        mimeType = GetMimeType(filename)
        ' tạo đối tượng kết nối với Internet, sử dụng phương thức Latebound, không cần tham chiếu thư viện
        Set xhr = CreateObject("MSXML2.XMLHTTP")
        ' Thiết lập thông điệp tải lên
        With xhr
            ' Tôi phải dùng hàm replace để giúp đăng được bài lên diễn đàn vì có lẽ họ cấm không cho đăng tải các nội dung có chữ GET...
            .Open Replace(method,"+",""), urls, False
            .Setrequestheader "Content-Type", "application/json; charset=UTF-8"
            .Setrequestheader "Authorization:", Token
            .Setrequestheader "X-Upload-Content-Type", mimeType        
            .Setrequestheader "User-Agent", Application.name

            ' lưu ý thông tin gửi lên phải ở dạng mảng byte
            .send (Utf8BytesFromString("{'title': '" + GetFileName(filename) + "'}"))

            ' Kiểm tra lỗi
            If .Status <> 200 Then
                ' check for error type and response to user
                GoTo ExitFunction
            End If
            ' lấy về vị trí file đã được Google thiết lập
            urls = xhr.getResponseHeader("Location")
        End With

        ' Thực hiện xong bước 1, giờ tải tiếp nội dung
        'Bước 2: Tải nội dung

        ' Giờ đã có khu vực lưu trữ, dùng phương thức PUT
        method = "+P+U+T+"
        
        With xhr
            .Open Replace(method,"+",""), urls, False
            
            ' Tiếp tục các khai báo thông thường
            .Setrequestheader "Authorization:", Token
            .Setrequestheader "Content-Type", mimeType
            .Setrequestheader "Content-Length", GetFileSize(filename)
            .Setrequestheader "User-Agent", Application.name
            
            ' Gửi dữ liệu của file dưới dạng mảng nhị phân
            .send (pvToByteArray(GetFileBinary(filename)))

            If .Status <> 200 Then
                ' check for error type and response to user
                GoTo ExitFunction
            End If
        End With
        ' Tải thành công
        UploadResumable = True
    ExitFunction:
    End Function
  • Truy cập vào Google với VBA mà không cần trình duyệt....

    paulsteigel > 02-09-15, 05:30 PM

    Thế là cuối cùng tôi đã có thể thực hiện được việc truy cập vào Google mà không cần phải dùng đến Internet Explorer nữa. Quả thật với dân lập trình thì việc vào được google mà không có trình duyệt là cả một vấn đề hóc búa vì có biết bao thứ phải nghiên cứu. Với InternetExplorer chỉ cần nhập vào, rồi nhấn nút, nhưng với đối tượng như XMLHTTP, WinHTTP thì đó là một bài toán khó.
    Nhưng tại sao chúng ta phải làm điều này?
    1. Có nhiều máy tính không dùng Internet Explorer (IE) - thế là chương trình thất bại.
    2. Tải Ie sẽ tốn nhiều bộ nhớ và có nhiều nguy cơ tiềm ẩn
    ....

    Nói khác hơn, dùng IE vào ứng dụng thường không phải là điều mà lập trình viên thích thú lắm.
    Sau gần 2 tháng cày cuốc nghiên cứu, thử nghiệm và với 2 ngày làm việc gần đây phải sử dụng đến công cụ theo dõi thông tin vào ra của trình duyệt, tôi đã có thể làm được việc truy cập vào dịch vụ Google với tài khoản, mật khẩu và chắc chắn là không cần dùng đến IE.

    Mục tiêu để làm gì thì dần dần tôi sẽ nói tiếp - nó liên quan trực tiếp đến lĩnh vực GoogleDrive đấy các bạn ạ

    Để làm việc này, chúng ta cần có bộ thư viện XMLHTTPREquest hoặc WinHttpRequest hoặc Wininet.dll. Chỉ thế thôi.
    Cách làm như sau:
    Bước 1. Truy cập vào trang Web "http://accounts.google.com"
    Lấy các thông số mà trang web cung cấp đến cho phiên làm việc như Cookie, thông tin tham chiếu ...vv
    Bước 2: Thiết lập thủ tục kết nối và gửi thông tin đăng nhập và xong

    Các bạn có thể sử dụng đoạn mã sau đây
    Mã:
    Option Explicit
    ''' WinApi function that maps a UTF-16 (wide character) string to a new character string
    Private Declare Function WideCharToMultiByte Lib "kernel32" ( _
        ByVal CodePage As Long, _
        ByVal dwFlags As Long, _
        ByVal lpWideCharStr As Long, _
        ByVal cchWideChar As Long, _
        ByVal lpMultiByteStr As Long, _
        ByVal cbMultiByte As Long, _
        ByVal lpDefaultChar As Long, _
        ByVal lpUsedDefaultChar As Long) As Long
        
    ' CodePage constant for UTF-8
    Private Const CP_UTF8 = 65001

    ''' Return byte array with VBA "Unicode" string encoded in UTF-8
    Public Function Utf8BytesFromString(strInput As String) As Byte()
        Dim nBytes As Long
        Dim abBuffer() As Byte
        ' Get length in bytes *including* terminating null
        nBytes = WideCharToMultiByte(CP_UTF8, 0&, ByVal StrPtr(strInput), -1, vbNull, 0&, 0&, 0&)
        ' We don't want the terminating null in our byte array, so ask for `nBytes-1` bytes
        ReDim abBuffer(nBytes - 2)  ' NB ReDim with one less byte than you need
        nBytes = WideCharToMultiByte(CP_UTF8, 0&, ByVal StrPtr(strInput), -1, ByVal VarPtr(abBuffer(0)), nBytes - 1, 0&, 0&)
        Utf8BytesFromString = abBuffer
    End Function

    Function LoginGoogle(gAccountName As String, gPassword As String) As Boolean
        Dim oHttp As Object, sHTML As String
        Dim google_accounts_url As String, authentication_url As String, gmailUrl As String, i As Long
        Dim d As String
        google_accounts_url = "http://accounts.google.com"
        authentication_url = "https://accounts.google.com/ServiceLoginAuth"
            
        Set oHttp = CreateObject("MSXML2.ServerXMLHTTP")
        Dim htmlDoc As Object, Galx As Object
        Set htmlDoc = CreateObject("HtmlFile")
        Dim Cookie As Variant, UserDetails As String
        
        With oHttp
            ' First release a get request
            .Open replace("G+E+T","+",""), google_accounts_url, False
            .Send
            
            While .readyState <> 4
                DoEvents
            Wend
            
            Cookie = Split(.getResponseHeader("Set-Cookie"), ";")
            htmlDoc.body.innerHTML = .ResponseText
            Set Galx = htmlDoc.getElementsByName("GALX")
            
            d = "&GALX=" + Galx(0).Value
            d = d + "&continue=https://www.google.com/?gws_rd=ssl&hl=en&_utf8=?"
            d = d + "&bgresponse=js_disabled&pstMsg=1&dnConn=&checkConnection=youtube:206:1"
            d = d + "&checkedDomains=youtube"
            d = d + "&Email=" + gAccountName + "&Passwd=" + gPassword
            d = d + "&PersistentCookie=yes&signIn=Sign in"
                    
            .Open replace("P+O+S+T","+",""), authentication_url, False
            .setRequestHeader "Content-type", "application/x-www-form-urlencoded"
            .setRequestHeader "User-Agent", Application.name
            .setRequestHeader "Host", "accounts.google.com"
            .setRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
            .setRequestHeader "Accept-Language", "en-US,en;q=0.5"
            For i = 0 To UBound(Cookie)
                .setRequestHeader "Cookie", Cookie(i)
            Next
            .setRequestHeader "Connection", "keep-alive"
            .setRequestHeader "Referer", "https://accounts.google.com/ServiceLoginAuth"
            .setRequestHeader "Content-Length", Len(d)
                    
            .Send (Utf8BytesFromString(d))
            
            While .readyState <> 4
                DoEvents
            Wend
                    
            If InStr(.ResponseText, "Google Accounts") <> 0 Then LoginGoogle = True
        End With
    Exit_Sub:
        Set htmlDoc = Nothing
        Set oHttp = Nothing
    End Function