访问(新式,公开)Google表格作为JSON

joc*_*hen 27 json google-sheets

如何使用JSON访问(新式)Google表格的内容?我的目标是从JavaScript访问值,因此我需要能够通过HTTP下载JSON.

示例:如何从此工作表中下载JSON数据?

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

Sen*_*ful 39

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

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

    https://sheets.googleapis.com/v4/spreadsheets/SPREADSHEET_ID/values/RANGE?key=API_KEY
    
    Run Code Online (Sandbox Code Playgroud)

然后,您将获得一个干净的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"]
  ],
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果要指定一个网页的全部内容,如标识Sheet1完全有效的.

有关更多信息,请参阅基本阅读


从v4 API开始,所有请求都必须附带标识符(例如API密钥):

对Google表格API请求公共数据的请求必须附带一个标识符,该标识符可以是API密钥或访问令牌.

按照链接文档中的步骤在凭据页面上创建API密钥.

确保:

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

请注意,您仍然可以在不强制用户登录的情况下访问公共数据:

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

请注意,您并不需要将表发布到网上.您需要做的就是确保拥有该链接的任何人都可以访问该表.

(即,当您单击Google表格API上的创建凭据时,选择其他非UI,用户数据,并显示"无法从没有UI的平台访问用户数据,因为它需要用户交互才能登录."您可以安全地忽略该消息.API Key是您真正需要的,因为这是公共数据.)


常见错误消息:

该请求缺少有效的API密钥.

您没有key=在通话中包含该参数.

API密钥无效.请传递有效的API密钥.谷歌开发者安慰

您提供了错误的API密钥.确保您正确输入了密钥.如果您还没有密钥,请转到Google开发人员控制台并创建一个密钥.

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

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

来电者没有权限

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

  • 这应该是现在接受的答案,其他方法似乎不适用于V4 API.如果其他人不清楚,在这种情况下,"RANGE"可以只是电子表格中标签的名称. (3认同)
  • 只是为了澄清,这种方法不需要“发布到网络”选项,相反,实际的共享设置必须使电子表格公开(或仅链接等),并且 SPREADSHEET_ID 是电子表格本身的 url 中的那个,不是网页版中的 id (3认同)

joc*_*hen 22

我终于(有点)解决了我的问题.仅供将来参考,如果有其他人遇到同样的麻烦,我想出的解决方案:

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

  2. Google表格API网页介绍了以编程方式从Google表格访问数据的API.此API使用表单https://spreadsheets.google.com/feeds/.../key /worksheetId的 URL /....有点奇怪的是,keyworksheetId的含义似乎没有在API文档中解释.

    我的实验表明,可以通过网页界面获取用于访问工作表的部分URL来找到关键值(另请参见此处).关键是一切之后/d/,直到下一个斜线.对于问题中的电子表格,关键是这样1mhv1lpzufTruZhzrY-ms0ciDVKYiFJLWCMpi4OOuqvI.该worksheetId似乎是一个整数,给在电子表格中的工作表中的位置.对于问题中的示例,必须知道所显示的工作表是第二个工作表,在这种情况下工作表2.

    API定义publicprivate请求.要在不进行身份验证的情况下访问导出的资源,public必须使用请

  3. "检索基于列表的源"部分中解释了从电子表格中获取数据的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指令).

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

  • 您可以通过将?alt = json附加到Url的末尾来获取JSON数据https://spreadsheets.google.com/feeds/list/1mhv1lpzufTruZhzrY-ms0ciDVKYiFJLWCMpi4OOuqvI/2/public/full?alt=json (7认同)
  • “要使工作表可以公开访问,需要使工作表可以公开访问。” -谁会打它?;) (2认同)

bom*_*ets 5

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

"https://spreadsheets.google.com/feeds/list/" + spreadsheetID + "/od6/public/values?alt=json";
Run Code Online (Sandbox Code Playgroud)

信任@jochen,答案一直到XML "https://spreadsheets.google.com/feeds/list/" + spreadsheetID + "/od6/public/" + sheetID;

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

  • 注意:将od6替换为工作表:default或1(第一),2(第二)等。 (4认同)