Google apps script Data Studio连接器可以';无法获取BigQuery服务帐户的访问令牌:访问未授予或已过期

Google apps script Data Studio连接器可以';无法获取BigQuery服务帐户的访问令牌:访问未授予或已过期,google-apps-script,google-bigquery,google-oauth,google-data-studio,service-accounts,Google Apps Script,Google Bigquery,Google Oauth,Google Data Studio,Service Accounts,我正在尝试创建一个社区连接器,将我在BigQuery中的数据库连接到DataStudio,并使用我作为BigQuery项目的所有者/DataViewer/JobUser连接的服务帐户。我知道服务帐户在连接到BigQuery时可以工作,因为我在其他地方测试过它。我几乎完全从本教程()中复制了连接器代码,用我的查询替换了SQL字符串,并添加了一些不同的查询参数。我还通过粘贴json对象并按如下方式存储,将服务帐户的凭据存储在我的脚本属性中: var service_account_creds_obj

我正在尝试创建一个社区连接器,将我在BigQuery中的数据库连接到DataStudio,并使用我作为BigQuery项目的所有者/DataViewer/JobUser连接的服务帐户。我知道服务帐户在连接到BigQuery时可以工作,因为我在其他地方测试过它。我几乎完全从本教程()中复制了连接器代码,用我的查询替换了SQL字符串,并添加了一些不同的查询参数。我还通过粘贴json对象并按如下方式存储,将服务帐户的凭据存储在我的脚本属性中:

var service_account_creds_obj = {
    "type": "service_account",
    "project_id": ...
    ...
}
scriptProperties.setProperty('SERVICE_ACCOUNT_CREDS', JSON.stringify(service_account_creds_obj));
然而,当我的getData函数调用
getOauthService().getAccessToken()
时,我总是陷入流程中,而该函数永远不会成功返回。当我使用连接器创建报告时,会出现以下错误:“访问未授予或过期”。我找不到getAccessToken的文档,并且我很难理解为什么它不会终止。我可以看到它没有返回,因为在该行显示之前有一个console.log,但它永远不会到达下一行的日志。然后我的try-catch块捕捉到我看到的错误。请注意,我的getOauthService函数与文档/教程示例中的函数完全相同,只是我在调用createService时使用了输入文本。输入的文本应该并不重要,对吧


拜托,我已经试着调试了好几个小时了,但是关于这个的文档非常糟糕,而且调试起来非常困难,因为代码流是在后台处理的,而stackdriver日志记录非常有问题。

我解决了我的问题。上面发布的文档将OAuth2范围设置为。然而,我天真地把它包括在内

“oauthScopes”:[“https://www.googleapis.com/auth/bigquery.readonly“]

在我的清单文件中。同时,我从文档中复制的代码已经包含了这一行:

.setScope(['https://www.googleapis.com/auth/bigquery.readonly']);

所以我不确定这到底是为什么会引起问题。但是它一定阻止了OAuth2.createService函数的正确设置。

我解决了我的问题。上面发布的文档将OAuth2范围设置为。然而,我天真地把它包括在内

“oauthScopes”:[“https://www.googleapis.com/auth/bigquery.readonly“]

在我的清单文件中。同时,我从文档中复制的代码已经包含了这一行:

.setScope(['https://www.googleapis.com/auth/bigquery.readonly']);

所以我不确定这到底是为什么会引起问题。但它一定阻止了OAuth2.createService函数的正确设置。

代码是,代码是,清单中的作用域与用户的令牌一起工作,您可以通过ScriptApp.getOAuthToken()获取该令牌。但是,对于服务帐户的令牌的作用域,当您使用
.setScope
使用oAuth2库时,需要在代码中定义它。如果您在清单、外部访问作用域中设置它,使用urlfetch/access http所需的将被阻止清单中的作用域与用户的令牌一起工作,您可以通过
ScriptApp.getOAuthToken()
获取该令牌。但是,对于服务帐户的令牌范围,当您使用
.setScope
使用oAuth2库时,需要在代码中定义该范围。如果在清单中设置该范围,则使用urlfetch/access http所需的外部访问范围将被阻止