2

Google の oAuth 2.0 統合を使用して、Excel から Google アナリティクス API のアクセス トークンを取得する必要があるタスクに取り組んでいます。

最初のリクエストは、ワークシート内のセルに保存されているクライアント 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-effective-vba-udfs-part-8-getting-the-previously-calculated-value-from-the-calling -cells/これは私がやろうとしていることと似ているようですが、これは配列ではなく単一のフィールドのように見えますか?

ExcelやVBAの経験が全くないので、どんな支援も大歓迎です。

ありがとう!

4

2 に答える 2