Pour ceux qui galèrent à trouver une valeur qui n'est pas dans google finance, voici le code que j'utilise en app script dans google sheet, qui extrait la valeur de boursorama toutes les 5 minutes. Attention, si le google sheet est ouvert longtemps il faudra probablement mettre un chiffre plus grand que 300 secondes (5 minutes) en cache, sinon le site fini parfois par répondre en erreur s'il y a beaucoup de requêtes
dans google sheet, ouvrir AppScript
Afficher la pièce jointe 52405
Ajouter un fichier "script" et le nommer bourso.gs ou le nom qui vous conviendra
Afficher la pièce jointe 52406
Y coller ce code :
/**
* Utilitaire : clé de cache pour Boursorama
*/
function _cacheKeyBourso(identifier) {
return "BOURSO_" + identifier;
}
function CLEAR_BOURSO_CACHE() {
CacheService.getScriptCache().removeAll([]);
return 1;
}
function switchGFTickerElements(tickerToReverse) {
// Split the string by ':' to get tokens
var tokens = tickerToReverse.split(':');
// Reverse the order of tokens
var reversedTokens = tokens.reverse();
// Join the reversed tokens back with ':'
return reversedTokens.join(':');
}
/**
* Extrait à la fois le prix et la variation depuis une URL Boursorama (avec cache 5 min)
* @param {string} url - URL complète vers la page Boursorama
* @param {string} identifier - identifiant Boursorama pour la clé de cache
* @return {Object} - Objet avec price et variation, ou {price: "N/A", variation: "N/A"}
*/
function BOURSO_VALUE(url, identifier) {
var cache = CacheService.getScriptCache();
var key = _cacheKeyBourso(identifier + "_value");
var cached = cache.get(key);
if (cached !== null) {
try {
return JSON.parse(cached);
} catch(e) {
// Si le cache est corrompu, on continue sans utiliser le cache
}
}
try {
var response = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
var content = response.getContentText();
// Extract main-content section to avoid header values
var mainContentPattern = /<main[^>]*id="main-content"[^>]*>([\s\S]*?)<\/main>/;
var mainMatch = content.match(mainContentPattern);
var searchContent = mainMatch && mainMatch[1] ? mainMatch[1] : content;
var result = {
price: "N/A",
variation: "N/A"
};
// Extraction du prix (même logique que BOURSO_ETF_PRICE)
var pricePattern = /<span[^>]*class="[^"]*c-instrument--last[^"]*"[^>]*>\s*([0-9]+[\s.,]*[0-9]{2,4})/;
var priceMatch = searchContent.match(pricePattern);
if (priceMatch && priceMatch[1]) {
var priceStr = priceMatch[1].replace(/\s/g, '').replace(',', '.');
var priceVal = parseFloat(priceStr);
result.price = isNaN(priceVal) ? priceStr : priceVal;
}
// Extraction de la variation (même logique que BOURSO_ETF_VARIATION)
var variationPattern = /<span[^>]*class="[^"]*c-instrument--variation[^"]*"[^>]*>\s*([+-]?[0-9]+[\s.,]*[0-9]{2,4})/;
var variationMatch = searchContent.match(variationPattern);
if (variationMatch && variationMatch[1]) {
var variationStr = variationMatch[1].replace(/\s/g, '').replace(',', '.');
var variationVal = parseFloat(variationStr);
result.variation = isNaN(variationVal) ? variationStr : variationVal;
}
// Cache du résultat complet pour 5 minutes
cache.put(key, JSON.stringify(result), 300);
return result;
} catch(e) {
return {
price: "N/A",
variation: "N/A"
};
}
}
/**
* Extrait uniquement le prix depuis une URL Boursorama (utilise le cache de BOURSO_VALUE)
* @param {string} url - URL complète vers la page Boursorama
* @param {string} identifier - identifiant Boursorama pour la clé de cache
* @return {number|string} - Le prix ou "N/A"
*/
function BOURSO_PRICE_FROM_URL(url, identifier) {
var data = BOURSO_VALUE(url, identifier);
return data.price;
}
/**
* Extrait uniquement la variation depuis une URL Boursorama (utilise le cache de BOURSO_VALUE)
* @param {string} url - URL complète vers la page Boursorama
* @param {string} identifier - identifiant Boursorama pour la clé de cache
* @return {number|string} - La variation ou "N/A"
*/
function BOURSO_VARIATION_FROM_URL(url, identifier) {
var data = BOURSO_VALUE(url, identifier);
return data.variation;
}
/**
* Extrait le prix d'un ETF/Tracker depuis Boursorama (avec cache 5 min)
* @param {string} identifier - identifiant Boursorama du tracker/ETF (ex: 1zCD91)
* @return {number|string} - Le prix ou "N/A"
*/
function BOURSO_ETF_PRICE(identifier) {
var url = "https://www.boursorama.com/bourse/trackers/cours/" + encodeURIComponent(identifier) + "/";
var data = BOURSO_VALUE(url, identifier);
return data.price;
}
/**
* Extrait la variation journalière d'un ETF/Tracker depuis Boursorama (avec cache 5 min)
* @param {string} identifier - identifiant Boursorama du tracker/ETF (ex: 1zCD91)
* @return {number|string} - La variation ou "N/A"
*/
function BOURSO_ETF_VARIATION(identifier) {
var url = "https://www.boursorama.com/bourse/trackers/cours/" + encodeURIComponent(identifier) + "/";
var data = BOURSO_VALUE(url, identifier);
return data.variation;
}
/**
* Extrait le prix d'une ACTION depuis Boursorama (avec cache 5 min)
* @param {string} identifier - identifiant Boursorama de l'action
* @return {number|string} - Le prix ou "N/A"
*/
function BOURSO_ACTION_PRICE(identifier) {
var url = "https://www.boursorama.com/cours/" + encodeURIComponent(identifier) + "/";
var data = BOURSO_VALUE(url, identifier);
return data.price;
}
/**
* Extrait la variation d'une ACTION depuis Boursorama (avec cache 5 min)
* @param {string} identifier - identifiant Boursorama de l'action
* @return {number|string} - La variation ou "N/A"
*/
function BOURSO_ACTION_VARIATION(identifier) {
var url = "https://www.boursorama.com/cours/" + encodeURIComponent(identifier) + "/";
var data = BOURSO_VALUE(url, identifier);
return data.variation;
}
/**
* Extrait le prix d'une ACTION depuis Boursorama (avec cache 5 min)
* @param {string} identifier - identifiant Boursorama de l'action
* @return {number|string} - Le prix ou "N/A"
*/
function BOURSO_PRICE(identifier) {
var url = "https://www.boursorama.com/bourse/opcvm/cours/" + encodeURIComponent(identifier) + "/";
var data = BOURSO_VALUE(url, identifier);
return data.price;
}
/**
* Extrait la variation d'une ACTION depuis Boursorama (avec cache 5 min)
* @param {string} identifier - identifiant Boursorama de l'action
* @return {number|string} - La variation ou "N/A"
*/
function BOURSO_VARIATION(identifier) {
var url = "https://www.boursorama.com/bourse/opcvm/cours/" + encodeURIComponent(identifier) + "/";
var data = BOURSO_VALUE(url, identifier);
return data.variation;
}
/**
* Extrait le prix d'une ACTION depuis Boursorama (avec cache 5 min)
* @param {string} identifier - identifiant Boursorama de l'action
* @return {number|string} - Le prix ou "N/A"
*/
function BOURSO_OPCVM_PRICE(identifier) {
var url = "https://www.boursorama.com/bourse/opcvm/cours/" + encodeURIComponent(identifier) + "/";
var data = BOURSO_VALUE(url, identifier);
return data.price;
}
/**
* Extrait la variation d'une ACTION depuis Boursorama (avec cache 5 min)
* @param {string} identifier - identifiant Boursorama de l'action
* @return {number|string} - La variation ou "N/A"
*/
function BOURSO_OPCVM_VARIATION(identifier) {
var url = "https://www.boursorama.com/bourse/opcvm/cours/" + encodeURIComponent(identifier) + "/";
var data = BOURSO_VALUE(url, identifier);
return data.variation;
}
Puis sauvegarder le "app script" (CTRL + S suffit je crois)
Ensuite vous pouvez utiliser le code pour récupérer la donnée live (en cache toutes les 5 minutes, a configurer en remplaçant le 300 dans le code si nécessaire, mais attention aux "bans" si trop fréquents)
Le code à utiliser est celui de la fin de l'URL pour le support selectionné :
Afficher la pièce jointe 52407
On utilise ensuite les commandes dans les cellules, exemple avec l'ETF ANRJ, l'action air liquide, le fond hélium selection B :
=BOURSO_ETF_PRICE("1rTANRJ")
=BOURSO_ETF_VARIATION("1rTANRJ")
=BOURSO_ACTION_PRICE("1rPAI")
=BOURSO_ACTION_VARIATION("1rPAI")
=BOURSO_OPCVM_PRICE("0P00017PC2")
=BOURSO_OPCVM_VARIATION("0P00017PC2")