web-dev-qa-db-fra.com

Stocker automatiquement les valeurs GOOGLEFINANCE mises à jour avec un script

  • Bonjour, je souhaite garder une trace du profit de la combinaison de nombreuses valeurs d’actions. Pour ce faire, j'ai ma feuille de calcul Google avec de nombreuses formules calculant les ratios de profits ou de pertes en tenant compte du prix auquel je les ai achetées, des frais de courtier et du prix actuellement calculé avec:

    =GOOGLEFINANCE("MARKET:COMPANY";"price")
    
  • Pour que les choses restent simples pour cette question, supposons que j'ai les valeurs suivantes: Dans la cellule A1:

    =GOOGLEFINANCE("NASDAQ:GOOG";"price")
    

    Dans la cellule A2:

    =GOOGLEFINANCE("NASDAQ:AMZN";"price")
    

Et je veux garder une trace de la moyenne de ces deux valeurs, alors A3:

=AVERAGE(A1:A2)

Maintenant, je crée une nouvelle feuille et je mets l'en-tête de deux colonnes, date et valeur. Dans cette fiche, je vais stocker tous les jours à 00h00 la valeur de la cellule A3 avec la date afin de créer un graphique des valeurs quotidiennes.

Pour ce faire, je crée une fonction:

function recordHistory() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();

 var sheet1 = ss.getSheetByName("Stocks"); //Get values
 var source = sheet1.getRange("A2:A3");
 var values = source.getValues();

 var result = new Array(2); //Sort by date
 result[0] = new Date();
 result[1] =  values[1][0];

 var sheet2 = ss.getSheetByName("History"); //Store
 sheet2.appendRow(result);
};

Enfin, je crée un déclencheur. Je ne suis pas sûr que la traduction soit correcte car la feuille de calcul est dans une autre langue, mais cela ressemble à quelque chose comme:

function, time based, daily, at midnight 

Eh bien, cela semble fonctionner. Chaque jour, cette valeur est mise à jour à minuit. Les derniers jours, j'utilisais quotidiennement le tableur, je ne savais donc pas s'il y avait un problème. Mais après avoir passé une semaine sans le regarder, j'ai constaté que la valeur était toujours la même, c'est-à-dire la valeur calculée à partir de GOOGLEFINANCE la dernière fois que j'ai ouvert la feuille dans mon navigateur.

Ainsi, bien que cela fonctionne, il ne faut pas prendre les valeurs mises à jour de GOOGLEFINANCE.

Est-il possible de mettre à jour toutes les valeurs dépendantes de GOOGLEFINANCE à partir du script avant de les stocker?

Mise à jour : Je pense qu'en essayant de simplifier mon problème, j'ai posé la mauvaise question. Donc, je vais essayer de le reformuler. Je viens de faire une version simplifiée de la feuille que je veux avoir pour stocker toutes les opérations de nombreux marchés et devises internationales: Example

Le bénéfice net global est de:

=(sum(SOLD)-sum(BOUGHT))/sum(BOUGHT)

Les cellules achetées sont entrées manuellement:

=Shares * Price * Currency Exchange when bought

Les cellules vendues sont automatiquement renseignées avec les données Googlefinance:

=Shares * Current price * Current  Currency exchange conversion - Broker costs

Maintenant, avec le script que j'ai écrit au-dessus de cette mise à jour (il suffit de changer le numéro de cellule), je souhaite garder une trace de la cellule M6, ainsi que voir comment il évolue dans le temps avec la combinaison de tous mes stocks.

Une fois que j'ai vendu quelque chose, je viens de modifier manuellement la cellule qui, jusqu'à présent, se mettait à jour avec Google Finance à une valeur fixe.

Le problème et la question: le script le fait correctement, mais uniquement lorsque la feuille de calcul est ouverte dans mon navigateur. J'aimerais savoir s'il existe un moyen d'appeler quelque chose comme "mettre à jour" toutes les valeurs de Googlefinance (prix actuel et $/€ (actuel)) à partir du script, qui est exécuté tous les jours à minuit.

3
nck

Les API yahoo et google finance à utiliser à partir du script google apps étant obsolètes, je pense que le seul moyen de contourner ce problème est de générer des requêtes googlefinance à partir du script sous forme de chaînes et de les écrire dans la feuille. Ensuite, une fois que nous entrons dans la feuille, ces requêtes sont envoyées.

Je ne pense pas que ce soit la manière la plus élégante de le faire, et c'est aussi assez lent à travailler avec ces données, mais je ne pouvais pas trouver une autre solution.

Si quelqu'un veut faire la même chose ici c'est ce que j'ai fait pour générer mes données historiques à titre d'exemple. Certaines erreurs doivent peut-être être changées, mais à titre de référence, je pense que cela suffit. Dans mon projet, cela a fonctionné comme il se doit.

1
nck

Des fonctions telles que GOOGLEFINANCE ne sont mises à jour que lorsque la feuille de calcul est ouverte par un utilisateur. Aucune méthode de script Google Apps ne permet de le faire. Le plus proche est SpreadsheetApp.flush () mais cela fait seulement que les modifications apportées par le script soient placées dans la feuille de calcul.

Une alternative consiste à repenser votre modèle et à en tirer parti ...

GOOGLEFINANCE offre déjà un moyen de rapporter des données historiques. La syntaxe est

GOOGLEFINANCE(ticker, [attribute], [start_date], [end_date|num_days], [interval])

Exemple

La formule suivante renvoie les valeurs de fermeture quotidiennes de NASDAQ:GOOG du 1er janvier 2017 à aujourd'hui.

A1:

=GOOGLEFINANCE("NASDAQ:GOOG","price","1/1/2017",TODAY())

La formule suivante renvoie les valeurs de fermeture quotidiennes de NASDAQ:AMZN du 1er janvier 2017 à aujourd'hui.

D1:

=GOOGLEFINANCE("NASDAQ:AMZN","price","1/1/2017",TODAY())

Pour calculer la moyenne quotidienne, nous ne pouvions pas utiliser AVERAGE avec ARRAYFORMULA, mais les opérandes + et /:

G1:

=ArrayFormula((B2:B+E2:E)/2)

Remarque:
Suggestion: supprimez les lignes vides en bas afin de pouvoir calculer la moyenne journalière uniquement pour les lignes contenant des données.

La moyenne quotidienne de l'historique sera calculée à partir de la date de début jusqu'à la date réelle chaque fois que le tableur sera recalculé.

Résultat (extrait):

Date               Close        Date               Close        Average
 1/3/2017 16:00:00  786.14       1/3/2017 16:00:00  786.14      786.14
 1/4/2017 16:00:00   786.9       1/4/2017 16:00:00   786.9       786.9
 1/5/2017 16:00:00  794.02       1/5/2017 16:00:00  794.02      794.02
 1/6/2017 16:00:00  806.15       1/6/2017 16:00:00  806.15      806.15
 1/9/2017 16:00:00  806.65       1/9/2017 16:00:00  806.65      806.65
1/10/2017 16:00:00  804.79      1/10/2017 16:00:00  804.79      804.79

Remarque:
Les fonctions de feuille de calcul Google ne sont recalculées que lorsque la feuille de calcul est ouverte. Par conséquent, l'utilisation d'un script à exécuter tant que la feuille de calcul n'est pas ouverte par quiconque récupérera les valeurs enregistrées la dernière fois que la feuille de calcul a été ouverte/synchronisée en mode hors connexion. .

Références

5
Rubén