尝试使用应用程序脚本获取 google analytics 4 时出现身份验证错误
Authentication error when attempting to fetch google analytics 4 with app script
我想将社区连接器连接到 google analytics 4 帐户,以便我可以轻松修改数据并将其发送到数据工作室。但是,我的代码返回身份验证错误:
{ error:
{ code: 401,
message: 'Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.',
status: 'UNAUTHENTICATED' } }
我已经包含了令牌,但我不确定我是否进行了正确的 url 调用,或者是否存在我不知道的其他问题。我认为我不需要 API 密钥来从社区连接器连接到 google API,但我可能错了。我确实创建了一个 API 密钥,但结果是一样的。
function testFetch(){
var url = "https://analyticsdata.googleapis.com/v1alpha:runReport"
var token = ScriptApp.getOAuthToken();
var options = {
"method" : 'POST',
"entity": { "propertyId": "263290444" },
"dateRanges": [{ "startDate": "2020-12-01", "endDate": "2021-03-01" }],
"dimensions": [{ "name": "country" }],
"metrics": [{ "name": "activeUsers" }],
'muteHttpExceptions': true,
headers: {
Authorization: 'Bearer' + token,
},
};
var response = UrlFetchApp.fetch(url, options);
var result = JSON.parse(response.getContentText());
}
这里有一个关于如何实现目标的小指南:
为您的 Apps 脚本项目清单 (appsscript.json
) 设置明确的 OAuth 范围 (see documentation)。在这种情况下,您需要添加以下内容:
{
...
"oauthScopes": [
"https://www.googleapis.com/auth/script.external_request",
"https://www.googleapis.com/auth/analytics.readonly"
}
}
然后你需要将方法参数与获取选项分开。获取选项需要被字符串化并添加到 payload
。您还需要将 contentType
设置为 JSON。
const options = {
entry: { propertyId: "263290444"},
// etc.
}
const response = UrlFetchApp.fetch(
'https://analyticsdata.googleapis.com/v1alpha:runReport',
{
method: 'POST',
muteHttpExceptions: true,
headers: {
'Authorization': `Bearer ${ScriptApp.getOAuthToken()}`
},
contentType: 'application/json; charset=utf-8',
payload: JSON.stringify(options)
}
)
之后,您可以像以前一样使用响应。
请注意 Bearer
和令牌需要用 space 分隔,您的代码没有。由于连接的原因很难看清,这就是为什么我通常使用模板文字 (see documentation).
参考资料
我想将社区连接器连接到 google analytics 4 帐户,以便我可以轻松修改数据并将其发送到数据工作室。但是,我的代码返回身份验证错误:
{ error:
{ code: 401,
message: 'Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.',
status: 'UNAUTHENTICATED' } }
我已经包含了令牌,但我不确定我是否进行了正确的 url 调用,或者是否存在我不知道的其他问题。我认为我不需要 API 密钥来从社区连接器连接到 google API,但我可能错了。我确实创建了一个 API 密钥,但结果是一样的。
function testFetch(){
var url = "https://analyticsdata.googleapis.com/v1alpha:runReport"
var token = ScriptApp.getOAuthToken();
var options = {
"method" : 'POST',
"entity": { "propertyId": "263290444" },
"dateRanges": [{ "startDate": "2020-12-01", "endDate": "2021-03-01" }],
"dimensions": [{ "name": "country" }],
"metrics": [{ "name": "activeUsers" }],
'muteHttpExceptions': true,
headers: {
Authorization: 'Bearer' + token,
},
};
var response = UrlFetchApp.fetch(url, options);
var result = JSON.parse(response.getContentText());
}
这里有一个关于如何实现目标的小指南:
为您的 Apps 脚本项目清单 (appsscript.json
) 设置明确的 OAuth 范围 (see documentation)。在这种情况下,您需要添加以下内容:
{
...
"oauthScopes": [
"https://www.googleapis.com/auth/script.external_request",
"https://www.googleapis.com/auth/analytics.readonly"
}
}
然后你需要将方法参数与获取选项分开。获取选项需要被字符串化并添加到 payload
。您还需要将 contentType
设置为 JSON。
const options = {
entry: { propertyId: "263290444"},
// etc.
}
const response = UrlFetchApp.fetch(
'https://analyticsdata.googleapis.com/v1alpha:runReport',
{
method: 'POST',
muteHttpExceptions: true,
headers: {
'Authorization': `Bearer ${ScriptApp.getOAuthToken()}`
},
contentType: 'application/json; charset=utf-8',
payload: JSON.stringify(options)
}
)
之后,您可以像以前一样使用响应。
请注意 Bearer
和令牌需要用 space 分隔,您的代码没有。由于连接的原因很难看清,这就是为什么我通常使用模板文字 (see documentation).