2014-05-14 10 views
2

Google의 oAuth 2.0 통합을 사용하여 Excel에서 Google Analytics API에 대한 액세스 토큰을 가져와야하는 작업을하고 있습니다.Excel VBA 셀은 값이 있음에도 불구하고 "0"을 반환합니다.

초기 요청은 내 워크 시트의 셀에 저장된 클라이언트 ID, 비밀 키 및 인증 토큰을 전달하여 작동합니다.

UDF는 그래서 같은 외모를 사용하고 있습니다 :

내 워크 시트에서
Public Function GetGAAuthenticationToken _ 
        (ByVal ClientId As String, _ 
        ByVal ClientSecret As String, _ 
        ByVal code As String, _ 
        accessToken As String, _ 
        RefreshToken As String, _ 
        accessTokenExpires As Date) 

    'Has token expire? If not, don't renew the access token. 
    Dim Token(2, 0) 
    Dim Refresh As Boolean: Refresh = True 

    If Now < accessTokenExpires Then 
    Token(0, 0) = accessToken 
    Token(1, 0) = RefreshToken 
    Token(2, 0) = accessTokenExpires 
    Refresh = False 
    End If 

    Dim objhttp As Object 
    Dim ResponseText As String 

    If Refresh Then 
     If RefreshToken = "" Or RefreshToken = "0" Then 
     'Initial authorization code=GetGAAuthenticationToken(B1, B2, B4, B6, B7, B8) 
     Set objhttp = CreateObject("MSXML2.ServerXMLHTTP.6.0") 
     URL = "https://accounts.google.com/o/oauth2/token" 
     objhttp.Open "POST", URL, False 
     objhttp.setRequestHeader "Content-type", "application/x-www-form-urlencoded" 
     objhttp.setTimeouts 1000000, 1000000, 1000000, 1000000 
     objhttp.send ("code=" & code & "&client_id=" & ClientId & "&client_secret=" _ 
      & ClientSecret _ 
      & "&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2%2E0%3Aoob&grant_type=authorization_code") 

     ResponseText = objhttp.ResponseText 
     Else 
     'Refresh Token 
     Set objhttp = CreateObject("MSXML2.ServerXMLHTTP.6.0") 
     URL = "https://accounts.google.com/o/oauth2/token" 
     objhttp.Open "POST", URL, False 
     objhttp.setRequestHeader "Content-type", "application/x-www-form-urlencoded" 
     objhttp.setTimeouts 1000000, 1000000, 1000000, 1000000 
     objhttp.send _ 
      ("client_id=" & ClientId _ 
      & "&client_secret=" & ClientSecret & "&refresh_token=" _ 
      & RefreshToken & "&grant_type=refresh_token") 

     ResponseText = objhttp.ResponseText 
     End If 

     Dim XMLResponse: Set XMLResponse = JSONtoXML(ResponseText) 
     Dim XMLResult: Set XMLResult = XMLResponse.SelectSingleNode("//XML") 

     If Not IsNull(XMLResult.GetAttribute("access_token")) Then 
     Token(0, 0) = XMLResult.GetAttribute("access_token") 
     End If 
     If Not IsNull(XMLResult.GetAttribute("refresh_token")) Then 
     Token(1, 0) = XMLResult.GetAttribute("refresh_token") 
     Else 
     Token(2, 0) = RefreshToken 
     End If 
     If Not IsNull(XMLResult.GetAttribute("expires_in")) Then 
     If IsNumeric(XMLResult.GetAttribute("expires_in")) Then 
      Token(2, 0) = DateAdd("s", CInt(XMLResult.GetAttribute("expires_in")), Now) 
     Else 
      Token(2, 0) = DateAdd("s", 3600, Now) 
     End If 
     Else 
     Token(2, 0) = DateAdd("s", 3600, Now) 
     End If 
    End If 

    GetGAAuthenticationToken = Token 

End Function 

내가 함수를 호출 세포의 배열을 가지고 :

=GetGAAuthenticationToken(B1, B2, B4, B5, B6, B7) 

은 제가 위에서 말했듯이의 초기 요청은 잘 작동하고 액세스 토큰, 새로 고침 토큰 및 액세스 토큰 만료 날짜를 셀 B5, B6 및 B7로 출력합니다.

그러나 요청을 다시 실행하면 B5, B6 및 B7의 값이 내 UDF로 전달 될 것으로 예상되는데,이 요청은 다시 "0"으로 전달됩니다. 업데이트와 UDF 실행을 트리거하는 사이에 다시 설정되는 것 같습니다. 이 가치를 얻을 수 있습니까?

나는이 페이지를 보았습니다. http://fastexcel.wordpress.com/2012/01/08/writing-efficient-vba-udfs-part-8-getting-the-previously-calculated-value-from-the-calling-cells/ 이것은 내가하려고하는 것과 비슷하게 보입니다. 그러나 이것은 배열이 아닌 하나의 필드로 보입니다.

저는 Excel과 VBA에서 전혀 경험이 없으므로 도움을받을 수 있습니다.

감사합니다.

답변

1

문자열/날짜 인수가 아닌 Range 인수를 사용하도록 함수를 변경하십시오. "B1"에 대한 참조가있는 UDF는 Range 개체를 전달합니다.

Public Function GetGAAuthenticationToken(ByVal p_ClientId As Range, ByVal p_ClientSecret As Range, ByVal p_code As Range, p_accessToken As Range, _ 
p_RefreshToken As Range, p_accessTokenExpires As Range) 

그런 다음 변수를 선언하고 범위 개체의 값을 설정 : 당신이 당신의 변수 이름을 수정하지 않아도

Dim ClientId As String 
Dim ClientSecret As String 
Dim code As String 
Dim accessToken As String 
Dim RefreshToken As String 
Dim accessTokenExpires As Date 

ClientId = p_ClientId.value 
ClientSecret = p_ClientSecret.value 
code = p_code.value 
accessToken = p_accessToken.value 
RefreshToken = p_RefreshToken.value 
accessTokenExpires = p_accessTokenExpires.value 

주 나는 당신의 인수의 이름을 바 꾸었습니다. 원한다면 물론 변경할 수 있습니다.

+0

의견을 보내 주셔서 감사합니다. 불행히도 저는 여전히 'AccessToken','RefreshToken' 및'AccessTokenExpires' 셀에서 "0"을 얻고 있습니다. 다른 셀은 코드를 사용하여 값을 잘 반환합니다 ... –

0

코드를 실제로 검사하지는 않았지만 어딘가에 데이터 유형 문제가있을 수 있습니다. 들어오는 값을 "문자열"에서 "범위"로 변경하고 디버거로 함수 내부의 값 (예 : accessToken.Value)을 살펴보십시오.

Excel에서 모든 데이터 형식을 셀에 저장할 수 있기 때문에 UDF에 들어있는 내용을 Range가 아닌 다른 형식으로 입력하는 것은 결코 안전하지 않습니다. 함수 내부의 범위 참조에서 값을 가져 오는 것이 좋습니다. 나는 이것을 어려운 길로 배웠다 ....

행운을 빈다.