【问题标题】:Did Google Sheets stop allowing json access?谷歌表格是否停止允许 json 访问?
【发布时间】:2021-10-26 04:33:09
【问题描述】:

我有一个应用程序可以打开我已发布到网络上的电子表格的 json 版本。我使用了这个网站上的说明:https://www.freecodecamp.org/news/cjn-google-sheets-as-json-endpoint/

几个月来一直运行良好,但今天我意识到我的 json 文件的 url 从昨天开始就不再工作了。它给出消息“抱歉,此时无法打开文件。请检查地址并重试。”不过,将电子表格作为网页查看的常规链接仍然有效。

Google 是否放弃了对该功能的支持?还有另一种方法可以通过 URL 获取 json 格式的电子表格数据吗?我开始研究 Google Developer API,但确实令人困惑。

【问题讨论】:

标签: json google-sheets google-sheets-api google-data-api


【解决方案1】:

您正在使用Google Data protocolJSON Alt Type variant。该协议已过时,似乎不再可靠地工作。 GData API Directory 告诉:

Google 电子表格数据 API:GData 版本仍然有效。已被 Google Sheets API v4 取代。

Google Sheets API v4 是一个现代的RESTful 接口,通常与client library 一起使用来处理数据请求的身份验证和批处理。如果您不想进行完整的客户端实现,David Kutcher 使用 jQuery 为 GData JSON Alt 类型提供以下 v4 模拟:

GData(旧版本,不推荐):

var url = 'https://spreadsheets.google.com/feeds/list/' +
           spreadsheet_id + '/' + tab_ordinal + '/public/values?alt=json';
($.getJSON(url, 'callback=?')).success(function(data) {
  // ...
};

V4(新版本,推荐):

var url = 'https://sheets.googleapis.com/v4/spreadsheets/' +
           spreadsheet_id + '/values/' + tab_name +
           '?alt=json&key=' + api_key;
($.getJSON(url, 'callback=?')).success(function(data) {
  // ...
};

...哪里:

  • spreadsheet_id 是电子表格地址中的一长串字母和数字——它是/d//edit 之间的位
  • tab_ordinal 是工作表编号——标签栏中出现的第一个工作表是工作表编号1,第二个工作表是2,依此类推
  • tab_name 是工作表的名称,即当您打开电子表格进行编辑时,您在窗口底部的选项卡栏中看到的名称
  • api_key 是您从 Google Cloud Platform console 获得的 API 密钥

请注意,两个版本的 JSON 输出格式不同。

使用 GData 模式,电子表格需要共享为文件 > 共享 > 发布到网络

使用 V4 模式,电子表格需要共享为 文件 > 共享 > 与他人共享 > 任何知道链接的人都可以查看

【讨论】:

  • 很好,所以我可以使用新的 URL 格式访问数据。但是我正在使用的应用程序只需要一个 URL 和 JSON 文件中一段数据的“坐标”并检索该数据。如“.feed.entry[17].gs$cell.$t”之类的东西。但是这种新格式并没有标记数据的每个部分。有什么我可以添加到 URL 中的东西,使它像以前一样成为“经典”JSON 文件吗?
  • 不,我不这么认为。它是一个不同的 API,具有不同的接口和不同的结果格式。您必须与制作您提到的“应用”的人交谈。
  • 哦,好的,谢谢。我可能只使用正则表达式而不是它们内置的 JSON 函数。
  • 看来 v4 API 需要发送 API 密钥?或者有没有一种方法可以注册您的 API,这样就不需要密钥来访问某些电子表格数据?
  • hii @doubleunary 我试过他的,但它给了我这个 json 格式的代码 403 错误,我如何获得工作表的访问权限。 jsonFormat 为 "error": { "code": 403, "message": "调用者没有权限", "status": "PERMISSION_DENIED" } }
【解决方案2】:

gdata 是旧版本的 Sheets API,它已被关闭。在此处查看 Google 的公告https://cloud.google.com/blog/products/g-suite/migrate-your-apps-use-latest-sheets-api

【讨论】:

    【解决方案3】:

    没有 jQuery ...

    var url = 'https://docs.google.com/spreadsheets/d/'+id+'/gviz/tq?tqx=out:json&tq&gid='+gid;
    

    带有电子表格的 id 和工作表的 gid https://codepen.io/mikesteelson/pen/wvevppe 示例:

    var id = '______your_speadsheet_id________';
    var gid = '0';
    var url = 'https://docs.google.com/spreadsheets/d/'+id+'/gviz/tq?tqx=out:json&tq&gid='+gid;
    fetch(url)
      .then(response => response.text())
      .then(data => document.getElementById("json").innerHTML=myItems(data.substring(47).slice(0, -2))  
      );
    function myItems(jsonString){
      var json = JSON.parse(jsonString);
      var table = '<table><tr>'
      json.table.cols.forEach(colonne => table += '<th>' + colonne.label + '</th>')
      table += '</tr>'
      json.table.rows.forEach(ligne => {
        table += '<tr>'
        ligne.c.forEach(cellule => {
            try{var valeur = cellule.f ? cellule.f : cellule.v}
            catch(e){var valeur = ''}
            table += '<td>' + valeur + '</td>'
          }
        )
        table += '</tr>'
        }
      )
      table += '</table>'
      return table
    }
    

    【讨论】:

    • 很好,这似乎大部分都有效,但你知道是否有一种方法可以在没有“/*O_o*/ google.visualization.Query.setResponse(” 的数据之前获取数据?跨度>
    • 取这部分响应 data.substring(47).slice(0, -2)data.substring(117).slice(0, -3) 并将其解析为 json。
    • 谢谢,我将学习如何添加一个 sn-p 然后更新我的答案。
    • 我无法创建 sn-p !所以我在答案中添加代码
    猜你喜欢
    • 2015-07-10
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 2011-12-17
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多