使用API密钥(C#)将数据写入Google电子表格

7

我有一个应用程序,可以使用API密钥从Google电子表格中读取数据。我只需向此地址发送HTTP GET请求,就会收到带有数据的响应。

https://sheets.googleapis.com/v4/spreadsheets/18soCZy9H4ZGuu**********BeHlNY1lD8at-Pbjmf8c/values/Sheet1!A1?key=AIzaSyAYJ***********pB-4iKZjYf4y0vhXP8OM

但是当我尝试使用HTTP PUT方法写入数据时,遇到了问题。
https://sheets.googleapis.com/v4/spreadsheets/18soCZy9H4ZGuu**********BeHlNY1lD8at-Pbjmf8c/values/Sheet1!A4?valueInputOption=RAW?key=AIzaSyAYJ***********pB-4iKZjYf4y0vhXP8OM

我遇到了401错误。

发起PUT请求的代码:

 using (WebClient wc = new WebClient())
 {
     byte[] res = wc.UploadData(link, "PUT", Encoding.ASCII.GetBytes(textBox1.Text));
     MessageBox.Show(Encoding.Default.GetString(res));
 }

另外,电子表格是完全公开的,任何人都可以读写而无需进行身份验证。我的猜测是我无法使用API密钥来向电子表格中写入数据,唯一的方法是使用OAuth。

更新: 所以我刚刚尝试了Google.Apis.Sheets.v4来写入值,现在我几乎可以确定API密钥无法用于向Google电子表格中写入数据。好吧,那么我将使用OAuth 2.0。


看起来这个问题 https://issuetracker.google.com/issues/36755576 涵盖了这个 bug,尽管自四月以来似乎没有更新。可能值得收藏一下,这样他们就知道它对人们的影响有多大了。我想我也要转而使用 OAuth 2.0。 - user3432422
3个回答

3

也许你是正确的,问题可能出在API_KEY本身。

如果你查看Sheets API文档,它指出你的应用程序发送到Google Sheets API的每个请求都需要向Google标识你的应用程序。有两种方法可以标识你的应用程序:使用OAuth 2.0令牌(还授权请求)和/或使用应用程序的API密钥。以下是如何确定使用哪些选项:

  • 如果请求需要授权(例如请求个人私人数据),则应用程序必须提供OAuth 2.0令牌进行请求。应用程序也可以提供API密钥,但不一定需要。

  • 如果请求不需要授权(例如请求公共数据),则应用程序必须提供API密钥或OAuth 2.0令牌,或者两者都提供——无论哪种选项对您最方便。

因为文件是公共的,所以在您的情况下OAuth 2.0令牌或API密钥都可以使用。但问题在于您正在进行的PUT请求,我们可以假设API密钥无法与其配合使用。但是,我们有替代方案,那就是OAuth。
我还在这里找到了一个相关的SO问题,可能会对您有帮助。

1
感谢您的回答。但在我的情况下,我可以使用该API密钥从电子表格中获取数据,但无法将任何内容写入电子表格。我还尝试了内置API(即Google文档页面上允许您进行请求的API),当我对我的电子表格进行GET时,我会收到带有API密钥和OAuth的数据。但是,当我尝试执行相同的操作以仅写入数据时,只有OAuth起作用。 - Yura Belov

3

对于那些仍然希望得到简单答案的人来说,似乎不会有一个 - 任何对表格的写入,无论表格权限如何,都需要OAuth2:

'这是有意行为。虽然公共表格可以匿名读取,但目前不支持匿名编辑,原因有很多。

在这种情况下,“任何人”==任何拥有谷歌账户的人。' 点击此处


这真糟糕。文档说你可以使用API密钥执行OAuth的所有操作。https://developers.google.com/sheets/api/guides/authorizing 难道文档在撒谎吗? - John Henckel

2
这里没有提到的一个选项是使用服务帐户。服务帐户类似于用户,但不附加在人身上,而是附加在项目上。
服务帐户有一个电子邮件地址和一个私钥。两者都可以用来创建JWTClientAuth,并且可以在实例化API时或每个请求时进行身份验证。
服务帐户的优点是它像API密钥一样工作--无需要求用户将URL复制到浏览器中,然后将代码复制回应用程序--但因为它可以充当已验证的用户,所以服务帐户电子邮件地址可以添加到Google表格中作为编辑器。有了这个设置,应用程序就可以完全编写访问表格,而无需处理授权代码、刷新令牌和复制/粘贴。
您可以看到一个Python示例,Python With Google Sheets Service Account Step By Step,以及一个Node.js示例,Accessing Google APIs Using Service Account in Node.js。我按照这些示例进行设置。
由于您正在使用C#,您可能会发现Writing to Google Sheets API Using .NET and a Service Account有所帮助。
该方法从JSON文件中读取服务帐户凭据,然后实例化SheetsService:
private void ConnectToGoogle() {
    GoogleCredential credential;

    // Put your credentials json file in the root of the solution and make sure copy to output dir property is set to always copy 
    using (var stream = new FileStream(Path.Combine(HttpRuntime.BinDirectory, "credentials.json"), 
        FileMode.Open, FileAccess.Read)) {
            credential = GoogleCredential.FromStream(stream).CreateScoped(_scopes);
    }

    // Create Google Sheets API service.
    _sheetsService = new SheetsService(new BaseClientService.Initializer() { 
        HttpClientInitializer = credential, ApplicationName = _applicationName 
    });
}

之后,您可以使用Google Sheets .NET客户端库来写入数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接