블로그로 돌아가기

Google Sheets에서 실시간 환율을 가져오는 방법 (GOOGLEFINANCE, Apps Script, 그리고 환율 API)

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

Google Sheets에서 실시간 환율을 가져오는 방법 (GOOGLEFINANCE, Apps Script, 그리고 환율 API)

Google Sheets에서 실시간 환율을 가져오는 일은 이미 해결된 문제처럼 보입니다. =GOOGLEFINANCE("CURRENCY:USDEUR")를 입력하면 숫자가 나타나고, 그걸로 끝입니다. 개인 여행 경비를 정리하는 정도라면 아무 문제 없습니다. 하지만 그 스프레드시트가 청구서, 급여 정산, 매출 보고서처럼 동료가 실제로 판단의 근거로 삼는 무언가에 연결되는 순간부터는 이야기가 달라집니다. 라이선스 제한, 문서에 명시된 날짜 처리 방식의 함정, 그리고 거의 어떤 튜토리얼도 언급하지 않는 Apps Script의 제약 때문입니다.

이 가이드는 실무에서 쓰이는 세 가지 방법을 모두 다룹니다. 내장 함수 GOOGLEFINANCE, 환율 API를 사용하는 Apps Script 맞춤 함수, 그리고 시간 기반 트리거로 갱신되는 예약형 환율 테이블입니다. 실제 할당량 수치, Google 자체 주의사항의 정확한 표현, 그리고 바로 실행할 수 있는 코드를 함께 제공합니다. 아래에서 Google의 동작에 대한 모든 주장은 Google 공식 문서에서 인용한 것이며, 문서화되어 있지 않은 내용은 그렇다고 명시했습니다.


Google Sheets로 환율을 가져오는 세 가지 방법

GOOGLEFINANCEApps Script 맞춤 함수예약형 환율 테이블
설정 시간몇 초약 10분약 20분
API 키 필요 여부아니요
갱신재계산 시 자동재계산 시직접 제어하는 트리거로
과거 환율예 (단서 조항 있음)요금제에 따라 다름
Apps Script / Sheets API에서 동작과거 데이터: 불가
상업적 / 전문적 사용Google 약관에 의해 제한됨API 제공업체 약관을 따름API 제공업체 약관을 따름
적합한 용도간단한 조회, 개인용 시트임시 환산 열다른 사람이 의존하는 모든 것
대부분은 방법 1로 시작하되, 그 시트가 업무의 기반이 되는 순간 방법 3으로 옮겨가야 합니다.


방법 1: GOOGLEFINANCE — 그리고 Google이 실제로 말하는 것

기본 환율 수식

모든 튜토리얼이 가르치는 방식은 ISO 4217 통화 코드 두 개를 이어 붙인 CURRENCY: 티커입니다.

=GOOGLEFINANCE("CURRENCY:USDEUR")

A2 셀의 금액을 환산하려면 이렇게 합니다.

=A2 * GOOGLEFINANCE("CURRENCY:USDEUR")

통화 코드가 담긴 두 셀로 통화쌍을 조합하려면 이렇게 합니다.

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

어떤 경쟁 글도 언급하지 않는 솔직한 단서 조항: CURRENCY:XXXYYY 형태의 티커는 Google의 공식 GOOGLEFINANCE 문서 어디에도 등장하지 않습니다. 문서화된 시그니처는 GOOGLEFINANCE(ticker, [attribute], [start_date], [end_date|num_days], [interval])이며, 도움말 페이지에 나오는 통화 관련 내용은 "currency" 속성(증권의 가격이 표시되는 통화)과 차트 예제가 전부입니다. CURRENCY: 통화쌍 문법은 수년간 잘 작동해 왔지만, 이는 커뮤니티가 확립한 동작일 뿐 문서화된 약속이 아닙니다. 즉 Google이 지원 중단 공지 없이 언제든 바꿀 수 있다는 뜻입니다. 또한 Google은 지원되는 통화쌍 목록을 전혀 공개하지 않으므로, "약 50개 통화를 지원한다"고 알려주는 글은 전부 추측입니다.

과거 환율: 모두가 틀리는 속성 규칙

날짜를 전달하면 과거 데이터를 받습니다.

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

속성에 주목하세요. Google은 이렇게 명확히 문서화합니다. "날짜 매개변수가 하나라도 지정되면 해당 요청은 과거 데이터 요청으로 간주되며, 과거 데이터 속성만 허용됩니다." 과거 데이터 속성은 open, close, high, low, volume, all이며, "price"는 여기에 포함되지 않습니다. "price"는 실시간 속성으로만 문서화되어 있습니다("실시간 가격 시세, 최대 20분 지연").

지금 바로 검색 상위에 노출되는 Google Sheets 환율 튜토리얼을 확인해 보세요. 대부분이 GOOGLEFINANCE("CURRENCY:USDEUR", "price", DATE(...))를 알려줍니다. 이 조합은 Google 자체 문서와 모순됩니다. "close"를 쓰세요.

기억해 둘 만한 문서화된 동작이 두 가지 더 있습니다.

  • "start_date는 지정했지만 end_date|num_days를 지정하지 않으면 해당 하루치 데이터만 반환됩니다."
  • "실시간 결과는 단일 셀 안의 값으로 반환됩니다. 과거 데이터는 하루치라도 열 머리글이 포함된 확장 배열로 반환됩니다." 겉보기에 멀쩡한 과거 데이터 수식이 깔끔하던 레이아웃에 두 개의 열과 머리글 행을 쏟아내는 이유가 바로 이것이고, 보통 INDEX(...,2,2)로 감싸야 하는 이유이기도 합니다.

정오 UTC 기준 시프트

이 문제는 날짜를 기준으로 대조하는 보고서를 조용히 망가뜨립니다. Google의 표현 그대로입니다.

"Google은 GOOGLEFINANCE에 전달된 날짜를 UTC 기준 정오로 처리합니다. 그 시각 이전에 마감하는 거래소는 하루씩 밀릴 수 있습니다."

모든 행이 해당 계상일의 환율을 사용해야 하는 장부를 대조하고 있다면, 하루의 시프트는 반올림 문제가 아니라 실제 대사 불일치입니다. 여러분의 시트가 여기에 해당한다면, 쏟아져 나온 GOOGLEFINANCE 배열을 감사 기록으로 신뢰하기 전에 환율과 세무 보고 가이드를 먼저 읽어 보세요.

지연은 20분이 아니라 3분입니다

이 주제를 다루는 거의 모든 글이 GOOGLEFINANCE 환율은 "최대 20분 지연된다"고 말합니다. 그 20분이라는 숫자는 "price" 속성에 붙은 일반 증권 시세 고지 문구에서 나온 것입니다. Google Finance의 고지 페이지에는 자산별 지연 표가 공개되어 있는데, Currency 행은 — 글로벌, Morningstar 제공 — 3분입니다. 암호화폐도 3분입니다.

즉 데이터는 인터넷이 믿는 것보다 신선합니다. 정작 Google이 공개하지 않는 것은 Sheets가 수식을 얼마나 자주 재계산하는지인데, 실제로 중요한 숫자는 바로 그것입니다. 화요일 이후로 재계산된 적 없는 셀에 들어 있는 3분 전 환율은 여전히 화요일 환율입니다. 구체적인 재계산 주기를 이야기하는 사람은 Google이 한 번도 문서화한 적 없는 것을 인용하고 있는 셈입니다.

비교하자면 Finexly는 환율을 1분마다 갱신하고 요청 시점에 반환하므로, 신선도는 스프레드시트가 재계산하기로 마음먹는 시점이 아니라 여러분이 호출하는 시점의 함수입니다. 제공업체 전반에서 "실시간"이 무엇을 뜻하는지 이해하고 싶다면 환율 API는 데이터를 어디서 가져오는가를 참고하세요.

아무도 인용하지 않는 사용 제한

이 문단이 이 글에서 가장 중요하며, 검색 상위 튜토리얼 어디에도 나오지 않습니다. Google의 GOOGLEFINANCE 도움말 페이지에서 그대로 인용합니다.

"사용 제한: 이 데이터는 금융업계 전문가의 업무용 또는 비금융 기업(정부 기관 포함)의 전문가 업무용으로 제공되는 것이 아닙니다. 전문적 사용에는 서드파티 데이터 제공업체의 추가 라이선스 비용이 발생할 수 있습니다."

그리고 Google Finance 고지 문구에서 인용합니다.

"귀하는 사전 서면 동의를 얻지 않고서는 여기에 게시된 데이터나 정보를 복사, 수정, 형식 변경, 다운로드, 저장, 복제, 재가공, 전송 또는 재배포하지 않으며, 그러한 데이터나 정보를 상업적 사업에 사용하지 않을 것에 동의합니다."
"Google은 표시된 환율의 정확성을 보장할 수 없습니다. 환율 변동의 영향을 받을 수 있는 거래를 하기 전에 현재 환율을 직접 확인하시기 바랍니다."

이 문구를 여러분의 시트가 실제로 하는 일과 나란히 놓고 보세요. 고객 청구서 금액을 산정하거나, 회계팀을 위해 공급업체 청구서를 환산하거나, 환산된 매출 수치를 고객에게 보내는 보고서로 내보내는 일은 아무리 봐도 "정보 제공 목적"이라고 하기 어렵습니다. 라이선스를 갖춘 환율 API는 이 질문 자체를 없애 주며, 재무 팀이 GOOGLEFINANCE에서 떠나는 진짜 이유는 정확도가 아니라 바로 이것입니다.

그리고 결정적인 걸림돌

"과거 데이터는 Sheets API나 Apps Script를 통해 다운로드하거나 액세스할 수 없습니다. 시도하면 스프레드시트의 해당 셀에 값 대신 #N/A 오류가 표시됩니다."

야간 내보내기, Sheets API 조회, 환율 스냅샷을 남기는 스크립트 등 무언가를 자동화하려는 순간, 과거 GOOGLEFINANCE 데이터는 설계상 선택지에서 제외됩니다. 사람들을 방법 2로 밀어내는 벽이 바로 이것입니다.


방법 2: 환율 API를 사용하는 Apps Script 맞춤 함수

맞춤 함수는 Apps Script에 작성한 JavaScript 함수로, 내장 함수처럼 셀에서 호출할 수 있습니다. Google은 이것이 웹 요청과 함께 동작한다고 명시적으로 확인합니다. 맞춤 함수는 "개인 데이터에 접근하지 않는 서비스만 호출할 수 있다"고 하며, URL Fetch는 허용 목록에 포함되어 있습니다.

1단계: API 키를 발급받고 제대로 보관하기

Finexly 대시보드에서 무료 키를 받으세요. 월 1,000회 요청, 신용카드 불필요입니다. 그리고 중요한 점: 키를 코드에 직접 넣지 마세요. 가장 많이 링크되는 Google Sheets 환율 튜토리얼 두 편은 API 키를 스크립트에 그대로 붙여 넣는데, 그 파일은 스프레드시트를 공유하는 모든 사람에게 함께 따라갑니다.

Apps Script 편집기(확장 프로그램 → Apps Script)에서 아래 코드를 편집기에서 한 번만 실행해 키를 스크립트 속성에 저장하세요.

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

그런 다음 파일에서 리터럴 값을 삭제하세요. 문서화된 제한도 알아두세요. 속성 값 하나는 9KB, 속성 저장소 전체는 500KB로 제한됩니다. 키를 넣기에는 넉넉하지만 데이터를 캐싱할 곳은 아닙니다.

2단계: 단일 통화쌍용 맞춤 함수

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

셀에서는 이렇게 사용합니다.

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

/v1/rate 엔드포인트는 {"pair": "USD_EUR", "rate": 0.9215}를 반환합니다. 전체 매개변수 레퍼런스는 Finexly API 문서에 있습니다.

3단계: 범위를 일괄 처리하기 — 모든 경쟁 글이 놓치는 부분

여기서 문제가 터집니다. Google이 직접 문서화한 내용입니다.

"스프레드시트에서 맞춤 함수가 사용될 때마다 Sheets는 Apps Script 서버로 별도의 호출을 보냅니다. 스프레드시트에 맞춤 함수 호출이 수십 개(또는 수백, 수천 개!) 있다면 이 과정은 느려질 수 있습니다."

FX_RATE를 400행까지 끌어내리면 왕복 호출을 400번 한 셈이 됩니다. 맞춤 함수의 실행당 30초 제한 때문에, API 할당량에 도달하기 한참 전에 Exceeded maximum execution time (line 0).이라는 메모와 함께 #ERROR!를 보게 됩니다.

Google이 권장하는 해결책은 배열 일괄 처리입니다. 범위를 인자로 받고 배열을 반환하는 것이죠. Finexly의 /v1/convert 엔드포인트는 쉼표로 구분된 통화쌍을 받으므로, 열 전체가 단 한 번의 HTTP 요청이 됩니다.

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

수식 하나, 네트워크 호출 한 번, 왕복 399번 절약입니다. 여러 통화쌍이 동시에 필요하면 /v1/convert?q=USD_EUR,USD_GBP,USD_JPY를 호출하고 body["USD_EUR"].rate를 읽으세요.

맞춤 함수의 캐싱에 대해 Google이 실제로 하는 말

위에서 CacheService를 썼지만, 그 이유를 정확히 이해해야 합니다. Google의 맞춤 함수 가이드는 Cache 서비스를 "작동하지만 맞춤 함수에서는 특별히 유용하지 않음"으로 평가합니다. 캐싱의 이점은 서로 다른 실행 사이에서만, 즉 같은 통화쌍을 반복해서 재계산할 때만 실제로 발생하며, 하나의 확장 배열 안에서는 그렇지 않습니다. 문서화된 최적화 방법은 배열 일괄 처리이고, 캐싱은 유용한 보조 수단입니다.

문서화된 캐시 제한은 다음과 같습니다. 키는 최대 250자, 값은 최대 100KB, 항목 수는 1,000개, 만료 시간은 1초에서 21,600초(6시간) 사이이며 기본값은 600초입니다. 캐시 호출에 대한 일일 할당량은 공개되어 있지 않습니다.

널리 퍼진 우회법이라 하나 더 짚고 갑니다. 갱신을 강제하려고 NOW()를 인자로 추가하면 함수가 망가집니다. Google의 설명입니다. "맞춤 함수의 인자는 결정론적이어야 합니다… 맞춤 함수가 이런 휘발성 내장 함수를 기반으로 값을 반환하려고 하면 Loading...이 무한정 표시됩니다."


방법 3: 예약형 환율 테이블 (프로덕션 패턴)

맞춤 함수는 Sheets가 내킬 때 재계산되는데, 이는 다른 사람이 읽는 시트에는 정확히 반대되는 성질입니다. 견고한 패턴은 셀에서 데이터를 가져오는 일을 아예 그만두는 것입니다. 환율을 일정에 맞춰 테이블에 기록하고, 평범한 수식으로 조회하세요.

갱신 스크립트

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

다른 곳에서 볼 수 있는 스크립트와 이 스크립트를 가르는 두 가지 디테일이 있습니다. 첫째, 셀마다 호출하는 대신 setValues()를 한 번만 호출합니다. 범위 단위로 묶어서 쓰는 편이 극적으로 빠릅니다. 둘째, 요청이 실패하면 테이블을 지우는 대신 그대로 함수를 종료합니다. 그래서 제공업체에 일시적 장애가 생겨도 시트에는 오래됐지만 시각이 명시된 환율이 남고, 아래쪽 합계를 전부 조용히 0으로 만들어 버리는 빈 칸 투성이 시트가 되지 않습니다.

트리거 만들기

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

Google은 시간 기반 트리거가 "짧게는 1분마다, 길게는 한 달에 한 번까지" 실행된다고 문서화하며, 실행 시각이 의도적으로 흐트러진다고 밝힙니다. "오전 9시에 반복 트리거를 만들면 Apps Script는 오전 9시에서 10시 사이의 시각을 선택합니다." everyMinutes(n)을 사용한다면 n반드시 1, 5, 10, 15 또는 30이어야 하며, 다른 값은 허용되지 않습니다.

환율 읽어오기

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

이제 통합 문서의 모든 환산이 로컬 셀에서 즉시 계산되고, 하나의 일관된 환율을 사용하며, 눈에 보이는 타임스탬프를 갖습니다. 감사인이 묻는 것이 바로 마지막 항목입니다.


실제로 부딪히게 될 할당량과 제한

다음은 Google이 공개한 Apps Script 수치입니다. 이를 전제로 설계하기 전에 알아둘 가치가 있습니다.

제한 항목개인 계정 (gmail.com)Google Workspace 계정
URL Fetch 호출20,000회 / 일100,000회 / 일
트리거 총 실행 시간90분 / 일6시간 / 일
속성 읽기/쓰기50,000회 / 일500,000회 / 일
맞춤 함수 실행 시간30초 / 실행30초 / 실행
스크립트 실행 시간6분 / 실행6분 / 실행
사용자당 스크립트당 트리거 수20개20개
URL Fetch URL 길이2KB / 호출2KB / 호출
이 2KB URL 상한이 하나의 ?q= 배치에 통화쌍을 몇 개까지 밀어 넣을 수 있는지를 결정하는 현실적인 천장입니다. 100개는 여유롭게 넘지만 무제한은 아닙니다.

API 쪽에서는 Finexly 무료 요금제가 분당 10회 요청 기준으로 월 1,000회 요청을 제공합니다. 매시간 실행되는 트리거는 월 약 730회를 사용하므로 무료 요금제 안에 여유 있게 들어갑니다. 여기에 임시 맞춤 함수 호출이 몇 개 더 붙는다면 Starter 요금제를 고려할 만합니다. 현재 요금 단계는 요금제 페이지에 있습니다. 과거 환율은 유료 요금제가 필요하므로, 소급 환율이 필요하면서 동시에 예산이 전혀 없다면 개인적·비전문적 용도에 한해서는 GOOGLEFINANCE가 여전히 정직한 답입니다.

모든 응답에는 X-RateLimit-Limit, X-RateLimit-Used, X-RateLimit-Units 헤더가 담기므로, res.getAllHeaders()에서 사용량을 로깅해 한도가 다가오는 것을 미리 파악할 수 있습니다.


자주 발생하는 오류와 해결 방법

나타나는 증상원인해결 방법
GOOGLEFINANCE에서 #N/A지원되지 않거나 잘못 입력한 통화쌍, 또는 Apps Script / Sheets API를 통한 과거 데이터 요청ISO 코드 두 개를 모두 확인하고, 자동화에는 API를 사용
"Exceeded maximum execution time (line 0)."와 함께 #ERROR!개별 맞춤 함수 호출이 너무 많음일괄 처리 방식인 FX_CONVERT_RANGE 패턴으로 전환
Loading...이 끝나지 않음NOW(), RAND() 등 휘발성 함수를 맞춤 함수 인자로 전달함제거하세요. Google이 미지원으로 문서화한 사항입니다
401 UNAUTHORIZED / invalid tokenAPI 키가 없거나 잘못됨스크립트 속성이 설정되어 있고 헤더가 Bearer <key>인지 확인
429 RATE_LIMIT_EXCEEDED분당 또는 월간 한도 초과캐시 TTL을 늘리거나, 호출당 통화쌍을 더 묶거나, 요금제를 업그레이드
You do not have permission to call X service.맞춤 함수가 인증이 필요한 서비스를 호출함해당 로직을 트리거로 실행되는 함수로 옮기기
과거 데이터 수식이 열을 더 쏟아냄문서화된 동작 — 과거 데이터 결과는 머리글이 포함된 배열로 반환됨INDEX(..., 2, 2)로 감싸기
프로덕션에서의 재시도, 백오프, 캐시 무효화에 대한 더 깊은 패턴은 환율 API 캐싱 및 오류 처리 가이드를 참고하세요.


어떤 방법을 선택해야 할까요?

  • 개인 시트, 간단한 조회, 돈이 걸려 있지 않은 경우: GOOGLEFINANCE. 무료이고 즉각적이며 라이선스 제한도 문제가 되지 않습니다.
  • 업무용 스프레드시트의 환산 열: 일괄 처리 방식의 Apps Script 맞춤 함수. 예측 가능한 데이터 소스, 라이선스 모호성 없음, 범위당 호출 한 번.
  • 동료, 고객, 감사인이 읽는 모든 것: 예약형 환율 테이블. 갱신 주기마다 하나의 환율, 눈에 보이는 타임스탬프, 그리고 Sheets가 언제 재계산할지에 대한 의존 없음.

Excel로 작업하고 계신가요? Power Query, WEBSERVICE, 통화 데이터 형식이라는 동등한 방법들은 Excel에서 실시간 환율을 가져오는 방법에서 다룹니다. 아직 제공업체를 비교하는 중이라면 환율 API 비교에서 차이점을 정리해 두었고, 어떤 환율이든 Finexly 환율 계산기로 교차 확인할 수 있습니다.


자주 묻는 질문

Google Sheets에서 실시간 환율을 무료로 가져오려면 어떻게 하나요?

=GOOGLEFINANCE("CURRENCY:USDEUR")는 비용이 들지 않고 별도 설정도 필요 없습니다. 다만 Google이 명시한 사용 제한 — 이 데이터는 "금융업계 전문가의 업무용 또는 비금융 기업의 전문가 업무용이 아니다" — 과 과거 값은 Apps Script나 Sheets API로 읽을 수 없다는 점을 유념하세요. 비용 없이 라이선스를 갖춘 대안을 원한다면, 월 1,000회 요청의 무료 API 등급으로 매시간 갱신(약 730회 호출)을 여유 있게 감당할 수 있습니다.

GOOGLEFINANCE는 환율을 얼마나 자주 갱신하나요?

Google Finance 고지 표에는 통화 데이터의 지연이 3분으로 나와 있으며 출처는 Morningstar입니다. 온라인에서 흔히 반복되는 20분은 "price" 속성에 붙은 일반 증권 시세 수치입니다. 별개로, Google은 Sheets가 수식을 얼마나 자주 재계산하는지는 한 번도 공개한 적이 없으므로, 셀 안 숫자의 신선도는 믿고 의지할 수 있는 값이 아닙니다.

Apps Script 안에서 GOOGLEFINANCE를 사용할 수 있나요?

과거 데이터에는 사용할 수 없습니다. Google은 이렇게 밝힙니다. "과거 데이터는 Sheets API나 Apps Script를 통해 다운로드하거나 액세스할 수 없습니다. 시도하면 #N/A 오류가 표시됩니다." 또한 어떤 Apps Script 서비스에도 GOOGLEFINANCE 메서드는 없습니다. 스크립트는 셀이 이미 계산해 둔 값을 읽을 수 있을 뿐입니다. 코드 안에서 환율이 필요하다면 UrlFetchApp으로 환율 API를 호출하세요.

Google Sheets 환율 수식이 느리거나 #ERROR!가 뜨는 이유는 무엇인가요?

맞춤 함수 호출 하나하나가 Apps Script 서버로의 개별 왕복이고, 각 실행은 30초로 제한됩니다. 개별 호출이 수백 개면 시간 초과가 납니다. 범위를 인자로 받아 배열을 반환해 호출 한 번으로 열 전체를 처리하고, 환율을 캐싱하고, 예약 실행이 필요한 작업은 셀 대신 시간 기반 트리거로 옮기세요.

Google Sheets에서 과거 환율을 가져올 수 있나요?

네, 두 가지 방법이 있습니다. GOOGLEFINANCE("CURRENCY:USDEUR", "close", DATE(2026,1,1), DATE(2026,1,31), "DAILY")는 일별 시계열을 반환합니다. "price"는 유효한 과거 데이터 속성이 아니므로 "close"를 사용하고, Google이 날짜를 UTC 정오로 처리해 값이 하루 밀릴 수 있다는 점을 기억하세요. 또는 유료 요금제의 API에서 과거 환율을 가져와 트리거로 시트에 기록하는 방법이 있는데, 자동화 환경에서 살아남는 유일한 경로입니다.


라이선스를 갖춘, 1분 단위로 신선한 환율을 스프레드시트에 넣을 준비가 되셨나요? 무료 Finexly API 키 받기 — 신용카드는 필요 없습니다. 170개 이상의 통화에 대해 월 1,000회 요청으로 시작하고, 시트가 그 이상으로 성장하면 업그레이드하세요.

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 →

이 기사 공유하기