代码之家  ›  专栏  ›  技术社区  ›  anjanesh

直接从客户端JavaScript访问公共谷歌表单的数据

  •  0
  • anjanesh  · 技术社区  · 4 年前

    有没有一种方法可以获得公共谷歌电子表格的单元格值?

    GET https://sheets.googleapis.com/v4/spreadsheets/1vW01Y46DcpCC7aKLIUwV_W4RXLbeukVwF-G9AA7P7R0/values/A1A4?key=abcdef
    

    返回403。

    我还发送了 推荐人 在Postman中: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36

    {
        "error": {
            "code": 403,
            "message": "Requests from referer Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36 are blocked.",
            "status": "PERMISSION_DENIED",
            "details": [
                {
                    "@type": "type.googleapis.com/google.rpc.ErrorInfo",
                    "reason": "API_KEY_HTTP_REFERRER_BLOCKED",
                    "domain": "googleapis.com",
                    "metadata": {
                        "consumer": "projects/666",
                        "service": "sheets.googleapis.com"
                    }
                }
            ]
        }
    }
    

    我正在尝试直接从客户端JavaScript访问公共工作表的数据。

    没有到服务器的往返行程。我记得这在大约10年前是可能的,但我找不到文件。

    1 回复  |  直到 4 年前
        1
  •  5
  •   Mike Steelson    4 年前

    您可以通过json端点访问公共电子表格

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

    吃一片

    data.substring(47).slice(0, -2)
    

    并解析json

    直接链接

    https://docs.google.com/spreadsheets/d/1n-rjSYb63Z2jySS3-M0BQ78vu8DTPOjG-SZM4i8IxXI/gviz/tq?tqx=out:json&tq&gid=0

    气体示例

    function getEndpointJson(){
      var id = '1n-rjSYb63Z2jySS3-M0BQ78vu8DTPOjG-SZM4i8IxXI';
      var gid = '0';
      var txt = UrlFetchApp.fetch(`https://docs.google.com/spreadsheets/d/${id}/gviz/tq?tqx=out:json&tq&gid=${gid}`).getContentText();
      var jsonString = txt.match(/(?<="table":).*(?=}\);)/g)[0]
      var json = JSON.parse(jsonString)
      var table = []
      var row = []
      json.cols.forEach(colonne => row.push(colonne.label))
      table.push(row)
      json.rows.forEach(r => {
        var row = []
        r.c.forEach(cel => {
            try{var value = cel.f ? cel.f : cel.v}
            catch(e){var value = ''}
            row.push(value)
          }
        )
        table.push(row)
        }
      )
      return (table)
    }
    

    html页面示例

    例如在html页面上(您必须将其存储在外部服务器中)

    <html>
    <title>Google Sheets json endpoint V4</title>
    <author>Mike Steelson</author>
    <style>
    table {border-collapse: collapse;}
    th,td{border: 1px solid black;}
    </style>
    <body>
    <div id="json">json here</div>
    <script>
    var id = '1n-rjSYb63Z2jySS3-M0BQ78vu8DTPOjG-SZM4i8IxXI';
    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
    }           
    </script>
    </body></html>
    

    您提供的工作表ID错误。

        2
  •  1
  •   dsapalo    4 年前

    基于 some brief research ,有可用的JS库可以让您访问GSheets数据,但Google需要API密钥:

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

    下面是一个示例库:

    gsheets -以纯JavaScript/JSON的形式获取公共Google表单。

        3
  •  1
  •   anjanesh    4 年前

    答案是删除谷歌云控制台中的限制

    Answer is to remove the restrictions in Google Cloud Console

        4
  •  0
  •   fureweb    3 年前

    请考虑使用此库。

    https://github.com/fureweb-com/public-google-sheets-parser

    您可以这样使用它:

    const PublicGoogleSheetsParser = require('public-google-sheets-parser')
    
    const spreadsheetId = '10WDbAPAY7Xl5DT36VuMheTPTTpqx9x0C5sDCnh4BGps'
    
    // 1. You can pass spreadsheetId when instantiating the parser:
    const parser = new PublicGoogleSheetsParser(spreadsheetId)
    parser.parse().then((items) => {
      // items should be [{"a":1,"b":2,"c":3},{"a":4,"b":5,"c":6},{"a":7,"b":8,"c":9}]
    })
    
    推荐文章