Terug naar Blog

Live wisselkoersen ophalen in Google Sheets (GOOGLEFINANCE, Apps Script en een currency API)

V
Vlado Grigirov
August 25, 2026
Currency API Exchange Rates Google Sheets Apps Script Tutorial Finexly

Live wisselkoersen ophalen in Google Sheets (GOOGLEFINANCE, Apps Script en een currency API)

Live wisselkoersen in Google Sheets ophalen lijkt een opgelost probleem. Je typt =GOOGLEFINANCE("CURRENCY:USDEUR"), er verschijnt een getal en je gaat verder. Voor een persoonlijk reisbudget werkt dat prima. Het houdt op te werken zodra het spreadsheet een factuur, een salarisrun, een omzetrapport of iets anders voedt waar een collega naar handelt — vanwege een licentiebeperking, een gedocumenteerde datumeigenaardigheid en een beperking van Apps Script die vrijwel geen enkele tutorial noemt.

Deze gids behandelt alle drie de praktische methoden — de ingebouwde functie GOOGLEFINANCE, een Apps Script custom function op basis van een currency API, en een geplande koerstabel die door een tijdgestuurde trigger wordt ververst — met de echte quotacijfers, de exacte formuleringen van Googles eigen voorbehouden, en werkende code. Elke uitspraak over Googles gedrag hieronder is geciteerd uit Googles eigen documentatie, en elke uitspraak die niet gedocumenteerd is, wordt als zodanig aangemerkt.


De drie manieren om wisselkoersen in Google Sheets te krijgen

GOOGLEFINANCEApps Script custom functionGeplande koerstabel
OpzettijdSeconden~10 minuten~20 minuten
API-sleutel nodigNeeJaJa
VerversingAutomatisch, bij herberekeningBij herberekeningVia een trigger die jij bepaalt
Historische koersenJa (met voorbehoud)Hangt af van je abonnementJa
Werkt in Apps Script / Sheets APIHistorisch: neeJaJa
Commercieel / professioneel gebruikBeperkt door Googles voorwaardenValt onder de voorwaarden van je API-providerValt onder de voorwaarden van je API-provider
Geschikt voorSnelle opzoekingen, persoonlijke sheetsAd-hoc conversiekolommenAlles waar iemand anders op steunt
De meeste mensen kunnen het beste met methode 1 beginnen en overstappen op methode 3 zodra het sheet dragend wordt.


Methode 1: GOOGLEFINANCE — en wat Google er precies over zegt

De basisformule voor valuta

Het patroon dat elke tutorial aanleert is een CURRENCY:-ticker die bestaat uit twee aaneengeschakelde ISO 4217-valutacodes:

=GOOGLEFINANCE("CURRENCY:USDEUR")

Om een bedrag in cel A2 om te rekenen:

=A2 * GOOGLEFINANCE("CURRENCY:USDEUR")

Om het valutapaar uit twee cellen met valutacodes op te bouwen:

=GOOGLEFINANCE("CURRENCY:" & B2 & C2)

Een eerlijk voorbehoud dat geen enkel concurrerend artikel maakt: de tickervorm CURRENCY:XXXYYY komt nergens voor in Googles officiële GOOGLEFINANCE-documentatie. De gedocumenteerde signature is GOOGLEFINANCE(ticker, [attribute], [start_date], [end_date|num_days], [interval]), en de enige valuta-inhoud op de helppagina is een "currency"-attribuut (de valuta waarin een effect geprijsd is) plus een grafiekvoorbeeld. De CURRENCY:-paarsyntaxis werkt, en doet dat al jaren, maar het is door de community vastgesteld gedrag, geen gedocumenteerde afspraak — wat betekent dat Google het zonder aankondiging van uitfasering mag wijzigen. Google publiceert bovendien geen lijst met ondersteunde valutaparen, dus elk artikel dat beweert dat er "ongeveer 50 valuta's" worden ondersteund, doet een gok.

Historische koersen: de attribuutregel die iedereen fout heeft

Geef een datum mee en je krijgt historische data:

=GOOGLEFINANCE("CURRENCY:USDEUR", "close", DATE(2026,1,15))
=GOOGLEFINANCE("CURRENCY:USDEUR", "close", DATE(2026,1,1), DATE(2026,1,31), "DAILY")

Let op het attribuut. Google documenteert het onomwonden: "Als er datumparameters worden opgegeven, wordt de aanvraag als historisch beschouwd en zijn alleen de historische attributen toegestaan." De historische attributen zijn open, close, high, low, volume en all — en "price" hoort daar niet bij. "price" is uitsluitend gedocumenteerd als realtime-attribuut ("Realtime koersnotering, met een vertraging tot 20 minuten").

Bekijk de best scorende Google Sheets-valutatutorials er maar eens op na: de meeste geven je GOOGLEFINANCE("CURRENCY:USDEUR", "price", DATE(...)). Die combinatie spreekt Googles eigen documentatie tegen. Gebruik "close".

Nog twee gedocumenteerde gedragingen die het waard zijn om te onthouden:

  • "Als start_date wordt opgegeven maar end_date|num_days niet, worden alleen de gegevens van die ene dag geretourneerd."
  • "Realtime resultaten worden geretourneerd als een waarde binnen één cel. Historische gegevens worden, zelfs voor één dag, geretourneerd als een uitgeklapte array met kolomkoppen." Dit is de reden dat een historische formule die er correct uitziet twee kolommen en een kopregel over je nette lay-out uitstort, en waarom je er meestal INDEX(...,2,2) omheen nodig hebt.

De verschuiving naar 12.00 uur UTC

Deze tast datumgebonden rapportages ongemerkt aan. Letterlijk van Google:

"Google behandelt datums die aan GOOGLEFINANCE worden meegegeven als 12.00 uur UTC. Beurzen die vóór dat tijdstip sluiten, kunnen een dag verschoven worden weergegeven."

Als je een grootboek aan het afstemmen bent waarin elke regel de koers van die boekingsdatum moet gebruiken, is een verschuiving van één dag een echte afstemmingsbreuk, geen afrondingskwestie. Herken je je sheet daarin, lees dan onze gids over wisselkoersen en belastingrapportage voordat je een uitgeklapte GOOGLEFINANCE-array als je audittrail vertrouwt.

De vertraging is 3 minuten, geen 20

Vrijwel elk artikel over dit onderwerp vertelt je dat GOOGLEFINANCE-valutakoersen "tot 20 minuten vertraagd" zijn. Dat getal van 20 minuten komt uit de generieke disclaimer voor effectennoteringen bij het attribuut "price". Googles eigen disclaimerpagina van Google Finance publiceert een vertragingstabel per activaklasse, en de regel voor Valuta — wereldwijd, geleverd door Morningstar — staat op 3 minuten. Cryptovaluta staat eveneens op 3 minuten.

De data is dus verser dan het internet denkt. Wat Google niet publiceert, is hoe vaak Sheets de formule herberekent, en dat is nu net het getal waar het je om gaat — een koers van 3 minuten oud in een cel die sinds dinsdag niet is herberekend, blijft een dinsdagkoers. Wie een specifiek herberekeningsinterval noemt, citeert iets dat Google nooit heeft gedocumenteerd.

Ter vergelijking: Finexly ververst koersen elke minuut en levert ze op aanvraag, dus de versheid hangt af van wanneer jij de call doet, niet van wanneer het spreadsheet besluit te herberekenen. Wil je begrijpen wat "live" bij providers in het algemeen betekent, lees dan waar wisselkoers-API's hun data vandaan halen.

De gebruiksbeperking die niemand citeert

Dit is de belangrijkste alinea van dit artikel, en hij komt in geen enkele best scorende tutorial voor. Uit Googles helppagina over GOOGLEFINANCE, letterlijk:

"Gebruiksbeperkingen: De gegevens zijn niet bedoeld voor professioneel gebruik door de financiële sector of voor gebruik door andere professionals bij niet-financiële bedrijven (waaronder overheidsinstanties). Voor professioneel gebruik kunnen aanvullende licentiekosten van een externe gegevensleverancier gelden."

En uit de disclaimer van Google Finance:

"U stemt ermee in geen gegevens of informatie die hierin te vinden is te kopiëren, wijzigen, opnieuw op te maken, downloaden, opslaan, reproduceren, verwerken, verzenden of herdistribueren, en dergelijke gegevens of informatie niet in een commerciële onderneming te gebruiken zonder voorafgaande schriftelijke toestemming."
"Google kan de juistheid van de weergegeven wisselkoersen niet garanderen. U dient de actuele koersen te controleren voordat u transacties uitvoert die beïnvloed kunnen worden door wijzigingen in de wisselkoersen."

Leg dat naast wat jouw sheet daadwerkelijk doet. Een klantfactuur prijzen, leveranciersfacturen omrekenen voor de administratie, of een omgerekend omzetcijfer exporteren naar een rapport dat je naar een klant stuurt, valt niet vanzelfsprekend onder "informatieve doeleinden". Een gelicentieerde wisselkoers-API neemt die vraag volledig weg, en dat — niet de ruwe nauwkeurigheid — is de echte reden dat finance-teams afstappen van GOOGLEFINANCE.

En de harde blokkade

"Historische gegevens kunnen niet worden gedownload of benaderd via de Sheets API of Apps Script. Als je dat toch probeert, zie je een #N/A-fout in plaats van de waarden in de betreffende cellen van je spreadsheet."

Zodra je iets wilt automatiseren — een nachtelijke export, een pull via de Sheets API, een script dat koersen vastlegt — vallen historische GOOGLEFINANCE-gegevens per ontwerp af. Dat is de muur die mensen naar methode 2 duwt.


Methode 2: een Apps Script custom function op basis van een currency API

Een custom function is een JavaScript-functie in Apps Script die je vanuit een cel aanroept zoals elke ingebouwde functie. Google bevestigt expliciet dat dit met webverzoeken werkt: custom functions "kunnen alleen services aanroepen die geen toegang hebben tot persoonlijke gegevens", en URL Fetch staat op de toegestane lijst.

Stap 1: haal een API-sleutel op en sla die netjes op

Pak een gratis sleutel in het Finexly-dashboard — 1.000 verzoeken per maand, geen creditcard nodig. En dan, en dit is belangrijk: hardcode hem niet. Twee van de meest gelinkte Google Sheets-valutatutorials plakken de API-sleutel rechtstreeks in het script, in een bestand dat met het spreadsheet meereist naar iedereen met wie je het deelt.

Voer dit in de Apps Script-editor (Extensies → Apps Script) één keer uit vanuit de editor om de sleutel op te slaan in Script Properties:

function storeApiKey() {
  PropertiesService.getScriptProperties()
    .setProperty('FINEXLY_API_KEY', 'YOUR_API_KEY');
}

Verwijder daarna de letterlijke waarde uit het bestand. Let op de gedocumenteerde limieten: een property-waarde is begrensd op 9 KB en een property store op 500 KB in totaal — ruim voldoende voor een sleutel, maar geen plek om data te cachen.

Stap 2: een custom function voor één valutapaar

/**
 * Returns the live exchange rate for a currency pair.
 *
 * @param {string} from Base currency code, e.g. "USD".
 * @param {string} to Quote currency code, e.g. "EUR".
 * @return The exchange rate.
 * @customfunction
 */
function FX_RATE(from, to) {
  if (!from || !to) throw new Error('Both currency codes are required.');

  var pair = String(from).toUpperCase() + '_' + String(to).toUpperCase();
  var cache = CacheService.getScriptCache();
  var hit = cache.get(pair);
  if (hit !== null) return Number(hit);

  var key = PropertiesService.getScriptProperties().getProperty('FINEXLY_API_KEY');
  var res = UrlFetchApp.fetch(
    'https://api.finexly.com/v1/rate?from=' + encodeURIComponent(from) +
      '&to=' + encodeURIComponent(to),
    {
      headers: { Authorization: 'Bearer ' + key },
      muteHttpExceptions: true
    }
  );

  var code = res.getResponseCode();
  var body = JSON.parse(res.getContentText());
  if (code !== 200) {
    throw new Error(body.error ? body.error.code + ': ' + body.error.message : 'HTTP ' + code);
  }

  cache.put(pair, String(body.rate), 300); // 5 minutes
  return body.rate;
}

Gebruik in een cel:

=FX_RATE("USD","EUR")
=A2 * FX_RATE($B$1, $C$1)

Het endpoint /v1/rate retourneert {"pair": "USD_EUR", "rate": 0.9215}. De volledige parameterreferentie staat in de Finexly API-documentatie.

Stap 3: batch het bereik — het onderdeel dat elke concurrent mist

Hier zit het faalscenario. Google documenteert het rechtstreeks:

"Elke keer dat een custom function in een spreadsheet wordt gebruikt, doet Sheets een aparte aanroep naar de Apps Script-server. Als je spreadsheet tientallen (of honderden, of duizenden!) custom function-aanroepen bevat, kan dit proces traag zijn."

Sleep FX_RATE 400 rijen omlaag en je hebt 400 round trips gemaakt. Met een limiet van 30 seconden per uitvoering voor custom functions loop je tegen #ERROR! aan met de melding Exceeded maximum execution time (line 0). lang voordat je je API-quotum raakt.

De oplossing die Google aanbeveelt is array-batching: accepteer een bereik, retourneer een array. Het endpoint /v1/convert van Finexly accepteert komagescheiden valutaparen, waardoor de hele kolom één HTTP-verzoek wordt:

/**
 * Converts a column of amounts from one currency to another in a single API call.
 *
 * @param {A2:A400} amounts Range of amounts.
 * @param {string} from Base currency code.
 * @param {string} to Quote currency code.
 * @return {Array} Converted amounts.
 * @customfunction
 */
function FX_CONVERT_RANGE(amounts, from, to) {
  var rate = FX_RATE(from, to);           // one fetch, then cached
  var rows = Array.isArray(amounts) ? amounts : [[amounts]];
  return rows.map(function (row) {
    return row.map(function (v) {
      return (v === '' || v === null) ? '' : Number(v) * rate;
    });
  });
}
=FX_CONVERT_RANGE(A2:A400, "USD", "EUR")

Eén formule, één netwerkaanroep, 399 round trips minder. Heb je meerdere paren tegelijk nodig, roep dan /v1/convert?q=USD_EUR,USD_GBP,USD_JPY aan en lees body["USD_EUR"].rate uit.

Wat Google werkelijk zegt over caching in custom functions

Hierboven wordt CacheService gebruikt, maar wees precies over waarom. Googles gids over custom functions beoordeelt de Cache-service als "Werkt, maar is niet bijzonder nuttig in custom functions." Het cachingvoordeel is alleen echt tussen afzonderlijke uitvoeringen door — herhaalde herberekeningen van hetzelfde paar — niet binnen één uitgeklapte array. Array-batching is de gedocumenteerde optimalisatie; caching is een nuttige tweede laag.

De gedocumenteerde cachelimieten: sleutels tot 250 tekens, waarden tot 100 KB, een maximum van 1.000 items, en een geldigheidsduur tussen 1 seconde en 21.600 seconden (6 uur), standaard 600 seconden. Er is geen gepubliceerd dagquotum voor cache-aanroepen.

Nog één gedocumenteerde valkuil, omdat deze workaround breed circuleert: NOW() als argument toevoegen om een verversing af te dwingen breekt de functie. Google: "Argumenten van custom functions moeten deterministisch zijn … Als een custom function probeert een waarde te retourneren op basis van een van deze vluchtige ingebouwde functies, blijft Loading... oneindig staan."


Methode 3: een geplande koerstabel (het productiepatroon)

Custom functions herberekenen wanneer het Sheets uitkomt, en dat is precies de verkeerde eigenschap voor een sheet dat iemand anders leest. Het robuuste patroon is om helemaal te stoppen met ophalen vanuit cellen: schrijf koersen volgens een schema in een tabel en zoek ze daarna op met gewone formules.

Het verversingsscript

var PAIRS = ['USD_EUR', 'USD_GBP', 'USD_JPY', 'USD_CAD', 'USD_AUD', 'USD_CHF'];

function refreshRates() {
  var key = PropertiesService.getScriptProperties().getProperty('FINEXLY_API_KEY');
  var res = UrlFetchApp.fetch(
    'https://api.finexly.com/v1/convert?q=' + PAIRS.join(','),
    { headers: { Authorization: 'Bearer ' + key }, muteHttpExceptions: true }
  );

  if (res.getResponseCode() !== 200) {
    console.error('Finexly refresh failed: ' + res.getContentText());
    return; // keep yesterday's rates rather than blanking the sheet
  }

  var data = JSON.parse(res.getContentText());
  var stamp = new Date();
  var rows = PAIRS.map(function (p) {
    return [p, p.split('_')[0], p.split('_')[1], data[p].rate, stamp];
  });

  var sheet = SpreadsheetApp.getActive().getSheetByName('Rates') ||
              SpreadsheetApp.getActive().insertSheet('Rates');
  sheet.clear();
  sheet.getRange(1, 1, 1, 5)
       .setValues([['Pair', 'From', 'To', 'Rate', 'Updated (UTC)']])
       .setFontWeight('bold');
  sheet.getRange(2, 1, rows.length, 5).setValues(rows);
}

Twee details onderscheiden dit van de scripts die je elders vindt. Ten eerste: één setValues()-aanroep, niet één per cel — gebatchte bereikschrijfacties zijn dramatisch sneller. Ten tweede: een mislukte fetch keert vroegtijdig terug in plaats van de tabel te wissen, zodat een hapering bij de provider verouderde-maar-gelabelde koersen achterlaat in plaats van een sheet vol lege cellen die stilletjes elk onderliggend totaal op nul zetten.

De trigger aanmaken

function installTrigger() {
  ScriptApp.getProjectTriggers().forEach(function (t) {
    if (t.getHandlerFunction() === 'refreshRates') ScriptApp.deleteTrigger(t);
  });
  ScriptApp.newTrigger('refreshRates').timeBased().everyHours(1).create();
}

Google documenteert dat tijdgestuurde triggers "zo vaak als elke minuut of zo zelden als eens per maand" kunnen draaien, en dat het moment van afvuren bewust wordt gespreid: "als je een terugkerende trigger om 9 uur aanmaakt, kiest Apps Script een tijdstip tussen 9 en 10 uur." Gebruik je everyMinutes(n), dan moet n 1, 5, 10, 15 of 30 zijn — geen andere waarde wordt geaccepteerd.

De koersen uitlezen

=XLOOKUP("USD_EUR", Rates!A:A, Rates!D:D)
=A2 * XLOOKUP($B$1 & "_" & $C$1, Rates!A:A, Rates!D:D)

Elke conversie in de werkmap wordt nu direct opgelost vanuit lokale cellen, gebruikt één consistente koers en draagt een zichtbare tijdstempel. Dat laatste punt is precies waar accountants naar vragen.


Quota en limieten waar je echt tegenaan loopt

Dit zijn Googles gepubliceerde Apps Script-cijfers — de moeite waard om te kennen voordat je er je ontwerp omheen bouwt:

LimietConsumentenaccount (gmail.com)Google Workspace-account
URL Fetch-aanroepen20.000 / dag100.000 / dag
Totale looptijd van triggers90 min / dag6 uur / dag
Properties lezen/schrijven50.000 / dag500.000 / dag
Looptijd custom function30 sec / uitvoering30 sec / uitvoering
Looptijd script6 min / uitvoering6 min / uitvoering
Triggers per gebruiker per script2020
URL-lengte URL Fetch2 KB / aanroep2 KB / aanroep
Die URL-limiet van 2 KB is het praktische plafond voor hoeveel paren je in één ?q=-batch kunt proppen — ruim meer dan honderd, maar niet onbeperkt.

Aan de API-kant staat het gratis abonnement van Finexly 1.000 verzoeken per maand toe bij 10 verzoeken per minuut. Een trigger die elk uur draait, gebruikt ruwweg 730 verzoeken per maand — binnen de gratis laag, met ruimte over. Voeg daar een handvol ad-hoc aanroepen van custom functions aan toe en je wilt misschien het Starter-abonnement; de actuele lagen staan op de prijspagina. Let op: historische koersen vereisen een betaald abonnement, dus als je met terugwerkende kracht koersen nodig hebt en geen budget hebt, blijft GOOGLEFINANCE het eerlijke antwoord voor persoonlijk, niet-professioneel gebruik.

Elke response bevat de headers X-RateLimit-Limit, X-RateLimit-Used en X-RateLimit-Units, zodat je het verbruik kunt loggen vanuit res.getAllHeaders() en een naderende limiet ziet aankomen.


Veelvoorkomende fouten en hoe je ze oplost

Wat je zietOorzaakOplossing
#N/A van GOOGLEFINANCENiet-ondersteund of verkeerd getypt valutapaar, of historische data opgevraagd via Apps Script / de Sheets APIControleer beide ISO-codes; gebruik voor automatisering een API
#ERROR! met "Exceeded maximum execution time (line 0)."Te veel individuele aanroepen van custom functionsStap over op het gebatchte FX_CONVERT_RANGE-patroon
Eeuwig Loading...NOW(), RAND() of een andere vluchtige functie meegegeven als argument van een custom functionHaal hem weg — Google documenteert dit als niet-ondersteund
401 UNAUTHORIZED / invalid tokenOntbrekende of verkeerde API-sleutelControleer of de Script Property is ingesteld en de header Bearer <key> bevat
429 RATE_LIMIT_EXCEEDEDLimiet per minuut of per maand bereiktVerleng de cache-TTL, batch meer paren per aanroep, of upgrade
You do not have permission to call X service.Een custom function riep een service aan die autorisatie vereistVerplaats die logica naar een functie die door een trigger wordt uitgevoerd
Historische formule stort extra kolommen uitGedocumenteerd gedrag — historische resultaten komen terug als een array met kopregelsVerpak in INDEX(..., 2, 2)
Voor diepere patronen rond retries, backoff en cache-invalidatie in productie, zie onze gids over caching en foutafhandeling bij currency API's.


Welke methode moet je gebruiken?

  • Persoonlijk sheet, snelle opzoeking, geen geld in het spel: GOOGLEFINANCE. Het is gratis, direct, en de licentiebeperking bijt niet.
  • Een conversiekolom in een werkend spreadsheet: de gebatchte Apps Script custom function. Voorspelbare databron, geen licentie-onduidelijkheid, één aanroep per bereik.
  • Alles wat een collega, klant of accountant leest: de geplande koerstabel. Eén koers per verversingscyclus, een zichtbare tijdstempel, en geen afhankelijkheid van wanneer Sheets besluit te herberekenen.

Werk je in plaats daarvan in Excel? De equivalente methoden — Power Query, WEBSERVICE en het gegevenstype Valuta — komen aan bod in live wisselkoersen ophalen in Excel. Ben je nog providers aan het vergelijken, dan zet onze vergelijking van currency API's de verschillen op een rij, en kun je elke koers controleren met de Finexly valutaomrekenaar.


Veelgestelde vragen

Hoe krijg ik gratis live wisselkoersen in Google Sheets?

=GOOGLEFINANCE("CURRENCY:USDEUR") kost niets en vereist geen installatie. Houd rekening met Googles uitdrukkelijke gebruiksbeperking — de gegevens zijn "niet bedoeld voor professioneel gebruik door de financiële sector of voor gebruik door andere professionals bij niet-financiële bedrijven" — en met het feit dat historische waarden niet via Apps Script of de Sheets API uitgelezen kunnen worden. Voor een gelicentieerd alternatief zonder kosten dekt een gratis API-laag van 1.000 verzoeken per maand een verversing per uur (ongeveer 730 aanroepen) ruimschoots.

Hoe vaak werkt GOOGLEFINANCE valutakoersen bij?

De disclaimertabel van Google Finance vermeldt een vertraging van 3 minuten voor valutadata, afkomstig van Morningstar — niet de 20 minuten die online vaak wordt herhaald; dat is het generieke cijfer voor effectennoteringen dat bij het attribuut "price" hoort. Daarnaast heeft Google nooit gepubliceerd hoe vaak Sheets de formule herberekent, dus op de ouderdom van het getal in je cel kun je niet vertrouwen.

Kan ik GOOGLEFINANCE binnen Apps Script gebruiken?

Niet voor historische data. Google stelt: "Historische gegevens kunnen niet worden gedownload of benaderd via de Sheets API of Apps Script. Als je dat toch probeert, zie je een #N/A-fout." Er bestaat bovendien geen GOOGLEFINANCE-methode in welke Apps Script-service dan ook — een script kan alleen een waarde uitlezen die een cel al berekend heeft. Heb je koersen in code nodig, roep dan een currency API aan met UrlFetchApp.

Waarom is mijn valutaformule in Google Sheets traag of toont hij #ERROR!?

Elke aanroep van een custom function is een aparte round trip naar de Apps Script-server, en elke uitvoering is begrensd op 30 seconden. Honderden losse aanroepen lopen in een time-out. Accepteer een bereik en retourneer een array zodat één aanroep de hele kolom afdekt, cache de koers, en verplaats voor alles wat gepland is het ophalen naar een tijdgestuurde trigger in plaats van naar een cel.

Kan ik historische wisselkoersen ophalen in Google Sheets?

Ja, op twee manieren. GOOGLEFINANCE("CURRENCY:USDEUR", "close", DATE(2026,1,1), DATE(2026,1,31), "DAILY") retourneert een dagelijkse reeks — gebruik "close", want "price" is geen geldig historisch attribuut, en onthoud dat Google de datums als 12.00 uur UTC behandelt, wat een waarde een dag kan verschuiven. Of haal historische koersen op bij een API met een betaald abonnement en schrijf ze met een trigger naar een sheet; dat is de enige route die automatisering overleeft.


Klaar om gelicentieerde, minuutverse wisselkoersen in je spreadsheet te zetten? Vraag je gratis Finexly API-sleutel aan — geen creditcard nodig. Begin met 1.000 verzoeken per maand voor meer dan 170 valuta's, en upgrade wanneer je sheets eroverheen groeien.

Vlado Grigirov

Senior Currency Markets Analyst & Financial Strategist

Vlado Grigirov is a senior currency markets analyst and financial strategist with over 14 years of experience in foreign exchange markets, cross-border finance, and currency risk management. He has wo...

View full profile →