Veri yalnızca e-tabloda kalacaksa GOOGLEFINANCE en kısa yoldur. Bir API çağrısı gerektiğinde Apps Script yedek seçenektir.
GOOGLEFINANCE ile başlayın
Güncel değer için =GOOGLEFINANCE("CURRENCY:USDEUR"), geçmiş seri için başlangıç, bitiş ve DAILY parametrelerini kullanın. Fiyatlarda gecikme olabilir; geçmiş veriye Sheets API veya Apps Script erişemez.
Apps Script ne zaman kullanılır
JSON, özel işlev adı veya önbellek gerekiyorsa Apps Script kullanın. Örnek anahtarsız çağrı yapar ve her pariteyi on dakika önbelleğe alır.
FXRATE işlevini yapıştırın
İşlevi Uzantılar → Apps Script bölümüne yapıştırın. Bağlı proje düzenleyicilere açık olduğundan örnekte anahtar bulunmaz.
=FXRATE() kullanın
Scripti kaydettikten sonra bir hücreye =FXRATE("USD","EUR") yazın. Başka bir parite için iki ISO kodunu değiştirin.
Yenileme ve güvenlik
Özel işlev canlı akış değildir. Paylaşılan bir çalışma kitabı için anahtarı sunucu proxy’sinde tutun.
Sık sorulanlar
=GOOGLEFINANCE("CURRENCY:USDEUR")
=GOOGLEFINANCE("CURRENCY:USDEUR", "price", DATE(2026, 1, 1), DATE(2026, 1, 31), "DAILY")// google-sheets: Apps Script Code.gs
const CACHE_TTL = 600; // Cache successful responses for 10 minutes.
/**
* Returns an indicative exchange rate for one currency pair.
* @param {string} from Three-letter base currency code.
* @param {string} to Three-letter quote currency code.
* @return {number|string} The rate or a readable error marker.
* @customfunction
*/
function FXRATE(from, to) {
from = (from || 'USD').toString().trim().toUpperCase();
to = (to || 'EUR').toString().trim().toUpperCase();
if (!/^[A-Z]{3}$/.test(from) || !/^[A-Z]{3}$/.test(to)) return '#NO_PAIR';
const cacheKey = `fx_${from}_${to}`;
const cache = CacheService.getScriptCache();
const cached = cache.get(cacheKey);
if (cached) return Number(cached);
const url = `https://api.exchangerate.dev/v1/latest/${from}?symbols=${to}`;
let resp;
try {
resp = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
} catch {
return '#FETCH_ERROR';
}
const code = resp.getResponseCode();
if (code === 401 || code === 403) return '#ACCESS_ERROR';
if (code === 429) return '#RATE_LIMIT';
if (code !== 200) return '#ERROR';
let data;
try { data = JSON.parse(resp.getContentText()); }
catch { return '#INVALID_RESPONSE'; }
const rate = data && data.rates && data.rates[to];
if (rate == null) return '#NO_PAIR';
if (typeof rate !== 'number' || !Number.isFinite(rate) || rate <= 0) return '#INVALID_RESPONSE';
cache.put(cacheKey, String(rate), CACHE_TTL);
return Number(rate); // coerce so cells sum and sort
}// Euro per US dollar
=FXRATE("USD", "EUR") // 0.9245
// Japanese yen per US dollar
=FXRATE("USD", "JPY") // 157.32
// British pound per euro
=FXRATE("EUR", "GBP") // 0.8531
// Indonesian rupiah per US dollar
=FXRATE("USD", "IDR") // 16285.0{
"result": "success",
"base": "USD",
"source": "live",
"market_session": "open",
"timestamp": "2026-06-29T09:14:02Z",
"data_updated_at": "2026-06-29T09:14:00Z",
"rates": { "JPY": 157.32 },
"sources": { "JPY": "live" },
"notice": "Indicative rates, not for settlement."
}=FXRATE("USD", "EUR")