如何使用JSON访问(新式)Google表格的内容?我的目标是从JavaScript访问值,因此我需要能够通过HTTP下载JSON。
示例:如何从this sheet下载JSON数据?
我试图通过网络搜索找到答案,但最终失败了:
网络上的许多教程都以在网址中查找key=...
值的说明开头。我导出工作表时获得的网址为https://docs.google.com/spreadsheets/d/1mhv1lpzufTruZhzrY-ms0ciDVKYiFJLWCMpi4OOuqvI/pubhtml?gid=1822753188&single=true
,其中没有key=...
。
"Accessing A Public Google Sheet"的答案似乎表明我应该尝试https://docs.google.com/spreadsheets/d/1mhv1lpzufTruZhzrY-ms0ciDVKYiFJLWCMpi4OOuqvI/export?format=csv&id=1mhv1lpzufTruZhzrY-ms0ciDVKYiFJLWCMpi4OOuqvI&gid=1822753188
来获取CSV版本,但这对我不起作用:我获得了登录页面而不是数据
我找到了使用Google Apps脚本的方法,但这些似乎需要在浏览器中执行一些用户操作,而不是提供下载链接。
答案 0 :(得分:35)
如果您想使用最新的API(v4),则需要执行以下操作:
使用表单请求:
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表格API对公共数据的请求必须附带一个标识符,该标识符可以是API密钥或访问令牌。
按照链接文档中的步骤在credentials page上创建API密钥。
请务必:
请注意,您可以still access public data而不强制用户登录:
在新的Sheets API v4中,没有明确的可见性声明。 API调用是使用电子表格ID进行的。如果应用程序无权访问指定的电子表格,则会返回错误。否则呼叫继续进行。
请注意,不需要将工作表发布到网上。您需要做的就是确保任何有链接的人都可以访问该表。
(即当您在Google表格API上点击创建凭据时,选择其他非用户界面,用户数据,并说它“无法从没有用户界面的平台访问用户数据,因为它需要登录的用户交互。“您可以放心地忽略该消息。您只需要API密钥,因为这是公共数据。”
请求缺少有效的API密钥。
您的通话中未包含key=
参数。
API密钥无效。请传递有效的API密钥。 谷歌开发者控制台
您提供了错误的API密钥。确保您正确输入了密钥。如果您还没有密钥,请转到Google developers console并创建一个密钥。
找不到API密钥。请传递有效的API密钥 Google开发者控制台API密钥
您的API密钥可能是正确的,但您很可能没有添加Google表格权限。转到Google开发人员控制台API密钥页并添加工作表权限。
来电者没有权限
您的工作表未设置为可公开访问。
答案 1 :(得分:21)
我终于(有点)解决了我的问题。仅供将来参考,如果有其他人遇到同样的问题,我想出的解决方案:
要使工作表可公开访问,需要使工作表可公开访问。这是使用菜单条目case "output":
在Google表格网页界面中完成的。可以发布整个电子表格或单个工作表。
Google Sheets API web pages描述了以编程方式从Google表格访问数据的API。此API使用File > Publish to the web ... > link > publish
键 https://spreadsheets.google.com/feeds/.../
worksheetId /
形式的网址。有点奇怪的是, key 和 worksheetId 的含义似乎没有在API文档中解释。
我的实验表明,可以通过网页界面获取用于访问工作表的部分网址来找到密钥值(另请参阅here)。关键是/...
之后的所有内容,直到下一个斜杠。对于问题中的电子表格,因此密钥为/d/
。 worksheetId 似乎是一个整数,在电子表格中给出了工作表的位置。对于问题中的示例,必须知道显示的工作表是第二个工作表,在这种情况下, worksheetId 是1mhv1lpzufTruZhzrY-ms0ciDVKYiFJLWCMpi4OOuqvI
。
API定义了2
和public
个请求。要在不进行身份验证的情况下访问导出的资源,必须使用private
个请求。
在"Retrieving a list-based feed"部分中解释了从电子表格中获取数据的API调用(单击示例中的" Protocol"选项卡)。所需的URL从问题中的电子表格中提取数据
对此URL的HTTP GET请求将该数据作为XML返回。 (我还没有找到将数据作为JSON获取的方法。)
通常的保护跨站请求使得难以通过Web应用程序中的JavaScript XML RPC调用访问数据。解决此问题的一种方法是通过Web服务器代理API调用(例如使用nginx' s proxy_pass directive)。
上述步骤至少是问题中问题的部分解决方案。唯一的困难是数据以XML而不是JSON的形式返回。由于API文档没有提到JSON,可能不再以这种格式提取数据了吗?
答案 2 :(得分:3)
以下是使用相同网址参数获取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
基于电子表格中工作表的顺序。
答案 3 :(得分:1)
此处更快的解决方案是使用此https://gist.github.com/ronaldsmartin/47f5239ab1834c47088e来包装现有的电子表格。
首先,您需要将表格访问权限更改为Anyone with link can View
将id
和sheet
html参数添加到以下网址中。
https://script.google.com/macros/s/AKfycbzGvKKUIaqsMuCj7-A2YRhR-f7GZjl4kSxSN1YyLkS01_CfiyE/exec
例如:您的id
是您的工作表ID
1mhv1lpzufTruZhzrY-ms0ciDVKYiFJLWCMpi4OOuqvI
和您的工作表
Sheet2
在您的情况下,您实际上可以在此处将您的数据视为json at
为安全起见,您应该将上面的github gist中的代码sheetAsJson.gs
部署为您自己的Google云端硬盘。
答案 4 :(得分:0)
这是解决方案
/ 1表示文档中的第一张纸