当前位置: 首页 > 知识库问答 >
问题:

GoogleSheetsAPIv4接收公共提要的HTTP401响应

陶炫明
2023-03-14

我没有运气从v4的Google Sheets API运行时对公共(即V4)的响应。“发布到网上”并与“网上的任何人”共享)电子表格。

有关文件指出:

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

为了提供API密钥,文档中规定:

拥有API密钥后,应用程序可以将查询参数key=yourAPIKey附加到所有请求URL

因此,我应该能够在以下URL中获得列出公共电子表格中的工作表的响应:

https://sheets.googleapis.com/v4/spreadsheets/{电子表格ID}?key={myAPIkey}

(显然,路径和查询字符串中分别提供了id和key)

但是,当我执行此操作时,会收到HTTP 401响应:

{
  error: {
    code: 401,
    message: "The request does not have valid authentication credentials.",
    status: "UNAUTHENTICATED"
  }
}

其他人是否可以将其用于公共工作簿?如果没有,任何人可以从谷歌方面监控这个线程或者评论或者提供一个工作样本吗?

共有3个答案

訾稳
2023-03-14

这不是解决问题的办法,但我认为这是实现目标的好方法。在网站上http://embedded-lab.com/blog/post-data-google-sheets-using-esp8266/我发现了如何使用谷歌应用脚本更新电子表格。这是GET方法的一个例子。我将尝试向您展示JSON格式的POST方法。

如何发布:在“工具”选项卡中创建谷歌电子表格

function doPost(e)
{
  var success = false;
  if (e != null)
  {
    var JSON_RawContent = e.postData.contents;
    var PersonalData = JSON.parse(JSON_RawContent);

    success = SaveData(
      PersonalData.Name, 
      PersonalData.Age, 
      PersonalData.Phone
    );
  }
  // Return plain text Output
    return ContentService.createTextOutput("Data saved: " + success);
}

function SaveData(Name, Age, Phone)
{
  try 
  {
    var dateTime = new Date();

    // Paste the URL of the Google Sheets starting from https thru /edit
    // For e.g.: https://docs.google.com/---YOUR SPREADSHEET ID---/edit 
    var MyPersonalMatrix = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/---YOUR SPREADSHEET ID---/edit");
    var MyBasicPersonalData = MyPersonalMatrix.getSheetByName("BasicPersonalData");


    // Get last edited row
    var row = MyBasicPersonalData.getLastRow() + 1;

    MyBasicPersonalData.getRange("A" + row).setValue(Name);
    MyBasicPersonalData.getRange("B" + row).setValue(Age); 
    MyBasicPersonalData.getRange("C" + row).setValue(Phone); 

    return true;
  }
  catch(error) 
  {
    return false;
  }
}

现在保存脚本并转到选项卡发布

以“我”的身份执行应用程序xyz@gmail.com,

谁有权使用这个应用程序:任何人,甚至匿名

或使用UWP:

private async void Button_Click(object sender, RoutedEventArgs e)
{
    using (HttpClient httpClient = new HttpClient())
    {
        httpClient.BaseAddress = new Uri(@"https://script.google.com/");
        httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
        httpClient.DefaultRequestHeaders.AcceptEncoding.Add(new System.Net.Http.Headers.StringWithQualityHeaderValue("utf-8"));
        string endpoint = @"/macros/s/---YOUR SCRIPT ID---/exec";

        try
        {
            PersonalData personalData = new PersonalData();
            personalData.Name = "Jarek";
            personalData.Age = "34";
            personalData.Phone = "111 222 333";

            HttpContent httpContent = new StringContent(JsonConvert.SerializeObject(personalData), Encoding.UTF8, "application/json");
            HttpResponseMessage httpResponseMessage = await httpClient.PostAsync(endpoint, httpContent);
            if (httpResponseMessage.IsSuccessStatusCode)
            {
                string jsonResponse = await httpResponseMessage.Content.ReadAsStringAsync();
            //do something with json response here
            }
        }
        catch (Exception ex)
        {

        }
    }
}

public class PersonalData
{
    public string Name;
    public string Age;
    public string Phone;
}

要获取以上代码,请获取Newtonsoft。Json是必需的。

司寇高峯
2023-03-14

我们最近修复了这个问题,现在应该可以工作了。抱歉给您带来麻烦,请再试一次。

文档必须共享给“任何有链接的人”或“网络上的公众”。(注意:发布设置从文件-

相弘和
2023-03-14

我设法让它工作起来了。甚至我一开始也很沮丧。而且,这不是一个bug。我是这样做的:

  1. 首先,在GDC中启用这些功能以消除身份验证错误

-谷歌应用程序脚本执行API

-谷歌表单API

注意:请确保您在GDC中使用的Google帐户必须与您在电子表格项目中使用的帐户相同,否则您可能会收到一条"API Key和身份验证凭据来自不同的项目"错误消息。

注意:请确保您的URL请求是电子表格V4文档中指示的请求。

这是我的示例URL请求:

https://sheets.googleapis.com/v4/spreadsheets/SPREADSHEET_ID?includeGridData=false

我得到了一个HTTP/1.1200 OK,它显示了我请求的数据。这适用于所有Spreadsheetv4服务器端进程。

希望这有帮助。

 类似资料:
  • 4.2.1.2 公共广播接收器 公共广播接收器是可以从未指定的大量应用程序接收广播的广播接收器,因此有必要注意,它可能从恶意软件接收广播。 要点(接收广播): 将导出属性显式设为true。 小心并安全地处理收到的意图。 返回结果时,不要包含敏感信息。 公共广播接收器的示例代码可以用于静态和动态广播接收器。 PublicReceiver.java package org.jssec.android.

  • 以下两者之间的区别是什么:

  • HTTP状态码 返回的 HTTP 状态码大于等于200小于300表示成功;大于等于400小于500为客户端错误;大于500为服务端错误 HTTP状态码 描述 处理建议 200 请求处理成功 用户请求处理成功(但查询API有可能返回空结果,需要另行判断) 400 请求处理失败 用户发出的请求的参数或格式有错误 401 身份验证失败 检查请求Header中的X-Ca-Key是否正确,或合作服务是否到期

  • 我最近遇到了以下方法。我试着用谷歌搜索,并通过定义如下方法,做了一个例子来了解差异;两者似乎是一样的。但是,我需要知道它是否真的是一样的? 注意:在以上两种方法中,公共代码和抽象代码已经互换。

  • 我有一个Angular应用程序,有一个API,它连接并调用一个在服务器上建立的数据库,该数据库具有一个公共IP。 第二,你有什么想法为什么会发生这种情况吗? 谢谢。

  • 我们希望基于公共字段(主键)执行Kstream Kstream连接。目前,使用下面的代码,我们得到的结果是只合并了两个流,没有任何主键约束。 您能建议如何根据公共字段/列连接2个流吗。