Nouvelle donnée, nouvelle colonne
Bonjour Alex,
peux-tu nous remettre ton script ?
oui je le remet ici, et la clé en Mp :)
function update() {
var classeurAPI = SpreadsheetApp.getActiveSpreadsheet();
var feuilleAPI = classeurAPI.getSheetByName('Update');
// je sauvegarde ici toutes les données
var derLigne = feuilleAPI.getLastRow()
var valeurs = feuilleAPI.getRange('A2:H'+derLigne).getValues();
// j'identifie tous les items en leur donnant leur n° de ligne
var myDico = new Map();
for (var i = 0; i < valeurs.length; i++) {
myDico.set(valeurs[i][0],i)
};
// ton interrogation sans changement
var urlAPI = "https://api.realt.community/v1/token";
var response = UrlFetchApp.fetch(urlAPI, {
"method": "GET",
"headers": {
"accept":"<*/*>",
"X-AUTH-REALT-TOKEN": "_________________________",
"Content-Type": "application/json"
}
});
var json = response.getContentText();
var data = JSON.parse(json);
for (let i in data) {
var tokenPrice = data[i].tokenPrice
var fullname = data[i].fullName
// l'item existe-t-il déjà ?
if (myDico.has(fullname) == true){
var ligne = myDico.get(fullname)
// sa valeur a-t-elle évolué ?
if(tokenPrice != valeurs[ligne][1]) {
// on décale alors l'historique des valeurs
for (var j=7;j>1;j--){
valeurs[ligne][j] = valeurs[ligne][j-1]
}
valeurs[ligne][1] = tokenPrice
}
}
// nouvel item
else {
valeurs.push([fullname, tokenPrice, '', '', '', '', '', '']);
}
}
feuilleAPI.getRange(2, 1, valeurs.length, valeurs[0].length).setValues(valeurs).sort({column: 1, ascending: false});
}je regarde tout à l'heure, pas sûr que j'ai besoin de la clé, je vais faire sans test sur le code ci-dessus, on verra le résultat !
essaie ces ajouts
au ~début, pour initialiser un tableau complet de couleurs noires
var derLigne = feuilleAPI.getLastRow()
var plage = feuilleAPI.getRange('A2:H'+derLigne)
var valeurs = plage.getValues();
var couleurs = Array.from({ length: plage.getNumRows() }, () => Array.from({ length: plage.getNumColumns() }, () => "black"));ensuite, en cas d'évolution
valeurs[ligne][1] = tokenPrice
couleurs[ligne][1] = "red"ou en cas de nouvelle donnée
valeurs.push([fullname, tokenPrice, '', '', '', '', '', '']);
couleurs.push(["black", "red", "black", "black", "black", "black", "black", "black"]);et enfin, pour reporter les couleurs
feuilleAPI.getRange(2, 1, couleurs.length, couleurs[0].length).setFontColors(couleurs);
feuilleAPI.getRange(2, 1, valeurs.length, valeurs[0].length).setValues(valeurs).sort({column: 1, ascending: false});je n'ai pas testé du tout, et j'espère que le tri ne faussera pas ...
Alors !
je n'ai pas testé du tout, et j'espère que le tri ne faussera pas ...
ça fonctionne parfaitement, maintenant de quel tri parles tu ? pour savoir si je peux forcer l'erreur
ps :
valeurs.push([fullname, tokenPrice, '', '', '', '', '', '']);un intérêt particulier sur le nombre de ' ' ? lorsque j'ai dépassé ce nombre il se passe quoi ? ^^"
il faut que le nombre d'éléments, ici 8 en tout, soit le même que pour la matrice complète.
C'est bien ce qu'il me semblait, je verrais donc pour rajouter de l'espace pour stocker les data si besoins !
merci.
je retourne tester des choses sur mon autre sujet
bonne soirée :!
Bonjour,
je vais une petite remonter de post pour comprendre ce que j'ai à modifier sur le script pour pas faire n'importe quoi.
lorsqu'il y a un changement de prix sur le colonne "B", le nouveau prix est identifier en rouge, et l'ancien prix se décale vers la droite.
tout d'abord je remet le script :
function Update_Price() {
var classeurAPI = SpreadsheetApp.getActiveSpreadsheet();
var feuilleAPI = classeurAPI.getSheetByName('Update_Price');
// je sauvegarde ici toutes les données
var derLigne = feuilleAPI.getLastRow()
var plage = feuilleAPI.getRange('A2:N'+derLigne)
var valeurs = plage.getValues();
var couleurs = Array.from({ length: plage.getNumRows() }, () => Array.from({ length: plage.getNumColumns() }, () => "black"));
// j'identifie tous les items en leur donnant leur n° de ligne
var myDico = new Map();
for (var i = 0; i < valeurs.length; i++) {
myDico.set(valeurs[i][0],i)
};
// ton interrogation sans changement
var urlAPI = "https://api.realt.community/v1/token";
var response = UrlFetchApp.fetch(urlAPI, {
"method": "GET",
"headers": {
"accept":"<*/*>",
"X-AUTH-REALT-TOKEN": "Ma Clé",
"Content-Type": "application/json"
}
});
var json = response.getContentText();
var data = JSON.parse(json);
for (let i in data) {
var tokenPrice = data[i].tokenPrice
var fullname = data[i].fullName
// l'item existe-t-il déjà ?
if (myDico.has(fullname) == true){
var ligne = myDico.get(fullname)
// sa valeur a-t-elle évolué ?
if(tokenPrice != valeurs[ligne][1]) {
// on décale alors l'historique des valeurs
for (var j=7;j>1;j--){
valeurs[ligne][j] = valeurs[ligne][j-1]
}
valeurs[ligne][1] = tokenPrice
couleurs[ligne][1] = "red"
}
}
// nouvel item
else {
valeurs.push([fullname, tokenPrice, '', '', '', '', '', '', '', '', '', '', '', '']);
couleurs.push(["black", "red", "black", "black", "black", "black", "black", "black", "black", "black", "black", "black", "black", "black"]);
}
}
feuilleAPI.getRange(2, 1, couleurs.length, couleurs[0].length).setFontColors(couleurs);
feuilleAPI.getRange(2, 1, valeurs.length, valeurs[0].length).setValues(valeurs).sort({column: 1, ascending: false});
}Actuellement je fais fonctionner ce script sur une feuille à part, j'aimerai faire évoluer ça.
J'aimerai faire un tableau plus fourni de mon coté, mais garder ce coté "enregistrement de data en cas de nouveauté "
est-ce possible de créer une nouvelle colonne en cas de nouveauté plutôt que de décaler l'ancien prix d'une case ?
merci
Bonjour,
est-ce que cela revient à dire qu'il ne faut conserver qu'une seule donnée historique ?
Bonjour,
Je pensais pouvoir garder tout l'historique, pourquoi ?
Mais je biens de me rendre compte qu'un simple ajout de colonne nest pas aussi simple car certaines données n'auront pas forcement de nouvelle valeurs et donc potentiellement pas mal de nouvelles colonnes..
Le top serait que si il n'y ai pas de case vide à droite = création de nouvelle colonne pour l'historique
j'avais compris qu'il n'y avait pas de nouvelles valeurs tout le temps sur chaque ligne !
j'avais compris qu'il n'y avait pas de nouvelles valeurs tout le temps sur chaque ligne !
oui tu as bien compris.
actuellement je monopolise une feuille de mon Sheets juste pour ça
lorsqu'un nouveau prix arrive ( de façon aléatoire selon les articles ) l'ancien prix se décale d'une cellule vers la droite pour laisser place au nouveau prix qui sera mis en évidence.
j'aimerai utiliser cette fonction ou sont contenu toutes mes autres donnée ( pour avoir qu'une seul feuille et toutes mes informations )
Hypothèse 1)
je prédéfini un nombre de cellule dédiée à l'enregistrement de l'historique avec un nombre MAX
Hypothèse 2)
si l'article 1 à un nouveau prix -> création d'une nouvelle colonne pour enregistrer l'ancien prix ( et comme ça à chaque fois )
En revanche si l'article 2 à un nouveau prix en faisant comme ça voila ce qu'il se passera :
donc je cherche un équilibre à ce que je pourrais faire
Bon, j'ai retenu la solution de prédéfinir un nombre de colonne pour stocker mes historiques.. ça semble plus simple…. comme ceci
(j'ai laissé tomber le changement de couleurs, ce n'est pas le plus difficile a comprendre.. je remettrais plus tard de mon coté..)
malgré ce choix j'ai besoins d'aide pour corriger ce script :
function test() {
var classeurAPI = SpreadsheetApp.getActiveSpreadsheet();
var feuilleAPI = classeurAPI.getSheetByName('test');
var derLigne = feuilleAPI.getLastRow()
var valeurs = feuilleAPI.getRange('A2:J'+derLigne).getValues();
var myDico = new Map();
for (var i = 0; i < valeurs.length; i++) {
myDico.set(valeurs[i][0],i)
};
var urlAPI = "https://api.realt.community/v1/token";
var response = UrlFetchApp.fetch(urlAPI, {
"method": "GET",
"headers": {
"accept":"<*/*>",
"X-AUTH-REALT-TOKEN": "_________________",
"Content-Type": "application/json"
}
});
var json = response.getContentText();
var data = JSON.parse(json);
for (let i in data) {
var xDaiContract = data[i].blockchainAddresses.xDai.contract
var ethereumContract = data[i].blockchainAddresses.ethereum.contract
var tokenPrice = data[i].tokenPrice
var fullname = data[i].fullName
if (myDico.has(fullname) == true){
var ligne = myDico.get(fullname)
if(tokenPrice != valeurs[ligne][1]) {
for (var j=7;j>1;j--){
valeurs[ligne][j] = valeurs[ligne][j-1]
}
valeurs[ligne][1] = tokenPrice
}
}
else {
valeurs.push([xDaiContract, fullname, tokenPrice, '', '', '', '', '', '',ethereumContract]);
}
}
feuilleAPI.getRange(2, 1, valeurs.length, valeurs[0].length).setValues(valeurs).sort({column: 1, ascending: false});
}j'ai voulut rajouter "xDaiContract, et "ethereumContract" mais ça ne me reporte plus le "tokenPrice" en cas de changement.. j'ai des doublons de lignes à la place..
après exécution du script..
et je ne sais pas quoi modifier…
J'ai bien compris que le script prenait le "fullname" comme base pour repérer le tokenprice et en cas de changement de valeur il y avait une action mais je ne sais pas comment je peux rajouter des données a droite et a gauche sans que cela perturbe ce script.
et si vous arrivez pas à comprendre le besoin, je laisserai sur une feuille à part comme c'est le cas actuellement ( et ça fonctionne bien, merci encore ! )
bonne soirée.
Bonjour tout le monde!
En manque d'inspiration alors je remonte ce post
si je vous dit que j'ai 2 pages dans mon sheet..
celle-ci
et celle-ci
Vous auriez pas une idée ou une alternative pour que ça prenne moins de place sur mon Sheets ? ( idéalement faire qu'une feuille
[ Sachant que les yield peuvent varier plus souvent que les prix ]
la j'ai pas d'idée, passer en colonne et mettre yield et prix cote à cote ?
( si besoins je remettrais le script ici )
merci !