我正在尝试解析来自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变量不会在每个循环中被覆盖?这不是应该自动创建一个包含列名和数据的表吗?在这里完全迷路了。任何帮助我的人都会很感激。
发布于 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())
)
JSON.stringify()
后跟JSON.parse()
,你不需要对内部循环进行编码/解码,你是通过索引显式地引用数组项,所以没有必要这样做。)正如它所说的那样,内部循环会导致你处理每个行项的行数倍于
new Array()
,只需使用数组文字(即构造行,你需要创建一个行值的数组,而不是一个包含单个对象的数组。请参阅Sheet.appendRow() example in the documentationhttps://stackoverflow.com/questions/50645009
复制相似问题