Copie de données "#VALEUR!"

Bonjour, Je veux copier des données de plusieurs cellules à un autre avec un script, ça marche une fois sur deux et il m'affiche "#VALEUR!" à la place de mes données. Voici le code.

var tabData = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].getRange(8,18,maxValue).getValues();  

    SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].getRange(8,20,maxValue).setValues(tabData);

J'ai tenté de contourner le problème en mettant un "Utilities.sleep(1*1000);" entre les deux pour marquer en temps pause mais cela ne change rien, juste une délai d'une seconde.

Comment pouvoir réglé ce problème qui me cause bien de ennuies ?

Bonjour,

je ne vois pas où est l'erreur, mis à part la valeur de maxValue que tu ne spécifies pas

exemple : https://docs.google.com/spreadsheets/d/1od9PWfv023uzUZ8Tze6baukWd1wBvteXXNUyMiUR38A/edit?usp=sharing

Re, la valeur de maxValue est toujours sur la feuille. La commande d'après la copie de tabData va lire des données sur un site via un json pour l'ajouter à la feuille. Je pense peut être qu'il y a une histoire de latence, je veux dire qu'il exécute la commande suivant avant écrit la dernière, comme un asynchrone ou autre. tu as une idée ?

Bonjour,

Difficile de t'aider avec si peu d'infos ...

je veux dire qu'il exécute la commande suivant avant écrit la dernière, comme un asynchrone ou autre. tu as une idée ?

Essaie de le vérifier avec un console.log(...) placé juste avant tes 2 lignes

Re, la valeur de maxValue est toujours sur la feuille. La commande d'après la copie de tabData va lire des données sur un site via un json pour l'ajouter à la feuille. Je pense peut être qu'il y a une histoire de latence, je veux dire qu'il exécute la commande suivant avant écrit la dernière, comme un asynchrone ou autre. tu as une idée ?

Alors, il faut ajouter flush() à ton script

https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#flush

SpreadsheetApp.flush();

A programmer will use flush() when they want to ensure that the previous code's output and/or effects are written to the spreadsheet before continuing. If you do not flush(), then the code may be automatically "optimized" by using some built-in caching and bundling of operations. In general, you do not need to use flush() until you specifically DO need to...

J'ai déjà eu à utiliser cela ... https://forum.excel-pratique.com/sheets/sheets-creation-de-pdf-en-automatique-lie-a-une-liste-deroul...

Merci , j'ai testé depuis hier effectivement il y a nettement moins de bugs, seulement 3, peut être je ne place pas cette fonction au bon endroit.

Il faut viser 0 erreurs. Il faudrait voir le projet et savoir à quel moment maxValue est enregistré sur la feuille. Le flush() doit intervenir juste après.

Re, Toujours le même bug... le maxValue va chercher cette fonction dans la feuille "=NB(I8:I100) " mais à force de faire des tests dans ton les sens, je pense comprendre une chose. Au début ce script un nombre aléatoire est générer sur la feuille pour reload un autre script qui va chercher un contenu Json sur un site.

Donc pour résumer, un script génère un nombre random pour activer un autre script avec ce code ci

let nombre = Math.floor(Math.random() * 100);

SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Database').getRange('C1').setValue(nombre);

pour activer ce script

function pair(currency, t) {

var urlpricePair = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('control').getRange('L2').getValue();

var url = urlpricePair + currency;

var reponse = UrlFetchApp.fetch(url);

var json = reponse.getContentText();

var data = JSON.parse(json);

return data.price;

}

ce script renvoi sur la feuille la réponse "un nombre"

et ensuite la copie qui marche une fois sur deux est faite.

J'ai plus de cheveux là :))

@Fred Dee

Quel est le rôle de t dans la fonction pair ?

Quelle est l'influence de Database!C1 dans la suite ? quel est le lien avec control!L2 ?

Est-il possible d'avoir un lien vers une copie simplifiée du fichier ? en mp si besoin

t est le chiffre aléatoire de "Database C1" qui relance le script, "Control L2" est l'adresse url. Je crois que l'erreur est du à la copie la cible est "=ARRONDI(O8-N8-AM8,2)" peut être la fonction arrondi créer un bug à la copie. Je vais préparer une version light pour te l'envoyer en mp

Fred Dee, je te mets la réponse ici car je pense qu'elle peut intéresser tout le monde.

L'erreur n'est pas liée au code et le flush() proposé est presque inutile.

1- l'erreur n'est pas liée au code :

L'erreur est une erreur liée à la formule en colonne R, qui prend sa source sur 2 zones contenant =IFERROR(____une___formule____"-------") en colonne O et L, sachant que R dépend de O qui dépend de L

Sur ce point, je te conseille de mettre en R8 : =iferror(ROUND(O8-N8-AM8,2),T8)

On efface l'erreur ? non pas tout à fait ...

  • L'origine de l'erreur est un appel à l'api de binance.com qui a des limites décrites ici https://binance-docs.github.io/apidocs/futures/en/#limits. Un peu complexe à déchiffrer, on les trouve en json ici https://www.binance.com/fapi/v1/exchangeInfo, donc en cas de dépassement (qui peut aller jusqu'à bloquer l'IP pendant 3 jours), data.price ne donnera rien, et la fonction une erreur. CQFD
  • Alors pourquoi mettre T8 dans =iferror(ROUND(O8-N8-AM8,2),T8) : hé bien juste pour conserver la valeur précédemment trouvée et éviter par ricochet un mauvais calcul en R4 et T4

2- flush() est ici presque inutile :

je vais poursuivre sur ce point plus tard

2- flush() est ici presque inutile :

flush() est indispensable quand la macro a besoin du résultat d'un calcul dans la feuille après avoir injecté une donnée. Comme tu avais évoqué un calcul aléatoire, on pouvait penser que le résultat entrait dans la suite du programme, ce n'est pas le cas.

Si je comprends bien ta fonction, le résultat de ce calcul aléatoire entre dans la fonction sans être utilisé ... une astuce pour exciter la fonction et la lancer a nouveau. Mais in fine le résultat se trouve en colonne L, qui impacte O et enfin R.

Tout au plus, tu peux ajouter un flush avant

.getRange('T6').setValue('Done'); 

juste pour faire propre.

flush() s'utilise par exemple quand on demande une valeur, qu'il s'ensuit par un query des données envoyés par mail (c'est un exemple) : le mail dépend bien du résultat et il faut que le query donne un résultat correct.

Y a t'il quand même eu une amélioration avec flush (tu en a mis 4) : si c'est vrai, c'est que tu as alors alourdi / ralenti ta macro et baissé la fréquence d'appel à l'api de binance.


En conclusion, ton problème est un problème de limite sur binance, dont tu peux minimiser l'effet par la fonction proposée au post précédent, mais cela ne règle pas la quantité d'appels que tu fais au travers de l'api. Combien as-tu de lignes à mettre à jour ? y a t'il en plus un déclencheur sur start ? Essaie de décortiquer https://www.binance.com/fapi/v1/exchangeInfo avec firefox ...

Merci pour tes infos, effectivement =iferror(ROUND(O8-N8-AM8,2),T8) masque le problème, il y a quand même une chose que je n'arrive pas à comprendre. Pourquoi mettre une erreur suite à une copie ? je veux dire visuellement il y a bien des chiffres sur la feuille à copier et la function reload arrive après

Merci pour tes infos, effectivement =iferror(ROUND(O8-N8-AM8,2),T8) masque le problème, il y a quand même une chose que je n'arrive pas à comprendre. Pourquoi mettre une erreur suite à une copie ? je veux dire visuellement il y a bien des chiffres sur la feuille à copier et la function reload arrive après

Non le IFERROR n'est pas sur la copie, elle est sur l'original ! car c'est R8 qui a cette fonction et non T8 qui est la recopie.

Le problème est que si L8 ne reçoit pas de valeur, L8 et O8 seront égaux à -------ce qui amènera une erreur en R8 qui sera recopiée en T8 et amènera une fausse info en R4 et T4.

  • Alors pourquoi mettre T8 dans =iferror(ROUND(O8-N8-AM8,2),T8) : hé bien juste pour conserver la valeur précédemment trouvée et éviter par ricochet un mauvais calcul en R4 et T4

Mais tout ceci juste pour conserver l'ancienne valeur si la requête web n'aboutit pas. Donc le but n'est pas tant de masquer le problème mais d'éviter les conséquences en cascade du fait que L8 n'a pas reçu de valeur = qui est la racine de ton problème.

Relis calmement tout ce que j'ai écrit sur le point 1-

D'accord, existe t'il par hasard une fonction qui permet de copie R physiquement ailleurs sans que L soit pris en charge ? Je veux dire simplement faire une copie prendre le chiffre "R" est le coller ailleurs et qu'il soit indépendant

existe t'il par hasard une fonction qui permet de copie R physiquement ailleurs sans que L soit pris en charge ? Je veux dire simplement faire une copie prendre le chiffre "R" est le coller ailleurs et qu'il soit indépendant

Oui, c'est exactement ce que tu fais ici

  var tableauprofitLastB = sheet.getSheets()[0].getRange(8,18,maxValeur).getValues(); 
  sheet.getSheets()[0].getRange(8,20,maxValeur).setValues(tableauprofitLastB); 

avec

var sheet = SpreadsheetApp.getActiveSpreadsheet();

R (colonne 18) est recopiée en T (colonne 20) , en d'autres termes T reprend la valeur de R et devient indépendant de L

qui a fait le script ?

Merci pour tes infos. C'est moi qui l'ai codé, ok j'avoue ne pas comprendre le pourquoi du comment, cela me semble complément incohérent, je ne vois pas pourquoi quand je lance seule la fonction permute(); il y a aucun problème et quand je permute(); et relaodJson(); il y a des problèmes aléatoire

je ne vois pas pourquoi quand je lance seule la fonction permute(); il y a aucun problème et quand je permute(); et relaodJson(); il y a des problèmes aléatoire

quand tu permute(), tu passes les infos de R en T, il ne peut pas y avoir d'erreur

quand tu relaodJson(), tu génères le nombre qui va "réveiller" la fonction function pricePair(currencyPair, a, b, c) et si le site web ne répond pas le json complet mais un avertissement tu as une erreur ... combien as-tu de lignes à interroger à chaque fois en rafale ? est-ce que tu as lu le chapitre sur les limitations de l'api ?

J'ai ajouté une sparkline inversée sur les 10 dernières valeurs

J'ai aussi renforcé le contrôle de la fonction par

function start() {    
  var f = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Database');
  if (f.getRange('I6').getValue() == 'Done'){
................
  }
}

Ci-joint le lien vers le fichier épuré https://docs.google.com/spreadsheets/d/1UyemeZw8kYwdDEiX4qcAV8SoZ-dH7ofI-wmmNpP8I3c/edit?usp=sharing

Rechercher des sujets similaires à "copie donnees valeur"