Zurück zum Blog

Live-Wechselkurse in Google Sheets abrufen (GOOGLEFINANCE, Apps Script und eine Currency API)

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

Live-Wechselkurse in Google Sheets abrufen (GOOGLEFINANCE, Apps Script und eine Currency API)

Live-Wechselkurse in Google Sheets wirken wie ein längst gelöstes Problem. Man tippt =GOOGLEFINANCE("CURRENCY:USDEUR"), eine Zahl erscheint, fertig. Für ein privates Reisebudget reicht das völlig. Es hört genau in dem Moment auf zu funktionieren, in dem die Tabelle eine Rechnung, einen Lohnlauf, einen Umsatzbericht oder irgendetwas speist, auf das eine Kollegin oder ein Kollege reagieren wird — wegen einer Lizenzbeschränkung, einer dokumentierten Datums-Eigenheit und einer Apps-Script-Einschränkung, die praktisch kein Tutorial erwähnt.

Dieser Leitfaden behandelt alle drei praxistauglichen Methoden — die eingebaute Funktion GOOGLEFINANCE, eine benutzerdefinierte Apps-Script-Funktion auf Basis einer Currency API und eine geplante Kurstabelle, die von einem zeitgesteuerten Trigger aktualisiert wird — inklusive der echten Kontingentzahlen, dem exakten Wortlaut von Googles eigenen Einschränkungen und lauffähigem Code. Jede Aussage über Googles Verhalten ist im Folgenden aus Googles eigener Dokumentation zitiert, und jede Aussage, die nicht dokumentiert ist, wird als solche gekennzeichnet.


Die drei Wege, Wechselkurse in Google Sheets zu holen

GOOGLEFINANCEBenutzerdefinierte Apps-Script-FunktionGeplante Kurstabelle
EinrichtungszeitSekundenca. 10 Minutenca. 20 Minuten
API-Schlüssel nötigNeinJaJa
AktualisierungAutomatisch, bei NeuberechnungBei NeuberechnungÜber einen Trigger, den Sie steuern
Historische KurseJa (mit Einschränkungen)Hängt von Ihrem Tarif abJa
Funktioniert in Apps Script / Sheets APIHistorisch: neinJaJa
Kommerzielle / professionelle NutzungDurch Googles Bedingungen eingeschränktRichtet sich nach den Bedingungen Ihres API-AnbietersRichtet sich nach den Bedingungen Ihres API-Anbieters
Am besten fürSchnelle Abfragen, private TabellenAd-hoc-UmrechnungsspaltenAlles, worauf sich andere verlassen
Die meisten sollten mit Methode 1 starten und in dem Moment auf Methode 3 wechseln, in dem die Tabelle tragend wird.


Methode 1: GOOGLEFINANCE — und was Google genau dazu sagt

Die Basis-Währungsformel

Das Muster, das jedes Tutorial lehrt, ist ein CURRENCY:-Ticker aus zwei aneinandergehängten ISO-4217-Währungscodes:

=GOOGLEFINANCE("CURRENCY:USDEUR")

Um einen Betrag in Zelle A2 umzurechnen:

=A2 * GOOGLEFINANCE("CURRENCY:USDEUR")

Um das Währungspaar aus zwei Zellen mit Währungscodes zu bilden:

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

Ein ehrlicher Hinweis, den kein konkurrierender Artikel gibt: Die Ticker-Form CURRENCY:XXXYYY taucht nirgendwo in Googles offizieller GOOGLEFINANCE-Dokumentation auf. Die dokumentierte Signatur lautet GOOGLEFINANCE(ticker, [attribute], [start_date], [end_date|num_days], [interval]), und der einzige Währungsinhalt der Hilfeseite ist ein "currency"-Attribut (die Währung, in der ein Wertpapier notiert ist) sowie ein Diagrammbeispiel. Die CURRENCY:-Paarsyntax funktioniert und tut das seit Jahren, aber sie ist von der Community etabliertes Verhalten, kein dokumentierter Vertrag — was bedeutet, dass Google sie ohne Ankündigung einer Einstellung ändern darf. Google veröffentlicht außerdem keine Liste unterstützter Währungspaare, jeder Artikel, der Ihnen sagt, es würden „rund 50 Währungen" unterstützt, rät also nur.

Historische Kurse: die Attributregel, die alle falsch machen

Übergeben Sie ein Datum, erhalten Sie historische Daten:

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

Achten Sie auf das Attribut. Google dokumentiert es unmissverständlich: „Wenn Datumsparameter angegeben werden, gilt die Anfrage als historisch und es sind nur die historischen Attribute zulässig." Die historischen Attribute sind open, close, high, low, volume und all — und "price" gehört nicht dazu. "price" ist ausschließlich als Echtzeit-Attribut dokumentiert („Echtzeit-Kursnotierung, um bis zu 20 Minuten verzögert").

Sehen Sie sich die bestplatzierten Google-Sheets-Währungstutorials jetzt einmal an: Die meisten reichen Ihnen GOOGLEFINANCE("CURRENCY:USDEUR", "price", DATE(...)). Diese Kombination widerspricht Googles eigener Dokumentation. Verwenden Sie "close".

Zwei weitere dokumentierte Verhaltensweisen, die man verinnerlichen sollte:

  • „Wenn start_date angegeben ist, end_date|num_days aber nicht, werden nur die Daten des einen Tages zurückgegeben."
  • „Echtzeitergebnisse werden als Wert in einer einzelnen Zelle zurückgegeben. Historische Daten werden selbst für einen einzelnen Tag als aufgeklapptes Array mit Spaltenüberschriften zurückgegeben." Deshalb sprengt eine historische Formel, die korrekt aussieht, zwei Spalten und eine Kopfzeile in Ihr sauberes Layout — und deshalb brauchen Sie meist ein INDEX(...,2,2) darum herum.

Die Mittags-UTC-Verschiebung

Diese Eigenheit beschädigt datumsabgeglichene Berichte lautlos. Wörtlich von Google:

„Google behandelt Datumsangaben, die an GOOGLEFINANCE übergeben werden, als 12:00 Uhr UTC. Börsen, die vor diesem Zeitpunkt schließen, können um einen Tag verschoben sein."

Wenn Sie ein Hauptbuch abstimmen, in dem jede Zeile den Kurs für ihr Buchungsdatum verwenden muss, ist eine Verschiebung um einen Tag ein echter Abstimmungsbruch, kein Rundungsproblem. Trifft das auf Ihre Tabelle zu, lesen Sie unseren Leitfaden zu Wechselkursen und Steuerberichterstattung, bevor Sie einem aufgeklappten GOOGLEFINANCE-Array als Prüfnachweis vertrauen.

Die Verzögerung beträgt 3 Minuten, nicht 20

Nahezu jeder Artikel zu diesem Thema erzählt Ihnen, GOOGLEFINANCE-Währungskurse seien „um bis zu 20 Minuten verzögert". Diese 20-Minuten-Zahl stammt aus dem allgemeinen Wertpapier-Kurshinweis am Attribut "price". Googles eigene Google-Finance-Haftungsausschlussseite veröffentlicht eine Verzögerungstabelle pro Anlageklasse, und die Zeile für Währungen — global, geliefert von Morningstar — nennt 3 Minuten. Kryptowährungen liegen ebenfalls bei 3 Minuten.

Die Daten sind also frischer, als das Internet glaubt. Was Google nicht veröffentlicht, ist, wie oft Sheets die Formel neu berechnet — und genau diese Zahl interessiert Sie eigentlich. Ein 3 Minuten alter Kurs in einer Zelle, die seit Dienstag nicht neu berechnet wurde, ist immer noch ein Dienstagskurs. Wer ein konkretes Neuberechnungsintervall nennt, zitiert etwas, das Google nie dokumentiert hat.

Zum Vergleich: Finexly aktualisiert Kurse jede Minute und liefert sie auf Anfrage aus, die Aktualität hängt also davon ab, wann Sie aufrufen, und nicht davon, wann die Tabelle sich zur Neuberechnung entschließt. Wenn Sie generell verstehen wollen, was „live" bei verschiedenen Anbietern bedeutet, lesen Sie woher Wechselkurs-APIs ihre Daten beziehen.

Die Nutzungsbeschränkung, die niemand zitiert

Das ist der mit Abstand wichtigste Absatz dieses Artikels, und er kommt in keinem der bestplatzierten Tutorials vor. Aus Googles GOOGLEFINANCE-Hilfeseite, wörtlich:

Nutzungsbeschränkungen: Die Daten sind nicht für die professionelle Nutzung in der Finanzbranche oder die Nutzung durch andere Fachleute in nicht-finanziellen Unternehmen (einschließlich staatlicher Stellen) bestimmt. Für die professionelle Nutzung können zusätzliche Lizenzgebühren eines Drittanbieters von Daten anfallen."

Und aus dem Google-Finance-Haftungsausschluss:

„Sie erklären sich damit einverstanden, keine hier vorgefundenen Daten oder Informationen ohne vorherige schriftliche Zustimmung zu kopieren, zu verändern, umzuformatieren, herunterzuladen, zu speichern, zu vervielfältigen, weiterzuverarbeiten, zu übertragen oder weiterzuverbreiten oder solche Daten oder Informationen in einem kommerziellen Unternehmen zu verwenden."
„Google kann die Richtigkeit der angezeigten Wechselkurse nicht garantieren. Sie sollten die aktuellen Kurse bestätigen, bevor Sie Transaktionen tätigen, die von Änderungen der Wechselkurse betroffen sein könnten."

Halten Sie das gegen das, was Ihre Tabelle tatsächlich tut. Eine Kundenrechnung zu kalkulieren, Lieferantenrechnungen für die Buchhaltung umzurechnen oder eine umgerechnete Umsatzzahl in einen Bericht zu exportieren, den Sie an einen Kunden schicken, ist nicht offensichtlich „zu Informationszwecken". Eine lizenzierte Wechselkurs-API beseitigt die Frage vollständig — und genau das, nicht die reine Genauigkeit, ist der eigentliche Grund, warum Finanzteams von GOOGLEFINANCE weggehen.

Und der harte Blocker

„Historische Daten können nicht über die Sheets API oder Apps Script heruntergeladen oder abgerufen werden. Wenn Sie es versuchen, sehen Sie in den entsprechenden Zellen Ihrer Tabelle einen #N/A-Fehler anstelle der Werte."

In dem Moment, in dem Sie irgendetwas automatisieren wollen — einen nächtlichen Export, einen Abruf über die Sheets API, ein Skript, das Kurse als Momentaufnahme sichert — sind historische GOOGLEFINANCE-Daten konstruktionsbedingt vom Tisch. Das ist die Wand, die Leute zu Methode 2 treibt.


Methode 2: Eine benutzerdefinierte Apps-Script-Funktion auf Basis einer Currency API

Eine benutzerdefinierte Funktion ist eine JavaScript-Funktion in Apps Script, die Sie aus einer Zelle heraus wie jede eingebaute Funktion aufrufen. Google bestätigt ausdrücklich, dass das mit Webanfragen funktioniert: Benutzerdefinierte Funktionen „können nur Dienste aufrufen, die keinen Zugriff auf personenbezogene Daten haben" — und URL Fetch steht auf der erlaubten Liste.

Schritt 1: Einen API-Schlüssel holen und richtig speichern

Holen Sie sich einen kostenlosen Schlüssel im Finexly-Dashboard — 1.000 Anfragen pro Monat, keine Kreditkarte. Und dann, das ist entscheidend: codieren Sie ihn nicht fest ein. Zwei der meistverlinkten Google-Sheets-Währungstutorials kleben den API-Schlüssel direkt ins Skript, in eine Datei, die mit der Tabelle zu jedem wandert, mit dem Sie sie teilen.

Führen Sie im Apps-Script-Editor (Erweiterungen → Apps Script) dies einmal aus dem Editor aus, um den Schlüssel in den Skripteigenschaften zu speichern:

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

Löschen Sie das Literal danach aus der Datei. Beachten Sie die dokumentierten Grenzen: Ein Eigenschaftswert ist auf 9 KB begrenzt, ein Eigenschaftsspeicher auf insgesamt 500 KB — reichlich für einen Schlüssel, aber kein Ort, um Daten zwischenzuspeichern.

Schritt 2: Eine Funktion für ein einzelnes Währungspaar

/**
 * 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;
}

Verwendung in einer Zelle:

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

Der Endpunkt /v1/rate liefert {"pair": "USD_EUR", "rate": 0.9215}. Die vollständige Parameterreferenz finden Sie in der Finexly-API-Dokumentation.

Schritt 3: Den Bereich bündeln — der Teil, den jeder Wettbewerber übersieht

Hier ist der Fehlermodus. Google dokumentiert ihn direkt:

„Jedes Mal, wenn eine benutzerdefinierte Funktion in einer Tabelle verwendet wird, sendet Sheets einen separaten Aufruf an den Apps-Script-Server. Wenn Ihre Tabelle Dutzende (oder Hunderte oder Tausende!) von Aufrufen benutzerdefinierter Funktionen enthält, kann dieser Vorgang langsam sein."

Ziehen Sie FX_RATE über 400 Zeilen nach unten, und Sie haben 400 Roundtrips erzeugt. Mit einem Limit von 30 Sekunden pro Ausführung für benutzerdefinierte Funktionen landen Sie bei #ERROR! mit dem Hinweis Exceeded maximum execution time (line 0)., lange bevor Sie Ihr API-Kontingent erreichen.

Die von Google empfohlene Lösung ist Array-Bündelung: einen Bereich annehmen, ein Array zurückgeben. Finexlys Endpunkt /v1/convert nimmt kommagetrennte Paare entgegen, sodass die gesamte Spalte zu einer HTTP-Anfrage wird:

/**
 * 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")

Eine Formel, ein Netzwerkaufruf, 399 Roundtrips weniger. Wenn Sie mehrere Paare auf einmal brauchen, rufen Sie /v1/convert?q=USD_EUR,USD_GBP,USD_JPY auf und lesen body["USD_EUR"].rate.

Was Google tatsächlich zum Caching in benutzerdefinierten Funktionen sagt

Oben wird CacheService verwendet, aber seien wir präzise, warum. Googles Leitfaden zu benutzerdefinierten Funktionen bewertet den Cache-Dienst als „Funktioniert, ist in benutzerdefinierten Funktionen aber nicht besonders nützlich." Der Caching-Vorteil ist nur über getrennte Ausführungen hinweg real — bei wiederholten Neuberechnungen desselben Paares — nicht innerhalb eines einzelnen aufgeklappten Arrays. Array-Bündelung ist die dokumentierte Optimierung; Caching ist ein nützliches Beiwerk.

Die dokumentierten Cache-Grenzen: Schlüssel bis 250 Zeichen, Werte bis 100 KB, eine Obergrenze von 1.000 Einträgen und eine Ablaufzeit zwischen 1 Sekunde und 21.600 Sekunden (6 Stunden), standardmäßig 600 Sekunden. Ein tägliches Kontingent für Cache-Aufrufe ist nicht veröffentlicht.

Noch eine dokumentierte Falle, weil die Behelfslösung weit verbreitet ist: NOW() als Argument hinzuzufügen, um eine Aktualisierung zu erzwingen, macht die Funktion kaputt. Google: „Argumente benutzerdefinierter Funktionen müssen deterministisch sein … Wenn eine benutzerdefinierte Funktion versucht, einen Wert auf Basis einer dieser volatilen eingebauten Funktionen zurückzugeben, zeigt sie unbegrenzt Loading... an."


Methode 3: Eine geplante Kurstabelle (das Produktionsmuster)

Benutzerdefinierte Funktionen berechnen sich neu, wenn Sheets gerade Lust dazu hat — genau die falsche Eigenschaft für eine Tabelle, die jemand anderes liest. Das robuste Muster besteht darin, das Abrufen aus Zellen ganz aufzugeben: Kurse nach Zeitplan in eine Tabelle schreiben und sie dann mit einfachen Formeln nachschlagen.

Das Aktualisierungsskript

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);
}

Zwei Details unterscheiden dies von den Skripten, die Sie anderswo finden. Erstens: ein einziger setValues()-Aufruf, nicht einer pro Zelle — gebündelte Bereichsschreibvorgänge sind dramatisch schneller. Zweitens: Ein fehlgeschlagener Abruf kehrt früh zurück, statt die Tabelle zu leeren, sodass ein Schluckauf des Anbieters veraltete, aber gekennzeichnete Kurse hinterlässt statt einer Tabelle voller Leerzellen, die stillschweigend jede nachgelagerte Summe auf null setzen.

Den Trigger anlegen

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

Google dokumentiert, dass zeitgesteuerte Trigger „so häufig wie jede Minute oder so selten wie einmal pro Monat" laufen und dass der Auslösezeitpunkt bewusst gestreut wird: „Wenn Sie einen wiederkehrenden 9-Uhr-Trigger erstellen, wählt Apps Script eine Zeit zwischen 9 und 10 Uhr." Wenn Sie everyMinutes(n) verwenden, muss n 1, 5, 10, 15 oder 30 sein — kein anderer Wert wird akzeptiert.

Die Kurse auslesen

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

Jede Umrechnung in der Arbeitsmappe wird jetzt sofort aus lokalen Zellen aufgelöst, nutzt einen einheitlichen Kurs und trägt einen sichtbaren Zeitstempel. Genau nach diesem letzten Punkt fragen Prüfer.


Kontingente und Grenzen, an die Sie wirklich stoßen werden

Das sind Googles veröffentlichte Apps-Script-Zahlen — es lohnt sich, sie zu kennen, bevor Sie darum herum entwerfen:

GrenzePrivatkonto (gmail.com)Google-Workspace-Konto
URL-Fetch-Aufrufe20.000 / Tag100.000 / Tag
Gesamtlaufzeit der Trigger90 Min. / Tag6 Std. / Tag
Lese-/Schreibvorgänge auf Eigenschaften50.000 / Tag500.000 / Tag
Laufzeit benutzerdefinierter Funktionen30 Sek. / Ausführung30 Sek. / Ausführung
Skriptlaufzeit6 Min. / Ausführung6 Min. / Ausführung
Trigger pro Nutzer und Skript2020
URL-Länge bei URL Fetch2 KB / Aufruf2 KB / Aufruf
Diese 2-KB-URL-Grenze ist die praktische Obergrenze dafür, wie viele Paare Sie in einen einzelnen ?q=-Batch quetschen können — locker über hundert, aber nicht unbegrenzt.

Auf der API-Seite erlaubt der Finexly-Gratistarif 1.000 Anfragen pro Monat bei 10 Anfragen pro Minute. Ein stündlicher Trigger verbraucht rund 730 Anfragen im Monat — innerhalb des Gratistarifs, mit Luft nach oben. Kommen ein paar Ad-hoc-Aufrufe benutzerdefinierter Funktionen dazu, wollen Sie vielleicht den Starter-Tarif; die aktuellen Stufen finden Sie auf der Preisseite. Beachten Sie, dass historische Kurse einen kostenpflichtigen Tarif voraussetzen. Wenn Sie also rückdatierte Kurse und null Budget brauchen, bleibt GOOGLEFINANCE die ehrliche Antwort für private, nicht-professionelle Nutzung.

Jede Antwort trägt die Header X-RateLimit-Limit, X-RateLimit-Used und X-RateLimit-Units, sodass Sie die Nutzung aus res.getAllHeaders() protokollieren und ein nahendes Limit erkennen können.


Häufige Fehler und wie Sie sie beheben

Was Sie sehenUrsacheLösung
#N/A von GOOGLEFINANCENicht unterstütztes oder falsch geschriebenes Paar, oder historische Daten über Apps Script / die Sheets API angefragtBeide ISO-Codes prüfen; für Automatisierung stattdessen eine API verwenden
#ERROR! mit „Exceeded maximum execution time (line 0)."Zu viele einzelne Aufrufe benutzerdefinierter FunktionenAuf das gebündelte Muster FX_CONVERT_RANGE umsteigen
Endlos Loading...NOW(), RAND() oder eine andere volatile Funktion als Argument einer benutzerdefinierten Funktion übergebenEntfernen — Google dokumentiert dies als nicht unterstützt
401 UNAUTHORIZED / invalid tokenFehlender oder falscher API-SchlüsselPrüfen, ob die Skripteigenschaft gesetzt ist und der Header Bearer <key> lautet
429 RATE_LIMIT_EXCEEDEDMinuten- oder Monatsgrenze erreichtCache-TTL verlängern, mehr Paare pro Aufruf bündeln oder upgraden
You do not have permission to call X service.Eine benutzerdefinierte Funktion hat einen Dienst aufgerufen, der eine Autorisierung benötigtDiese Logik in eine per Trigger ausgeführte Funktion verlagern
Historische Formel sprengt zusätzliche SpaltenDokumentiertes Verhalten — historische Ergebnisse kommen als Array mit Überschriften zurückIn INDEX(..., 2, 2) einpacken
Tiefergehende Muster zu Wiederholungsversuchen, Backoff und Cache-Invalidierung im Produktivbetrieb finden Sie in unserem Leitfaden zu Caching und Fehlerbehandlung bei Currency APIs.


Welche Methode sollten Sie verwenden?

  • Private Tabelle, schnelle Abfrage, kein Geld im Spiel: GOOGLEFINANCE. Kostenlos, sofort verfügbar, und die Lizenzbeschränkung greift nicht.
  • Eine Umrechnungsspalte in einer Arbeitstabelle: die gebündelte benutzerdefinierte Apps-Script-Funktion. Vorhersehbare Datenquelle, keine Lizenz-Grauzone, ein Aufruf pro Bereich.
  • Alles, was eine Kollegin, ein Kunde oder ein Prüfer liest: die geplante Kurstabelle. Ein Kurs pro Aktualisierungszyklus, ein sichtbarer Zeitstempel und keine Abhängigkeit davon, wann Sheets sich zur Neuberechnung entschließt.

Sie arbeiten stattdessen in Excel? Die entsprechenden Methoden — Power Query, WEBSERVICE und der Datentyp „Währungen" — behandeln wir in Live-Wechselkurse in Excel abrufen. Wenn Sie noch Anbieter vergleichen, legt unser Currency-API-Vergleich die Unterschiede dar, und jeden Kurs können Sie mit dem Finexly-Währungsrechner gegenprüfen.


Häufig gestellte Fragen

Wie bekomme ich kostenlos Live-Wechselkurse in Google Sheets?

=GOOGLEFINANCE("CURRENCY:USDEUR") kostet nichts und braucht keine Einrichtung. Beachten Sie Googles ausdrückliche Nutzungsbeschränkung — die Daten sind „nicht für die professionelle Nutzung in der Finanzbranche oder die Nutzung durch andere Fachleute in nicht-finanziellen Unternehmen" bestimmt — und dass historische Werte nicht über Apps Script oder die Sheets API gelesen werden können. Als lizenzierte Alternative zum Nulltarif deckt ein kostenloser API-Tarif mit 1.000 Anfragen pro Monat eine stündliche Aktualisierung (rund 730 Aufrufe) bequem ab.

Wie oft aktualisiert GOOGLEFINANCE Währungskurse?

Die Tabelle im Google-Finance-Haftungsausschluss nennt für Währungsdaten eine Verzögerung von 3 Minuten, Quelle ist Morningstar — nicht die online häufig wiederholten 20 Minuten, die dem allgemeinen Wertpapierkurs-Wert am Attribut "price" entstammen. Davon unabhängig hat Google nie veröffentlicht, wie oft Sheets die Formel neu berechnet, das Alter der Zahl in Ihrer Zelle ist also nichts, worauf Sie sich verlassen können.

Kann ich GOOGLEFINANCE innerhalb von Apps Script verwenden?

Für historische Daten nicht. Google schreibt: „Historische Daten können nicht über die Sheets API oder Apps Script heruntergeladen oder abgerufen werden. Wenn Sie es versuchen, sehen Sie einen #N/A-Fehler." Außerdem gibt es in keinem Apps-Script-Dienst eine GOOGLEFINANCE-Methode — ein Skript kann nur einen Wert lesen, den eine Zelle bereits berechnet hat. Wenn Sie Kurse im Code brauchen, rufen Sie eine Currency API mit UrlFetchApp auf.

Warum ist meine Währungsformel in Google Sheets langsam oder zeigt #ERROR!?

Jeder Aufruf einer benutzerdefinierten Funktion ist ein eigener Roundtrip zum Apps-Script-Server, und jede Ausführung ist auf 30 Sekunden begrenzt. Hunderte einzelner Aufrufe laufen in einen Timeout. Nehmen Sie einen Bereich entgegen und geben Sie ein Array zurück, damit ein Aufruf die ganze Spalte abdeckt, cachen Sie den Kurs, und verlagern Sie für alles Geplante den Abruf in einen zeitgesteuerten Trigger statt in eine Zelle.

Kann ich historische Wechselkurse in Google Sheets bekommen?

Ja, auf zwei Wegen. GOOGLEFINANCE("CURRENCY:USDEUR", "close", DATE(2026,1,1), DATE(2026,1,31), "DAILY") liefert eine Tagesreihe — verwenden Sie "close", da "price" kein gültiges historisches Attribut ist, und denken Sie daran, dass Google die Datumsangaben als 12:00 Uhr UTC behandelt, was einen Wert um einen Tag verschieben kann. Oder Sie holen historische Kurse in einem kostenpflichtigen Tarif über eine API und schreiben sie per Trigger in eine Tabelle — der einzige Weg, der eine Automatisierung übersteht.


Bereit, lizenzierte, minutenaktuelle Wechselkurse in Ihre Tabelle zu bringen? Holen Sie sich Ihren kostenlosen Finexly-API-Schlüssel — keine Kreditkarte erforderlich. Starten Sie mit 1.000 Anfragen pro Monat über 170+ Währungen und upgraden Sie, wenn Ihre Tabellen darüber hinauswachsen.

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 →

Diesen Artikel teilen