【问题标题】:Accessing a (new-style, public) Google sheet as JSON以 JSON 格式访问(新型、公共)Google 工作表
【发布时间】:2015-05-06 16:20:30
【问题描述】:

如何访问(新型)Google 工作表的内容和 JSON?我的目标是从 JavaScript 访问值,所以我需要能够通过 HTTP 下载 JSON。

示例:如何从this sheet 下载数据为 JSON?

我试图通过网络搜索找到答案,但最终失败了:

【问题讨论】:

    标签: json google-sheets


    【解决方案1】:

    如果您想使用最新的 API (v4),您需要执行以下操作:

    1. 生成电子表格 API 密钥(请参阅下面的说明)。
    2. 让您的工作表可公开访问。
    3. 使用请求的形式:

      https://sheets.googleapis.com/v4/spreadsheets/SPREADSHEET_ID/values/RANGE?key=API_KEY
      

    然后你会得到一个干净的 JSON 响应:

    {
      "range": "Sheet1!A1:D5",
      "majorDimension": "ROWS",
      "values": [
        ["Item", "Cost", "Stocked", "Ship Date"],
        ["Wheel", "$20.50", "4", "3/1/2016"],
        ["Door", "$15", "2", "3/15/2016"],
        ["Engine", "$100", "1", "30/20/2016"],
        ["Totals", "$135.5", "7", "3/20/2016"]
      ],
    }
    

    请注意,如果要指定页面的全部内容,则Sheet1 等标识符为perfectly valid

    更多信息请参见Basic Reading


    从 v4 API 开始,all requests must be accompanied 通过标识符(例如 API 密钥):

    向 Google Sheets API 提出的公共数据请求必须附有标识符,该标识符可以是 API 密钥或访问令牌。

    按照链接文档中的步骤在 credentials page 上创建 API 密钥。

    确保:

    1. 在 Google Cloud Platform 上创建新应用。
    2. 创建一个新的 API 密钥。
    3. 添加 Google 表格 API。 (API 管理器 > 仪表板 > 启用 API)

    请注意,您可以still access public data 而不强制用户登录:

    在新的 Sheets API v4 中,没有明确的可见性声明。 API 调用是使用电子表格 ID 进行的。如果应用程序无权访问指定的电子表格,则返回错误。否则调用继续。

    请注意,您不需要将工作表发布到网络上。您需要做的就是确保知道链接的任何人都可以访问该工作表。

    (即,当您在 Google Sheets API 上单击 创建凭据 时,选择“其他非 UI”、“用户数据”,它会显示“无法从没有 UI 的平台访问用户数据,因为它需要用于登录的用户交互。”您可以放心地忽略该消息。API 密钥是您真正需要的,因为这是公共数据。)


    常见错误信息:

    请求缺少有效的 API 密钥。

    您没有在调用中包含 key= 参数。

    API 密钥无效。请传递有效的 API 密钥。 Google 开发者控制台

    您提供的 API 密钥不正确。确保您正确输入了密钥。如果您还没有密钥,请转到 Google developers console 并创建一个。

    未找到 API 密钥。请传递有效的 API 密钥。
    Google 开发者控制台 API 密钥

    您的 API 密钥可能正确,但您很可能没有添加 Google 表格权限。转到 Google 开发者控制台 API 密钥页面并添加工作表权限。

    调用者没有权限

    您的工作表未设置为可公开访问。

    【讨论】:

    • 这应该是现在公认的答案,其他方法似乎不适用于 V4 API。如果其他人不清楚,在这种情况下,“RANGE”可以只是电子表格中选项卡的名称。
    • 澄清一下,这种方法不需要“发布到网络”选项,相反,实际的共享设置必须使电子表格公开(或仅链接等),并且 SPREADSHEET_ID 是在电子表格本身的 url 中,而不是网络版本中的 id
    • 请用@chrismarx 的上述评论更新答案。
    • 这是从 v4 API 检索 JSON 的一个很好的概述。一个问题:关于 URL 中的“RANGE”。我知道如果选项卡/工作表具有该默认名称,您可以使用“Sheet1”。但是,如果用户将该选项卡/工作表更改为另一个名称怎么办。有没有办法利用旧的“gid=0”,它代表 url 的“RANGE”部分中的第一个选项卡/工作表?我正在为“RANGE”寻找一些捷径,它只是说“从第一个选项卡/工作表中获取所有数据”(即 gid=0)。任何人都知道如何使用 v4 API json url 格式来做到这一点?
    【解决方案2】:

    我终于(有点)解决了我的问题。仅供参考,以防其他人遇到同样的麻烦,这里是我想出的解决方案:

    1. 要使工作表可公开访问,需要使工作表可公开访问。这是在 Google 表格网络界面中使用菜单条目File > Publish to the web ... > link > publish 完成的。可以发布整个电子表格或单个工作表。

    2. Google Sheets API web pages 中描述了以编程方式从 Google 表格访问数据的 API。此 API 使用 https://spreadsheets.google.com/feeds/.../key/worksheetId/... 形式的 URL。有点奇怪的是,API 文档中似乎没有解释 keyworksheetId 的含义。

      我的实验表明,可以通过获取用于通过 Web 界面访问工作表的部分 URL 来找到 key 值(另请参阅here)。关键是/d/ 之后的所有内容,直到下一个斜线。对于问题中的电子表格,因此密钥是1mhv1lpzufTruZhzrY-ms0ciDVKYiFJLWCMpi4OOuqvIworksheetId 似乎是一个整数,给出了工作表在电子表格中的位置。对于问题中的示例,必须知道显示的工作表是第二个工作表,在这种情况下,worksheetId2

      API 定义了publicprivate 请求。要在没有身份验证的情况下访问导出的资源,必须使用public 请求。

    3. "Retrieving a list-based feed" 部分解释了从电子表格中获取数据的 API 调用(单击示例中的“协议”选项卡)。从问题中的电子表格中提取数据所需的 URL 是

      https://spreadsheets.google.com/feeds/list/1mhv1lpzufTruZhzrY-ms0ciDVKYiFJLWCMpi4OOuqvI/2/public/full

      对该 URL 的 HTTP GET 请求以 XML 形式返回该数据。 (我还没有找到以 JSON 格式获取数据的方法。)

    4. 针对跨站点请求的常规保护措施使得通过 Web 应用程序中的 JavaScript XML RPC 调用访问数据变得困难。解决此问题的一种方法是通过 Web 服务器代理 API 调用(例如使用 nginx 的 proxy_pass directive)。

    以上步骤至少部分解决了问题中的问题。唯一的困难是数据以 XML 而不是 JSON 的形式返回。由于API文档中没有提到JSON,可能无法再提取这种格式的数据了?

    【讨论】:

    • 您可以通过将 ?alt=json 附加到 Url spreadsheets.google.com/feeds/list/… 的末尾来获取 JSON 格式的数据
    • @SonicDynamite 有趣!这是在某处记录的吗?我可以在 URL 上附加其他神奇的东西来让有趣的事情发生吗?
    • 您知道是否可以通过请求获取整个文档(多张纸)?我似乎一次只能得到一张。我可以将所有数据放在一个页面中,但是将所有页面都放在那个 json 中会非常有用。
    • 这似乎不再起作用了。我必须像这样形成我的 URL:spreadsheets.google.com/feeds/cells/spreadsheetId/sheetId/…。在此处查看更多信息:developers.google.com/sheets/api/guides/migration
    • “要使工作表可公开访问,需要使工作表可公开访问。” - 谁会想到它? ;)
    【解决方案3】:

    编辑: (2021 年 8 月 17 日) 随着 Sheets v4 的推出,原始答案中的端点已被弃用。更新后的端点和示例脚本如下:

    更新的解决方案

    感谢original answer here

    "https://docs.google.com/spreadsheets/d/" + spreadsheetId + "/gviz/tq?tqx=out:json&gid=0";
    

    如果您只需要第一个工作表,从技术上讲,您不必包含 gid,但如果您想使用该参数,可以指定另一个工作表。

    这是一个示例脚本,用于将电子表格的值检索为 JSON,然后解析为标题行和值。

    var sf = "https://docs.google.com/spreadsheets/d/1l7VfPOI3TYtPuBZlZ-JMMiZW1OK6rzIBt8RFd6KmwbA/gviz/tq?tqx=out:json";
    $.ajax({url: sf, type: 'GET', dataType: 'text'})
    .done(function(data) {
      const r = data.match(/google\.visualization\.Query\.setResponse\(([\s\S\w]+)\)/);
      if (r && r.length == 2) {
        const obj = JSON.parse(r[1]);
        const table = obj.table;
        const header = table.cols.map(({label}) => label);
        const rows = table.rows.map(({c}) => c.map(({v}) => v));
    
        console.log(header);
        console.log(rows);
      }
    })
    .fail((e) => console.log(e.status));
    

    原方案

    注意:这不再适用,因为 Sheets v3 已于 2021 年 8 月弃用。

    以下是使用相同 URL 参数获取 JSON 的方法:

    "https://spreadsheets.google.com/feeds/list/" + spreadsheetID + "/od6/public/values?alt=json";
    

    感谢@jochen 的答案,路径一直到 XML "https://spreadsheets.google.com/feeds/list/" + spreadsheetID + "/od6/public/" + sheetID;

    正如@jochen 的回答所解释的,这个sheetID 是基于电子表格中工作表的顺序。

    【讨论】:

    • 注意:将od6替换为工作表:default1(第一)、2(第二)等
    • @bomberjackets 这种技术长期有效吗?
    • 似乎这种方法已经/正在被弃用,因为我在尝试以这种方式访问​​工作表时遇到间歇性 404 错误。 (cloud.google.com/blog/products/g-suite/…)
    • @l_r 是对的:截至 2021 年 8 月,原始答案中的端点已与 Sheets v3 一起被弃用,答案已使用 Sheets v4 的新方法进行了更新——仍然不需要 API 密钥,只需需要改用“发布到网络”选项:)
    • @bomberjackets 只是为了澄清,不再需要“发布到网络”选项。该工作表只需要与“知道链接的任何人”共享即可查看共享选项。
    【解决方案4】:

    这里更快的解决方案是使用此https://gist.github.com/ronaldsmartin/47f5239ab1834c47088e 环绕您现有的电子表格。

    您首先需要将工作表访问权限更改为Anyone with link can View

    idsheet html 参数添加到下面的URL。

    https://script.google.com/macros/s/AKfycbzGvKKUIaqsMuCj7-A2YRhR-f7GZjl4kSxSN1YyLkS01_CfiyE/exec

    例如:您的 id 是您的工作表 ID,即

    1mhv1lpzufTruZhzrY-ms0ciDVKYiFJLWCMpi4OOuqvI

    你的工作表是

    Sheet2

    在您的情况下,您实际上可以在

    处以 json 格式查看您的数据

    https://script.google.com/macros/s/AKfycbzGvKKUIaqsMuCj7-A2YRhR-f7GZjl4kSxSN1YyLkS01_CfiyE/exec?id=1mhv1lpzufTruZhzrY-ms0ciDVKYiFJLWCMpi4OOuqvI&sheet=Sheet2

    为了安全起见,您应该将上述 github gist 中的代码 sheetAsJson.gs 部署为您自己的 Google Drive。

    【讨论】:

    • 问题的 OP 已将他/她的工作表从公众中关闭,但您可以使用我在答案开头引用的要点中的链接 script.google.com/macros/s/…。如果您阅读了我的回答中引用的要点,您应该能够理解它是如何工作的,并使用作者的脚本来环绕您的工作表。
    【解决方案5】:

    解决办法

    1. 在文档 url 中记下您的工作表 id(不要使用发布的 url 来查找 id!)
    2. 发布您的工作表,就像 html 页面一样
    3. 使用第 1 步中的 id,
    4. 并把它放在这个网址https://spreadsheets.google.com/feeds/cells/{id}/1/public/full?alt=json

    /1 表示文档中的第一张纸

    【讨论】:

    • 我正在使用这种“?alt=json”技术向我的网站显示我的数据。这种技术是否适合长期使用?
    • 我认为这是谷歌的更多问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多