我在API管理器中生成了一个服务器密钥,并试图在我的Mac上执行以下操作:
curl 'https://sheets.googleapis.com/v4/spreadsheets/MySheetID?ranges=A1:B5&key=TheServerKeyIGeneratedInAPIManager'
但这就是它的回报:
{
"error": {
"code": 403,
"message": "The caller does not have permission",
"status": "PERMISSION_DENIED"
}
}
我在这里做错了什么?
答案 0 :(得分:30)
要解决此问题,请尝试:
它对我有用:)
答案 1 :(得分:29)
我知道回答有点迟,但对其他人也在苦苦思索同样的问题 只需将您对工作表的权限更改为公开,即可通过API调用进行身份验证。
更改访问权限:
发送API请求以从工作表中获取数据而无需身份验证。
注意:如果工作表包含敏感数据,则将其公开并且使用经过身份验证的访问权限进行操作是不安全的。
答案 2 :(得分:13)
请务必注意@ KishanPatel的评论:
此外,您可以使用特定的电子邮件Ex分享此工作表。你的服务 帐户(项目)电子邮件。 " client_email&#34 ;: " XXXXX@northern-gasket-XXXX.iam.gserviceaccount.com" ;,这将允许 通过脚本访问工作表。
答案 3 :(得分:2)
最简单的方法是使用gcloud cli进行修复。 https://cloud.google.com/pubsub/docs/quickstart-cli#before-you-begin
上的更多文档在可以使用此工具时,请致电
gcloud init
然后检查您的活动项目和凭据
gcloud config configurations list
如果还不行,请确保您已使用正确的帐户进行了身份验证:
gcloud auth list
* account 1
account 2
如果没有,请更改为项目帐户:
gcloud config set account `ACCOUNT`
根据帐户,项目列表将有所不同:
gcloud projects list
- project 1
- project 2...
切换到预期项目:
gcloud config set project `PROJECT NAME`
然后使用gcloud auth application-default login
创建应用程序默认凭据,然后google-cloud将自动检测到此类凭据。
答案 4 :(得分:0)
我的10美分...一个使用 Java 读取表格的简单示例。
private Credential getCredentials() throws IOException {
final InputStream accessKey = new ByteArrayInputStream("<credential json>");
final GoogleCredential credential = GoogleCredential.fromStream(accessKey)
.createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS_READONLY));
return credential;
}
private HttpTransport httpTransport() {
try {
return GoogleNetHttpTransport.newTrustedTransport();
} catch (GeneralSecurityException | IOException e) {
throw new SpreadSheetServiceException(e);
}
}
Sheets service = new Sheets.Builder(httpTransport(), JSON_FACTORY, getCredentials())
.setApplicationName("app-name")
.build();
ValueRange response = service.spreadsheets().values()
.get("<spread_sheet_id>", "A1:A")
.execute();