Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Открыть JONS в гугл таблице, с помощью googl script (https://javascript.ru/forum/misc/70835-otkryt-jons-v-gugl-tablice-s-pomoshhyu-googl-script.html)

Vasiliy83 05.10.2017 23:34

Открыть JONS в гугл таблице, с помощью googl script
 
Вложений: 2
Приветствую!
В связи с тем что стал разбираться с торговлей в сфере криптовалюты, возникла необходимость взять данные с публичного API Polonix и для удобства создания своего калькулятора перенести их в таблицу эксель или гугл в удобном виде.

На просторах интернета нашел решение как с помощью googl script можно конвертировать JONS формат (в нем сервер отдает инфу) в текстовый и потом с помощью парсинга разнести данные по ячейкам.

Я уперся в то как дальше данные из парсинга распределить по колонкам и строчкам.
Нужно чтобы была "шапка" таблицы в которой указано: last, lowestAsk .... и тд, ниже каждая строка начиналась с валютной пары, и под соотсетсвующей ячейкой шапки, выводились соответсвующие валюте данные.

:help: Пожалуйста подскажите как дальше данные распределить.
Также нужно будет сделать авто обновление каждые 30 сек.
Данные с биржи беру по этой ссылке https://poloniex.com/public?command=returnTicker

В приложении скрины.

Vasiliy83 05.10.2017 23:37

Вот код из гугл скрипт:
function processXMRAPI() {
// В скобках пишем идентификатор электронной таблицы
       var ss = SpreadsheetApp.openById('***************************************'); 
// показываем скрипту что нужно работать с листом APIPull
      var APIPullSheet = ss.getSheetByName ("Eth/Btc");
// Очистить столбцы A, B, C & D 
      APIPullSheet.getRange('A2:K19999').clearContent();
//var создает переменную (поле AKA a), url - вызов переменной 'url'= "Http" сделать поле равным веб-адресу API Polo
      var url= "https://poloniex.com/public?command=returnTicker";
//Мы просто собираем данные, используя эти команды, в новые переменные, которые мы определяем. В первой строке мы создаем переменную с именем responseAPI и помещаем необработанные данные из URL Poloniex в это поле. Эти данные все еще находятся в формате JSON, и мы пока не можем использовать его в электронной таблице.
      var responseAPI = UrlFetchApp.fetch (url);
// И затем мы берем эти форматированные данные JSON и анализируем (разбиваем) их на поля, которые мы можем использовать в электронной таблице. Данные помещаются в поле parcedData.
      var parcedData = JSON.parse (responseAPI.getContentText ());
// Определим массив asks и запишем его из данных, полученных parced data 
}

Rasy 05.10.2017 23:49

Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

Vasiliy83 06.10.2017 10:57

Сделал.
Вот тут https://poloniexapi.wordpress.com/20...poloniexpart7/ добрый человек рассказывает как создать код чтобы вытягивать данные с полоникса по одной валютной паре. С помощью этой статьи я и написал этот код. Но мне нужны немного другие данные и я не знаю как их распределить в ячейки.

Vasiliy83 06.10.2017 14:22

Друзья, хелп плиз! Понял одно что нужно создать шапку для колонок, и уже согласно названию этих колонок возвращать в ячейки данные, но как это сделать не понимаю пока.

Vasiliy83 07.10.2017 19:44

Изучаю js, чтобы разобраться. понял что в этом отвте:
{"btc_usd":{"asks":[[4395,0.65708663],[4395.889,0.01375108],[4395.9,0.05719853],[4398,0.0276714],[4398.0000002,0.1966488],[4399,0.00228519],[4399.0000002,0.02590756],[4400,0.0202041],[4400.00000033,0.00073159],[4400.7840001,0.00031471]],"bids":[[4392.00000001,0.06314765],[4384.23103792,0.0005761],[4376,0.00177915],[4375,0.00137914],[4374.99999,0.01695014],[4374.99900001,0.00499905],[4374.999,0.28674424],[4373.81781981,0.00053624],[4371.3027953,0.0001521],[4370,0.23018268]]}}

Объект asks является вложенным. На сколько я понял путь к вложенному объекту можно указать так: var btc_usd.asks [] но гугл выдает следующую ошибку: Перед оператором отсутствует точка с запятой. (строка 9, файл Код).

Чтото я опять не понял (((.

вот код:
function scriptBTCUSD() { 
  
var ss = SpreadsheetApp.openById('***********************************');              // В скобках пишем индентификатор электронной таблицы
var APIPullSheet = ss.getSheetByName ("BTC/USD");                                              // показываем скрипту название листа
    APIPullSheet.getRange('A2:D11').clearContent();                                            // Очистить столбцы A, B, C & D 
var url = "https://yobit.net/api/3/depth/btc_usd?limit=10";                                    //var создает переменную (поле AKA a), url - вызов переменной 'url'= "Http" сделать поле равным веб-адресу API Polo
var responseAPI = UrlFetchApp.fetch (url);                                                     //Мы просто собираем данные, используя эти команды, в новые переменные, которые мы определяем. В первой строке мы создаем переменную с именем responseAPI и помещаем необработанные данные из URL Poloniex в это поле. Эти данные все еще находятся в формате JSON, и мы пока не можем использовать его в электронной таблице.
var parcedData = JSON.parse (responseAPI.getContentText ());                                   // И затем мы берем эти форматированные данные JSON и анализируем (разбиваем) их на поля, которые мы можем использовать в электронной таблице. Данные помещаются в поле parcedData.
var btc_usd.asks = [];                                                                                 // Определим массив asks и запишем его из данных, полученных parced data 
    asks.push(['Покупка','Объем']);                                                            // Создаем название столбцов для того чтобы поместить данные из аскс
   
for(var key in parcedData.asks)
{
asks.push(parcedData.asks[key]);
 } 
  
askRange = APIPullSheet.getRange(1, 1, asks.length, 2);                                         // Поместите данные «ask» в столбцы электронной таблицы A & B 
askRange.setValues(asks);
  
var bids = [];                                                                                  // Определим массив bids и запишем его из данных, полученных parced data
bids.push (['Продажа','Объем']);

for ( var key in parcedData.bids ) 
{ 
bids.push (parcedData.bids[key]); 
}

bidRange = APIPullSheet.getRange (1, 3, bids.length, 2);                                        // Получать данные «ставки» в столбцы электронной таблицы C & D 
bidRange.setValues (bids);

}


Помогите разобраться.

рони 07.10.2017 20:05

Vasiliy83,
var asks = parcedData.btc_usd.asks;

Vasiliy83 07.10.2017 20:46

Рони, СПАСИБО!!! Заработало)))!

Но выполз косяк, название столбцов опустились под столбцы, теперь. Немного по переставлял местами, но название столбцов на верх не вернулись. Максимом что получилось сделать, это опустить данные на одну строку и вручную вписать название столбцов.

Как вернуть название столбцов в первую строку?

Сейчас вот такой скрипт:
function scriptBTCUSD() { 
  
var ss = SpreadsheetApp.openById('**********************');              // В скобках пишем индентификатор электронной таблицы
var APIPullSheet = ss.getSheetByName ("BTC/USD");                                              // показываем скрипту название листа
    APIPullSheet.getRange('A2:E20').clearContent();                                            // Очистить столбцы A, B, C & D 
var url = "https://yobit.net/api/3/depth/btc_usd?limit=10";                                    //var создает переменную (поле AKA a), url - вызов переменной 'url'= "Http" сделать поле равным веб-адресу API Polo
var responseAPI = UrlFetchApp.fetch (url);                                                     //Мы просто собираем данные, используя эти команды, в новые переменные, которые мы определяем. В первой строке мы создаем переменную с именем responseAPI и помещаем необработанные данные из URL Poloniex в это поле. Эти данные все еще находятся в формате JSON, и мы пока не можем использовать его в электронной таблице.
var parcedData = JSON.parse (responseAPI.getContentText ());                                   // И затем мы берем эти форматированные данные JSON и анализируем (разбиваем) их на поля, которые мы можем использовать в электронной таблице. Данные помещаются в поле parcedData.

var asks = []                                                                                  // Определим массив asks и запишем его из данных, полученных parced data 
var asks = parcedData.btc_usd.asks;                                                            // Показываю что asks вложенный объект в btc_usd
asks.push(['Покупка','Объем']);                                            
                                                                                               // Создаем название столбцов для того чтобы поместить данные из аскс
for(var key in parcedData.asks) {asks.push(parcedData.asks[key]);} 
  
askRange = APIPullSheet.getRange(1, 1, asks.length, 2);                                         // Поместите данные «ask» в столбцы электронной таблицы A & B 
askRange.setValues(asks);
  
var bids = [];                                                                                  // Определим массив bids и запишем его из данных, полученных parced data
var bids = parcedData.btc_usd.bids;                                                             // Показываю что bids вложенный объект в btc_usd
    bids.push (['Продажа','Объем']);

for ( var key in parcedData.bids ) {bids.push (parcedData.bids[key]);}

bidRange = APIPullSheet.getRange (1, 4, bids.length, 2);                                        // Получать данные «ставки» в столбцы электронной таблицы D & E
bidRange.setValues (bids);
}

Vasiliy83 07.10.2017 20:57

var bids = []; Строчка лишняя))). Вот так то же самое получается:

function scriptBTCUSD() { 
  
var ss = SpreadsheetApp.openById('*****************************************');              // В скобках пишем индентификатор электронной таблицы
var APIPullSheet = ss.getSheetByName ("BTC/USD");                                              // показываем скрипту название листа
    APIPullSheet.getRange('A2:E20').clearContent();                                            // Очистить столбцы A, B, C & D 
var url = "https://yobit.net/api/3/depth/btc_usd?limit=10";                                    //var создает переменную (поле AKA a), url - вызов переменной 'url'= "Http" сделать поле равным веб-адресу API Polo
var responseAPI = UrlFetchApp.fetch (url);                                                     //Мы просто собираем данные, используя эти команды, в новые переменные, которые мы определяем. В первой строке мы создаем переменную с именем responseAPI и помещаем необработанные данные из URL Poloniex в это поле. Эти данные все еще находятся в формате JSON, и мы пока не можем использовать его в электронной таблице.
var parcedData = JSON.parse (responseAPI.getContentText ());                                   // И затем мы берем эти форматированные данные JSON и анализируем (разбиваем) их на поля, которые мы можем использовать в электронной таблице. Данные помещаются в поле parcedData.

var asks = parcedData.btc_usd.asks;                                                            // Определим массив asks и запишем его из данных, полученных parced data указав asks вложенный объект в btc_usd         
asks.push(['Покупка','Объем']);                                                                // Создаем название столбцов для того чтобы поместить данные из аскс

for(var key in parcedData.asks) {asks.push(parcedData.asks[key]);}                             // Поместите данные «ask» в столбцы электронной таблицы A & B 
  
askRange = APIPullSheet.getRange(2, 1, asks.length, 2);                                         
askRange.setValues(asks);
  
                                                                                               // Определим массив bids и запишем его из данных, полученных parced data указав bids вложенный объект в btc_usd  
var bids = parcedData.btc_usd.bids;                                                            // Показываю что bids вложенный объект в btc_usd
    bids.push (['Продажа','Объем']);

for ( var key in parcedData.bids ) {bids.push (parcedData.bids[key]);}

bidRange = APIPullSheet.getRange (2, 4, bids.length, 2);                                        // Получать данные «ставки» в столбцы электронной таблицы D & E
bidRange.setValues (bids);
}


И в этом скрипте я сдвинул данные на одну строчку в низ, но название столбцов не поднимается на 1 строку.

Vasiliy83 07.10.2017 21:01

Вложений: 1
Приложение

рони 07.10.2017 21:08

Цитата:

Сообщение от Vasiliy83
asks.push(['Покупка','Объем']);

Цитата:

Сообщение от Vasiliy83
bids.push (['Продажа','Объем']);

unshift

Vasiliy83 08.10.2017 12:52

Цитата:

Сообщение от рони (Сообщение 466829)
unshift

Спасибо за помощь! Все сделал. Сделал много вкладок со "стаканами" На первом листе сделал аналитику по этим данным (благо опыт работы в эксель есть). Запустил все работает. Но есть несколько огромных минусов работы с гугл таблицами!

Во первых ограничение запросов в день! Это просто труба!

Во вторых все жутко тупо! Пока я вычислю удачную сделку и выставлю ордера, они могут быть уже не актуальны!

Ну и конечно не сделать автозакуп и продажу, вернее сделать, но оооочень геморно и сливать ключи api не хочется как то.

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

Буду параллельно изучать java программирование, чтобы создавать удобных для себя ботов по торговле.

Большое спасибо!

Тема пока не закрыта.

evgeni73 11.03.2018 14:16

Vasiliy83,
Похожая проблема
function BTCUSD()
{
var ss = SpreadsheetApp.openById('**********************');
var APIPullSheet = ss.getSheetByName ("BTC/USD");
    APIPullSheet.getRange('A2:E20').clearContent();
var url = "https://api.exmo.com/v1/order_book/?pair=BTC_USD&limit=1000";
var responseAPI = UrlFetchApp.fetch (url);
var parcedData = JSON.parse (responseAPI.getContentText ());
var ask = parcedData.BTC_USD.ask;     
    ask.unshift(['Покупка','Объем']);
for (var key in parcedData.ask) {ask.push(parcedData.ask[key]);}
askRange = APIPullSheet.getRange(2, 1, ask.length, 2);                                         
askRange.setValues(ask); 
var bid = parcedData.BTC_USD.bid;
    bid.unshift(['Продажа','Объем']);
for (var key in parcedData.bid) {bid.push (parcedData.bid[key]);}
bidRange = APIPullSheet.getRange(2, 4, bid.length, 2);
bidRange.setValues(bid);
  }

Ошибка:Неправильная ширина диапазона: указано 3, должно быть 2 (строка 13, файл Код)
Что нужно изменить?

evgeni73 11.03.2018 18:21

evgeni73,
а ларчик просто открывался))
function BTCUSD()
{
var responseAPI = UrlFetchApp.fetch("https://api.exmo.com/v1/order_book/?pair=BTC_USD&limit=1000");
var APIPullSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("BTC/USD");
    APIPullSheet.getRange('A2:E1001').clearContent();
var parcedData = JSON.parse(responseAPI.getContentText ());
var ask = parcedData.BTC_USD.ask;     
    ask.unshift (['Продажа','Объем','Сумма']);
for (var key in parcedData.ask) {ask.push(parcedData.ask[key]);}
askRange = APIPullSheet.getRange (1, 1, ask.length, 3);                                         
askRange.setValues(ask); 
var bid = parcedData.BTC_USD.bid;
    bid.unshift (['Покупка','Объем','Сумма']);
for (var key in parcedData.bid) {bid.push (parcedData.bid[key]);}
bidRange = APIPullSheet.getRange (1, 5, bid.length, 3);
bidRange.setValues(bid);
}

PS: да зачем нужен идентификатор openById('**********************'), если и без него все работает...частота обновления задается в тригеррах... может у кого есть альтернативные идеи - говорят что у гугл таблиц ограничение запросов в день и вообще тупят, может есть лучшие площадки (более удачные) под это дело?


Часовой пояс GMT +3, время: 10:16.