Редактор скриптов Google листов и корректный разбор JSON - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь проанализировать файл JSON из Binance API , чтобы я мог создать график подсвечников на электронных таблицах Google .

Тем не менее я не могу понять, как этого можно достичь ... Это то, что я пробовал до сих пор:

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 выдает этот вывод , но даетследующая ошибка:

Это действие увеличит число ячеек в рабочей книге выше предела 2000000 ячеек

Как это возможно?Есть только 720 записей, и почему переменная mdata не перезаписывается в каждом цикле?Разве это не должно автоматически создавать таблицу с именами столбцов и данными?Полностью потерянный здесь.Любая помощь с благодарностью.

1 Ответ

0 голосов
/ 01 июня 2018

Вот обновленная реализация (проверена на листе, и она успешно добавляет строки):

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 () в документации
...