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

时间:2015-05-06 16:20:31

标签: json google-sheets

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

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

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

5 个答案:

答案 0 :(得分:35)

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

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

    https://sheets.googleapis.com/v4/spreadsheets/SPREADSHEET_ID/values/RANGE?key=API_KEY
    
  4. 然后你会得到一个干净的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密钥。

    请务必:

    1. 在Google Cloud Platform上创建新应用。
    2. 创建新的API密钥。
    3. 添加Google表格API。 (API管理器>仪表板>启用API)
    4. 请注意,您可以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)

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

  1. 要使工作表可公开访问,需要使工作表可公开访问。这是使用菜单条目case "output":在Google表格网页界面中完成的。可以发布整个电子表格或单个工作表。

  2. 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定义了2public个请求。要在不进行身份验证的情况下访问导出的资源,必须使用private个请求。

  3. "Retrieving a list-based feed"部分中解释了从电子表格中获取数据的API调用(单击示例中的" Protocol"选项卡)。所需的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' s proxy_pass directive)。

  5. 上述步骤至少是问题中问题的部分解决方案。唯一的困难是数据以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

idsheet html参数添加到以下网址中。

  

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

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

1mhv1lpzufTruZhzrY-ms0ciDVKYiFJLWCMpi4OOuqvI

和您的工作表

Sheet2

在您的情况下,您实际上可以在此处将您的数据视为json at

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

为安全起见,您应该将上面的github gist中的代码sheetAsJson.gs部署为您自己的Google云端硬盘。

答案 4 :(得分:0)

这是解决方案

  1. 在文档URL中记录您的工作表ID(请勿使用发布的URL查找ID!)
  2. 发布工作表,就像html页面一样
  3. 使用第1步中的ID
  4. 并将其放在此网址https://spreadsheets.google.com/feeds/cells/{id}/1/public/full?alt=json

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