Excel VBA单元格返回“;0“;尽管有价值
我正在执行一项任务,需要使用Google的oAuth 2.0集成从Excel中获取Google Analytics API的访问令牌 初始请求通过传入客户端id、密钥和身份验证令牌来工作,这些令牌存储在我的工作表的单元格中 我使用的UDF如下所示:Excel VBA单元格返回“;0“;尽管有价值,vba,excel,google-api,excel-udf,Vba,Excel,Google Api,Excel Udf,我正在执行一项任务,需要使用Google的oAuth 2.0集成从Excel中获取Google Analytics API的访问令牌 初始请求通过传入客户端id、密钥和身份验证令牌来工作,这些令牌存储在我的工作表的单元格中 我使用的UDF如下所示: Public Function GetGAAuthenticationToken _ (ByVal ClientId As String, _ ByVal Client
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
如上所述,初始请求工作正常,并将访问令牌、刷新令牌和访问令牌到期日期输出到单元格B5、B6和B7中
但是,当我再次运行请求时,我希望B5、B6和B7中的值被传递到我的UDF,它们被传递为“0”。似乎它们在我触发更新和UDF执行之间被重置。有可能得到这些值吗
我遇到了这个页面,它似乎与我试图做的类似,但是它似乎是针对单个字段而不是数组
我在Excel和VBA方面没有任何经验,因此欢迎提供任何帮助
谢谢 将函数更改为使用
范围
参数,而不是字符串/日期参数。引用“B1”的自定义项传递一个范围对象
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
注意,我更改了参数的命名,因此您不必修改变量名。当然,如果您愿意,您可以更改它。还没有真正检查您的代码,但其中可能存在数据类型问题。尝试将传入值从“As String”更改为“As Range”,并使用调试器查看函数中的值(例如accessToken.Value)
根据我的经验,将进入UDF的内容键入范围之外的任何内容都是不安全的,因为Excel可以在单元格中存储各种数据类型。最好从函数内部的范围引用中获取值。我通过艰苦的方式学会了这一点
祝你好运 感谢您的评论,我已经尝试了您的建议,不幸的是,我仍然从AccessToken
、refreshtToken
和AccessTokenExpires
单元格返回“0”。其他单元格使用您的代码返回其值。。。
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