首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Google sheets脚本编辑器和正确解析JSON

Google sheets脚本编辑器和正确解析JSON
EN

Stack Overflow用户
提问于 2018-06-01 21:54:20
回答 1查看 1.2K关注 0票数 0

我正在尝试解析来自Binance API的JSON文件,以便在google spreadsheets上创建一个candlestick chart

然而,我似乎不知道如何才能做到这一点……这就是我到目前为止所尝试的:

function myJSON(){
  url = "https://api.kraken.com/0/public/OHLC?pair=XXBTZEUR&since=0&interval=1"
  var ss = SpreadsheetApp.getActiveSpreadsheet(),
  coinsheet = ss.getSheetByName('Sheet1')
  var response = UrlFetchApp.fetch(url, {'muteHttpExceptions': true});
  var json = response.getContentText();
  var rawdata = JSON.parse(json);
  var data = JSON.stringify(rawdata.result.XXBTZEUR)
  data = JSON.parse(data)
  for (var i = 0; i < data.length; i++) {
    for (var j = 0; j < data[i].length; j++) {
       var mdata = new Array();var obj = {};
       var utcSeconds = data[i][0];
       var mdate = new Date(0); // The 0 there is the key, which sets the date to the epoch
       mdate.setUTCSeconds(utcSeconds);
       open = parseFloat(data[i][1])
       high = parseFloat(data[i][2])
       low = parseFloat(data[i][3])
       close = parseFloat(data[i][4])
       obj['date'] = mdate
       obj['open'] = open
       obj['high'] = high
       obj['low'] = low
       obj['close'] = close
       mdata.push(obj);
       Logger.log(mdata);
       coinsheet.appendRow(mdata);
    }
  }
}

同时运行函数Logger gives this output,但会产生以下错误:

此操作将使工作簿中的单元格数量超过2000000个单元格的限制

这怎么可能呢?只有720条记录,为什么mdata变量不会在每个循环中被覆盖?这不是应该自动创建一个包含列名和数据的表吗?在这里完全迷路了。任何帮助我的人都会很感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-02 02:40:19

下面是一个更新的实现(在工作表上进行了测试,它成功地追加了行):

function appendApiData() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var coinsheet = ss.getSheetByName('Sheet1');
  var url = 'https://api.kraken.com/0/public/OHLC?pair=XXBTZEUR&since=0&interval=1';
  var response = UrlFetchApp.fetch(url, {'muteHttpExceptions': true});
  var parsedResponse = JSON.parse(response.getContentText());
  var data = parsedResponse.result['XXBTZEUR'];
  for (var i = 0; i < data.length; i++) {
    var utcSeconds = data[i][0];
    var mdate = new Date(0); // The 0 there is the key, which sets the date to the epoch
    mdate.setUTCSeconds(utcSeconds);
    var open = parseFloat(data[i][1])
    var high = parseFloat(data[i][2])
    var low = parseFloat(data[i][3])
    var close = parseFloat(data[i][4])
    var row = [mdate, open, high, low, close];
    Logger.log(row)
    coinsheet.appendRow(row);
  }
}

下面是日志的摘录:

[18-06-01 11:44:41:028 PDT] [Thu May 31 23:45:00 GMT-07:00 2018, 6452.5, 6452.5, 6447.6, 6448.2]
[18-06-01 11:44:41:146 PDT] [Thu May 31 23:46:00 GMT-07:00 2018, 6450.5, 6450.9, 6450.5, 6450.6]
[18-06-01 11:44:41:263 PDT] [Thu May 31 23:47:00 GMT-07:00 2018, 6450.6, 6450.6, 6447.1, 6449.7]
[18-06-01 11:44:41:364 PDT] [Thu May 31 23:48:00 GMT-07:00 2018, 6449.5, 6449.7, 6447.2, 6447.2]
[18-06-01 11:44:41:446 PDT] [Thu May 31 23:49:00 GMT-07:00 2018, 6447.2, 6450.5, 6447.2, 6450.5]

关于我所做的更改有一些注意事项:

如果你不打算使用中间值,你可以将方法调用串在一起(例如,JSON.parse(response.getContentText()))

  • avoid JSON.stringify()后跟JSON.parse(),你不需要对内部循环进行编码/解码,你是通过索引显式地引用数组项,所以没有必要这样做。)正如它所说的那样,内部循环会导致你处理每个行项的行数倍于

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50645009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档