Fonduppföljning - Script i Google Sheets?

Någon som lyckats få till ett script eller liknande för att följa upp fonders NAV i Google Sheets?
GoogleFinance funkar inte för fonder och jag har inte fått till utläsning från Yahoo till Sheets. Yahoo blockar alla försök jag gjort.
Vill få till “senaste NAV” och möjligen även få fram NAV för ett specifikt datum. Inte ute efter hela dataserier.

1 gillning

Jag använder Equities, ETF and Funds prices, indices and stock quotes - FT.com

image

image

2 gillningar

Det enklaste är att hämta in kurserna från t.ex FT.com som skrevs ovan, och sedan göra en apps script funktion som automatiskt loggar kurserna i arket. Sen kan man i översikten lägga en formel som tar senast loggade kurs, dividerar med föregående och utifrån det visar senaste dagsförändringen.

Bilden visar ett utdrag av min loggning för DNB Global, samt senaste kurs + 1-dag förändring på min startsida. Allt uppdateras automatiskt, och man får sätta en trigger för funktionen som loggar kursen så att den körs en gång per vardag.

Min tanke var att ha ett script som sköter det, precis som @L_D gjort. Då har jag ISIN i en kolumn och sedan anropar jag scriptet för varje fond med ISIN. Men jag har inte lyckats få till det med FT än :laughing:

testade lite med Gemini funkar som det ska om jag förstått vad du är ute efter

Alternativ 1: Script för Yahoos JSON-API (Bästa metoden om GoogleFinance strular)

Klistra in detta under TilläggApps Script (samma plats där du eventuellt lade in de tidigare fund-scripten).

JavaScript

/**
 * Hämtar senaste pris för ETF:er (och aktier) via Yahoo Finances dolda JSON-API.
 * Detta blockeras inte av Yahoo.
 * Användning i cellen: =ETF_YAHOO("VWCE.DE") 
 */
function ETF_YAHOO(ticker) {
  if (!ticker) return "Ange ticker";
  
  // Yahoos interna API som returnerar ren data (JSON) istället för en HTML-sida
  var url = "https://query1.finance.yahoo.com/v8/finance/chart/" + encodeURIComponent(ticker);
  
  try {
    // Lägger till en falsk webbläsar-identitet (User-Agent) för extra stabilitet
    var options = {
      "muteHttpExceptions": true,
      "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"
      }
    };
    
    var response = UrlFetchApp.fetch(url, options);
    var data = JSON.parse(response.getContentText());
    
    // Letar upp det aktuella priset i den strukturerade datan
    var price = data.chart.result[0].meta.regularMarketPrice;
    
    if (price !== undefined) {
      return price;
    } else {
      return "Pris saknas";
    }
  } catch (e) {
    return "Fel: Kontrollera ticker";
  }
}

Så här använder du det: Gå till Yahoo Finance, sök upp din ETF och kolla vad den har för “Ticker” (symbolen står oftast i parentes efter namnet, eller högst upp).

  • För Vanguard FTSE All-World (på Xetra) är tickern VWCE.DE.

  • För Xact Norden (på Stockholmsbörsen) är tickern XACT-NORDEN.ST.

Skriv in formeln i Sheets: =ETF_YAHOO("VWCE.DE")

Tack, ska testa.
Funkar den även för vanliga fonder eller endast för ETF:er?
Har även ETF:er om du undrar :slight_smile:

Det var bara för ETF men bad Gemini kombinera ihop scripten till en lösning detta bör fungera för dig

/**

  • Hämtar senaste NAV från Avanza (Bäst och snabbast för svenska fonder)
  • Användning i cellen: =NAV_AVANZA(“417655”)
    */
    function NAV_AVANZA(fundId) {
    if (!fundId) return “Ange ID”;
    // Anropar Avanzas öppna men odokumenterade API
    var url = “https://www.avanza.se/_api/fund-guide/guide/” + fundId;
    try {
    var response = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
    var data = JSON.parse(response.getContentText());
    return data.nav; // Returnerar senaste NAV
    } catch (e) {
    return “Fel vid hämtning”;
    }
    }

/**

  • Hämtar senaste NAV från Financial Times (Ditt förslag)

  • Användning i cellen: =NAV_FT(“SE0005188836:SEK”)
    */
    function NAV_FT(ticker) {
    if (!ticker) return “Ange FT-ticker”;
    // Använder fondens specifika sida (tearsheet) istället för sök-sidan
    var url = “Equities, ETF and Funds prices, indices and stock quotes - FT.com + ticker;
    try {
    var response = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
    var html = response.getContentText();

    // Letar upp priset i HTML-koden
    var regex = /([\d,.]+)/;
    var match = regex.exec(html);

    if (match) {
    // Tar bort eventuella tusentalsavgränsare och konverterar till ett tal
    return parseFloat(match[1].replace(/,/g, ‘’));
    }
    return “Hittades inte”;
    } catch (e) {
    return “Fel vid hämtning”;
    }
    }

Efter att du har sparat har du tillgång till dessa tre formler i ditt kalkylark:

  1. För svenska fonder (via Avanza): =NAV_AVANZA("417655")

  2. För fonder via Financial Times: =NAV_FT("SE0005188836:SEK")

  3. För börshandlade fonder (ETF:er) via Yahoo: =ETF_YAHOO("VWCE.DE")

Får syntaxfel, lust att klistra in som förra inlägget så det inte blir fel pga HTML konvertering?

Jag har löst det på ett rätt så komplicerat sätt. Jag har försökt ta så mycket som möjligt från nordnet men vissa slutade funka så då kanske jag har gått till fondens privata sida eller till Financial times.

Det är inte en lika elegant lösning som det första svaret men det får jobbet gjort just nu i alla fall. Här är några exempel:

För fonden Swedbank Robur Realränta, Pris taget från nordnet.
=IMPORTXML(“https://www.nordnet.se/fonder/lista/swedbank-robur-realranta-a-sek-bb1aa621";"/html/body/div[1]/div/div/main/div/div[1]/div/div/header/div[2]/div/div[2]/div[1]/div[2]/div[4]/span[2]/text()”)

För ETF AVEM, info taget från financial times.
=Value(substitute(left(IMPORTXML(
Avantis Emerging Markets Equity UCITS ETF USD Acc, AVEM:GER:EUR summary - FT.com”;
“//span[contains(text(),‘Price’)]/following-sibling::span”);5);“.”;“,”
))

Mitt bästa förslag är att ge en ai hela formeln och be den stoppa in den ETF som du vill ha koll på.

Prova en funktion i taget. De är ju separata ändå