【问题标题】:How to implement the makeApiCall() method after migrating Google Sheets API v3 to v4 with Oauth Authorization in Javascript如何在 Javascript 中使用 Oauth 授权将 Google Sheets API v3 迁移到 v4 后实现 makeApiCall() 方法
【发布时间】:2019-04-20 05:27:11
【问题描述】:

Google 已经构建了 Google Sheets API 的 v4,但它的文档仍然是 v3。没有关于如何使用 Google Sheets API v4 实现简单 OAuth 身份验证的完整示例。

我看到了一个迁移指南here,我还看到了一个部分示例here 但是找不到完整的例子。 “当前”版本是 here,最后一次更新是在 2018 年 10 月,没有提供 v4 示例。

假设在我授权用户之后,我正在尝试读取 workbook2 中的特定电子表格,并且我明确指定了我需要哪些列。然后我使用 Google Visualization API 呈现这些信息。

以下是我在 Google 表格 v3 旧版中的操作方式。

function makeApiCall() {
var queryString = encodeURIComponent('SELECT A,B,C,E,H');
   var tqURL = new google.visualization.Query(
        'https://docs.google.com/spreadsheets/d/*yourspreadsheetid*/gviz/tq?gid=*yourworkbookid*&headers=1&tqx=responseHandler:handleTqResponse' + '&access_token=' + encodeURIComponent(gapi.auth.getToken().access_token));
      tqURL.send(handleTqResponse);
}

function handleTqResponse(resp) {
  var dataTable = resp.getDataTable();
}

对于 v4,如果我遵循这个部分示例 here,我如何将 tqURL 转换为 GET 方法?以及如何才能将响应 (rsp) 作为 DataTable() 获得?

    function makeApiCall() {
  var params = {
    spreadsheetId: 'my-spreadsheet-id',  // all clear here
    //what about workbook gid?
    // The ranges to retrieve from the spreadsheet.
    ranges: [],  // [A:A,B:B,C:C,E:E,H:H) ????
    includeGridData: false,
   //no need to include the access_token here?
  };

  var request = gapi.client.sheets.spreadsheets.get(params);
  request.then(function(response) {
  console.log(response.result);
  //var dataTable = responce.getDataTable(); ?? 
  }, function(reason) {
    console.error('error: ' + reason.result.error.message);
  });
}

【问题讨论】:

    标签: javascript google-apps-script google-sheets google-visualization google-sheets-api


    【解决方案1】:

    我认为 Sheets API(V4) 中没有 Visualization API 的类似物。从技术上讲,可视化 API 并不是旧版 Sheets API (V3) 的一部分。如果有的话,它是 Charts API 的一部分。所以你应该可以继续使用它。

    您甚至可以在 GAS 中直接在服务器端使用它(参见 Using Bound Google Scripts to Generate a Query Object)。

    【讨论】:

    • 我没有替换实际的可视化 API,只是连接部分以利用 Google 表格 v4,因为这是我的数据的来源。它奏效了。
    • @Elnoob 是什么让您认为查询使用的是 v3?
    • @TheMaster 啊,你是对的。我勒个去?我想要 v4 的全部原因是能够将范围“spreadsheets.google.com/feeds”更改为“googleapis.com/auth/spreadsheets.readonly”。这在谷歌可视化 api/charts api 中还不可能吗?
    • @Elnoob 应该是可能的。我不明白为什么它不起作用。
    • 是的,它起作用了,但同样,只有当我遵循@Tanaike 发布的方法时。如果我尝试传递查询字符串,它会失败。他的方法效果很好,只是图表不喜欢日期格式,并说“第 3 列不是日期”,而实际上它是
    【解决方案2】:
    • 您已经能够使用 Sheets API。
      • Sheets API 已在 API 控制台启用。
      • 访问令牌可用于从电子表格中检索值。
    • 您想从工作表中检索A:A,B:B,C:C,E:E,H:H 的值。
    • 您希望使用 getDataTable() 从 Sheets API 检索的值中检索数据表。

    如果我的理解是正确的,那么这个修改呢?在此修改中,我在您的问题中修改了您的脚本。请认为这只是几个答案之一。

    修改点:

    • 要从A:A,B:B,C:C,E:E,H:H 中检索值,请使用Sheets API 中的values.get 方法。
      • 在这种情况下,首先检索A:H 的值,然后检索A、B、C、E 和H 列的值。
    • 要使用 getDataTable() 检索数据表,请使用 ChartWrapper 类。

    修改脚本:

    function makeApiCall() {
      var params = { // Modified
        spreadsheetId: 'my-spreadsheet-id',
        range: 'Sheet1!A:H', // Retrieve the values of "A:H".
      };
      var request = gapi.client.sheets.spreadsheets.values.get(params); // Modified
      request.then(function(response) {
        var values = response.result.values.map((e) => [e[0], e[1], e[2], e[4], e[7]]); // Added
        var w = new google.visualization.ChartWrapper({dataTable: values}); // Added
    
        var dataTable = w.getDataTable();
    
      }, function(reason) {
        console.error('error: ' + reason.result.error.message);
      });
    }
    

    注意:

    • 当使用Sheets API中的values.get方法时,范围请使用a1Notation。所以在这种情况下,范围变为Sheet1!A:H。这意味着“Sheet1”的“A:H”。

    参考资料:

    如果我误解了您的问题并且结果不是您想要的,我深表歉意。

    【讨论】:

    • 谢谢!这看起来非常有希望。看起来我现在收到很多错误,因为每一列都被认为是一个字符串。如何在“值”变量中指定每列的格式?
    • @Elnoob 感谢您的回复。我带来的不便表示歉意。虽然我不确定您使用的值,例如,将valueRenderOption: "UNFORMATTED_VALUE" 添加到params 怎么样?我更新了我的答案。你能确认一下吗?如果这不是你想要的结果,我很抱歉。那时,您能否提供用于复制您的问题的示例电子表格?我想确认一下这个问题。
    • 我应该道歉。我非常感谢您的回复。这解决了这个问题。非常感谢!我现在可以使用 v4,而无需向用户请求过多的可怕“提要”范围。再次感谢!
    • 还有一个问题,虽然我明天会尝试自己解决。看起来 var values = response.result.values.map((e) => [e[0], e[1], e[2], e[4], e[7]]) 没有做任何事情。它仍然带来所有列(A、B、C、D、E、F、G、H)
    • @Elnoob 感谢您的回复。我很高兴你的问题得到了解决。以var values = response.result.values.map((e) => [e[0], e[1], e[2], e[4], e[7]])为例,不使用箭头函数修改为var values = response.result.values.map(function(e) {return [e[0], e[1], e[2], e[4], e[7]]})怎么样?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 2012-11-12
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多