[Google Sheets] Cotation temps réel des cryptos (Binance / websocket)

Bonjour,

Merci pour ce super script. Je viens de bien l'adapter à mes besoins, mais franchement c'est top.

Je bloque en revanche sur un point que je voulais mettre en place. J'ai une fonction "Savevalues()" qui récupère la valeur de trois paires de crypto à un instant T (Elle vient chercher la valeur issue du websocket et la coller dans une autre feuille tout simplement).

J'aurais voulu créer un trigger chaque soir à 20h pour ma fonction "Savevalues()" qui lancerait dans un premier temps la connexion websocket puis l'execution de ma fonction, puis la déconnexion websockets. L'idée étant que le script tourne quand je ne suis pas devant l'ordinateur, donc je ne veux pas devoir cliquer moi même sur le bouton "Connect".

J'imagine que le plus simple est de mettre en première ligne de ma fonction une instruction pour la connexion et en dernière une instruction pour la déconnexion. Créer le trigger pour ma fonction SaveValues je sais faire. Mais que dois-je insérer pour lancer la connexion et déconnexion du websocket ?

Merci d'avance pour ton aide si tu as la solution et encore bravo pour le script.

NB : je suis parti de la prem!re version de ton fichier avec une seul kline

Bonjour,

J'aurais voulu créer un trigger chaque soir à 20h pour ma fonction "Savevalues()" qui lancerait dans un premier temps la connexion websocket puis l'execution de ma fonction, puis la déconnexion websockets. L'idée étant que le script tourne quand je ne suis pas devant l'ordinateur, donc je ne veux pas devoir cliquer moi même sur le bouton "Connect".

je n'en ai pas l'expérience, mais on peut faire des recherches.

As-tu fait des essais avec un trigger pour lancer le websocket, puis après une tempo le fermer ?

Ou alors, s'il ne faut pas relever de multiples fois la valeur, le pasage par websocket n'est peut-être pas indispensable.

Merci pour ton retour !

J'ai créé le trigger pour ma fonction, ça pas de soucis.

Par contre ton code étant un poil complee pour moi, je ne sais pas comment appeler ta fonction dans une autre fonction.

J'imagine que je dois faire quelquechose du genre : recupererJSON(jsonstring); //en remplaçant jsonstring par quelque chose, mais là je bloque en me mélangeant entre evt, data, ...

Quand j'ai voulu lancer le websocket par le trigger, je n'ai pas réussi parce que la function recupererJSON s'execute mais je ne vois pas ce que cela change et lancer dans un premier temps ShowSidebar() donne le message d'erreur d'execution suivant :

13 janv. 2022, 11:36:17 Erreur Exception: Impossible d'appeler SpreadsheetApp.getUi() à partir de ce contexte.

at showSidebar(Code:10:27)

Ou alors, s'il ne faut pas relever de multiples fois la valeur, le pasage par websocket n'est peut-être pas indispensable.

Là, ça tient davantage à la construction de mon fichier qui repose dessus. Je lance un certain nombre d'API en parallèle à l'ouverture du fichier pour récupérer d'autres infos qui ne nécessitent pas d'être actualisées en temps réel. Je peux effectivement repenser la construction, mais j'aurais au passage bien aimé apprendre à le faire (si c'est faisable).

Puisque tu as répondu, j'en profite pour te poser une autre question concernant ton script : lorsque je ferme le Sidebar par la petite croix ou par le bouton close, ça semble me déconnecter. Or j'aurais voulu profiter pleinement de mon écran sans devoir garder le Sidebar ouvert pour que le websocket tourne. Tu saurais comment faire ?

je n'ai pas encore pris l'affaire en main, cela reste encore dans les méandres de mon cerveau pour savoir comment faire !!

lorsque je ferme le Sidebar par la petite croix ou par le bouton close, ça semble me déconnecter. Or j'aurais voulu profiter pleinement de mon écran sans devoir garder le Sidebar ouvert pour que le websocket tourne. Tu saurais comment faire ?

je crains que cela ne soit pas possible car le sidebar contient la page html qui active le websocket, c'est comme si tu fermais ton navigateur alors que tu lisais des infos, la liaison se coupe dès lors que le navigateur est fermé

c'est vrai qu'avec un écran de 10" comme le mien, cela prend une certaine place, et une place certaine !

13 janv. 2022, 11:36:17 Erreur Exception: Impossible d'appeler SpreadsheetApp.getUi() à partir de ce contexte. at showSidebar(Code:10:27)

effectivement, on ne peut pas faire appel à UI interface utilisateur si la sheet n'est pas ouverte

je vais revoir le site binance pour savoir comment récupérer le json sans passer par websocket, mais attention, il y a une fort limitation en nombre de requête

j'avais en fait déjà travaillé sur le sujet ... en espérant que cela réponde

tu peux limiter les données à ce que tu souhaites

mais tu auras en un bloc toutes les paires

// Mike Steelson
var resultat = []
var url = 'https://api1.binance.com/api/v3/ticker/24hr'
var donnees=["symbol","priceChange","priceChangePercent","weightedAvgPrice","prevClosePrice","lastPrice","lastQty","bidPrice","bidQty","askPrice","askQty","openPrice","highPrice","lowPrice","volume","quoteVolume","openTime","closeTime","firstId","lastId","count"]

// define a trigger here
function horodatage(){
  var f = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('binance')
  f.getDataRange().clearContent()
  var binance = getDataJSON()
  f.getRange(1,1,1,donnees.length).setValues([donnees])
  f.getRange(2,1,binance.length,binance[0].length).setValues(binance)
}
function getDataJSON(){
  try{
    var json = JSON.parse(UrlFetchApp.fetch(url).getContentText())
    if (json.length){json.forEach(function(elem){getData(elem,donnees)})} else {getData(json,donnees)}
    return resultat
  }
  catch(e) {
    return (['No data !']);
  }
}
function getData(elem,list){
  var prov=[]
  list.forEach(function(path){prov.push(elem[path])})
  resultat.push(prov)
}

mets un trigger sur horodatage

les données seront dans l'onglet binance

ensuite tu peux y chercher les paires qui t'intéressent

Merci pour ton aide.

Effectivement passer par une api plutôt que websocket sera plus simple. En revanche j'ai préféré api/v3/klines?symbol=BTCEUR&interval=1m au ticker car je cherche à coller au plus près à la valeur à minuit (et le ticket te donne le prix d'ouverture et de clôture sur 24h glissantes (en fonction de l'heure à laquelle j'exécute le code) - or le trigger se déclenche quand il le souhaite dans un intervalle d'une heure donnée (dans mon cas c'était entre 23h00 et 00h00). Du coup je l'éxécute entre 00h et 01h et récupère les prix d'ouverture et de cloture sur l'intervalle [23:59:00 - 00:00:00]. Donc parfait.

Pour la Sidebar, est-il possible de tricher en modifiant la largeur ou en le mettant en arrière plan par exemple ?

Pour la Sidebar, est-il possible de tricher en modifiant la largeur ou en le mettant en arrière plan par exemple ?

hé non, tout est fixe

MAIS on pourrait essayer en mode modal

function modal() {
  var html = HtmlService
    .createTemplateFromFile("binance")
    .evaluate()
    .setWidth(300)
    .setHeight(100);
  SpreadsheetApp.getUi().showModalDialog(html, 'web socket');
}

SAUF QUE cela se pointe au milieu et je n'arrive pas à déplacer ... et rien dans la doc https://developers.google.com/apps-script/reference/base/ui#showModalDialog(Object,String)

Oui on peut la déplacer manuellement, mais de toute façon, je ne peux pas interragir avec mon fichier tant qu'elle est affichée, donc ce n'est pas non plus idéal.

J'aurais voulu simplement la masquer (comme en arrière plan), mais effectivement je n'ai pas trouvé de solutions pour le moment.

Si je résume

  1. - en websockets wss https://forum.excel-pratique.com/astuces/google-sheets-cotation-temps-reel-des-cryptos-binance-webso... mais incompatible d'une utilisation sans ouvrir la feuille
  2. - en accès http https://forum.excel-pratique.com/astuces/google-sheets-cotation-temps-reel-des-cryptos-binance-webso... mais difficulté à prendre exactement au moment souhaité

dans ce cas cela dépasse l'utilisation d'un tableau comme GSheets ... il faut une appli dédiée en html qui enregistre sur serveur les données récupérées en wss pendant un certain intervalle de temps, puis une récupération dans un tableau en recherchant le moment le plus 'exact'.

Bonjour,

Petit question pourquoi passer par une page web pour faire la requête websocket ?

Parce que tu ne pourras pas le faire dans un script.

En effet, un script est réalisé côté serveur, et google ne donnera pas l'autorisation de fonctionner au-delà de 6mn.

Et également parce que les commendes n'existent pas dans gas (google app script).

Just signed up to tell you "I LOVE YOU"

Iooking for this for a long time

T you so much bro

Iooking for this for a long time

merci

sujet sur lequel j'ai beaucoup appris en développant

Bonjour,

Juste un poste pour te remercier pour tes scripts qui m'ont bien aidé.

MERCI

Merci pour ce retour, c'est sympa !

Bonsoir le forum !

je suis d'accord avec vous Steelson, c'est toujours plaisant de recevoir des remerciements !
et en plus ça marche dans les deux sens, du demandeur vers l'intervenant et inversement !

@ bientôt

LouReeD

Rechercher des sujets similaires à "google sheets cotation temps reel cryptos binance websocket"