Narwhal API로 공휴일, 발표일, 경제 데이터, 원자재 현물 가격, 환율, 예측 시장 확률을 Google 스프레드시트로 가져올 수 있습니다. Apps Script로 데이터를 각각의 탭에 쓰고, 시간 기반 트리거를 추가하면 일정에 맞춰 새로 고칠 수 있습니다.
설정할 내용
Apps Script는 UrlFetchApp을 통해 스프레드시트를 API에 연결합니다. 데이터 영역마다 탭이 하나씩 생기고, 같은 API 키로 이 탭들을 채우는 pullAll 함수도 갖게 됩니다. 키는 스크립트 속성에 보관되며 스크립트가 요청할 때마다 읽습니다. REST와 MCP는 모든 데이터 API에서 이 키를 공유합니다. 기본 URL은 https://api.narwhalapi.com이고, 모든 데이터 호출은 GET을 사용합니다.
API 키 설정
- 무료 키 만들기 무료 Narwhal API 키를 받으세요. 에디터에서 추가할 스크립트 속성에 쓸 수 있도록 키를 따로 보관하고, 스프레드시트 셀에는 절대 넣지 마세요.
- Apps Script 열기 Google 스프레드시트에서 확장 프로그램 메뉴를 열고 Apps Script를 선택하세요. 여기에서 스크립트를 추가하고 키에 접근하는 설정을 합니다.
- 스크립트 속성에 키 저장하기 프로젝트 설정에서
NARWHAL_API_KEY라는 이름의 스크립트 속성을 추가하고 값에 키를 넣으세요. 스크립트는PropertiesService.getScriptProperties()로 이를 읽어Authorization헤더에Bearer YOUR_KEY형태로 보냅니다.
Apps Script로 데이터 가져오기
- 데이터 탭 만들기
Holidays,Releases,CPI,Brent,FX,Fed라는 이름의 탭을 만드세요. 스크립트가 이 이름으로 각 응답의 쓰기 대상을 찾으므로 표기 그대로 유지해야 합니다. - 스크립트 추가하기 이 코드를 Apps Script에 붙여 넣으세요. 공용
pull헬퍼는 각 호출에서 지정한 응답 필드를 읽어 해당 탭에 행을 씁니다. Brent는 가격이 목록 밖에 있으므로 응답 객체를 그대로 사용합니다.const API = "https://api.narwhalapi.com"; function pull(sheetName, path, listKey) { const key = PropertiesService.getScriptProperties().getProperty("NARWHAL_API_KEY"); const res = UrlFetchApp.fetch(API + path, { headers: { Authorization: "Bearer " + key }, }); const body = JSON.parse(res.getContentText()); const rows = listKey ? body[listKey] : [body]; if (!rows || rows.length === 0) return; // an empty list writes nothing const columns = []; rows.forEach((row) => Object.keys(row).forEach((name) => { // every row, so a null first value cannot hide a column if ( !columns.includes(name) && (row[name] === null || typeof row[name] !== "object") ) columns.push(name); }), ); const values = [columns].concat( rows.map((row) => columns.map((name) => row[name] === undefined || row[name] === null ? "" : row[name], ), ), ); const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName); sheet.clear(); // Text columns (dates, periods like 2026-09) stay plain text so Sheets does not // turn them into dates. // Decimal strings such as "1.0823" stay numbers. columns.forEach((name, index) => { const sample = rows.find( (row) => typeof row[name] === "string" && row[name] !== "", ); if (sample && !/^-?\d+(\.\d+)?$/.test(sample[name])) sheet.getRange(1, index + 1, values.length, 1).setNumberFormat("@"); }); sheet.getRange(1, 1, values.length, columns.length).setValues(values); } function pullAll() { pull("Holidays", "/v1/calendars/holidays/USA/2026", "holidays"); pull( "Releases", "/v1/economics/calendar?countries=USA&start_date=2026-11-01" + "&end_date=2026-11-30&limit=100", "releases", ); pull("CPI", "/v1/economics/USA/cpi/observations?start=2025-09", "observations"); pull("Brent", "/v1/commodities/spot/BRENT/USD", null); pull("FX", "/v1/fx/rates/USD?currencies=EUR,IDR", "rates"); pull("Fed", "/v1/predictions/policy-paths/federal-reserve", "meetings"); } - pullAll 실행하기 에디터에서
pullAll을 실행해 탭을 채우세요. 응답이 비어 있지 않으면 헬퍼는 대상 탭을 지운 뒤 헤더 행과 그 아래 데이터를 씁니다. 따라서 수식은 이 탭들 밖에 두세요. 빈 목록은 아무것도 쓰지 않습니다. 열 이름은 모든 행에서 읽으므로 첫 값이 null이어도 열이 가려지지 않습니다.
날짜나 2026-09 같은 기간을 포함한 텍스트 열은 스프레드시트가 날짜로 바꾸지 못하도록 일반 텍스트로 유지됩니다. 1.0823처럼 문자열로 전달된 소수 값은 숫자로 유지됩니다. 아래 호출은 같은 헬퍼, API 기본 URL, 스크립트 속성을 사용하며, 각각 대상 탭, 요청 경로, 응답 필드를 지정합니다.
일정에 맞춰 실행하기
- 트리거 열기 Apps Script 에디터의 시계 아이콘을 눌러 트리거를 여세요.
- 시간 기반 트리거 추가하기
pullAll에 대한 시간 기반 트리거를 예를 들어 매일 실행되도록 추가하세요. 에디터에서 데이터 탭을 채울 때와 같은 함수를 호출합니다.
사용자 정의 함수도 URL Fetch를 호출할 수 있지만, 시트가 다시 계산될 때마다 다시 실행되어 매번 요청 1회가 소모됩니다. 메뉴 항목이나 시간 기반 트리거에서 실행하는 함수는 값을 한 번만 씁니다.
Google 스프레드시트에서 공휴일 조회하기
2026년 미국 공휴일을 Holidays에 가져옵니다. 응답 목록은 holidays이고 각 항목에 date와 name이 있습니다. 헬퍼는 두 필드를 열로 쓰고 날짜 텍스트는 그대로 유지합니다. 공휴일 행을 전용 탭에 넣고 싶다면 공용 스크립트와 함께 이 호출을 쓰세요.
pull(
"Holidays", "/v1/calendars/holidays/USA/2026", "holidays"
);
// Read date and name in the Holidays tab.Google 스프레드시트에서 발표일 조회하기
2026년 11월 미국 경제 지표 발표 캘린더를 Releases에 가져옵니다. 응답에서 releases를 읽으면 각 항목에 at, period, topic, status가 있습니다. 이 요청은 발표일용이며, 기간에 대응하는 경제 지표 값은 CPI 관측값 호출을 쓰세요.
pull(
"Releases",
"/v1/economics/calendar?countries=USA&start_date=2026-11-01" +
"&end_date=2026-11-30&limit=100",
"releases",
);
// Read at, period, topic and status in the Releases tab.Google 스프레드시트에서 경제 데이터 조회하기
시작을 2025년 9월로 지정해 미국 CPI 관측값을 CPI에 가져옵니다. 응답 목록은 observations이고 탭의 열은 period와 value입니다. 처음 가져온 뒤 헤더 행을 확인하세요. 전월 대비 계산에서는 빠진 달이 있어도 수식이 밀리지 않도록 기간 텍스트로 각 달을 조회하세요.
pull(
"CPI", "/v1/economics/USA/cpi/observations?start=2025-09", "observations"
);
// Read period and value in the CPI tab.2026년 9월을 2026년 8월과 비교하려면 CPI 탭 밖에서 아래 수식을 사용하세요. 각 VLOOKUP은 CPI!A:B에서 지정한 달을 찾고, 계산은 9월 값을 8월 값으로 나눈 뒤 1을 뺍니다.
=VLOOKUP("2026-09",CPI!A:B,2,FALSE)/VLOOKUP("2026-08",CPI!A:B,2,FALSE)-1Google 스프레드시트에서 원자재 현물 가격 조회하기
USD 기준 Brent 현물 가격을 Brent에 가져옵니다. price 필드는 응답 객체에서 읽습니다. 이 호출은 목록 키로 null을 넘기므로, 헬퍼는 객체 전체를 한 행으로 보고 필드를 열 이름 아래에 씁니다.
pull(
"Brent", "/v1/commodities/spot/BRENT/USD", null
);
// Read price in the Brent tab.Google 스프레드시트에서 환율 조회하기
USD를 기준으로 한 EUR과 IDR 환율을 FX에 가져옵니다. rates 목록의 각 항목에는 currency와 rate가 있습니다. 탭을 읽을 때는 각 환율이 통화와 짝을 이루도록 이 열들을 함께 다루세요.
pull(
"FX", "/v1/fx/rates/USD?currencies=EUR,IDR", "rates"
);
// Read currency and rate in the FX tab.Google 스프레드시트에서 예측 시장 확률 조회하기
연방준비제도 정책 경로를 Fed에 가져옵니다. 응답 목록은 meetings이고 각 항목에 resolves_at, p_cut, p_hold, p_hike가 있습니다. 인하, 동결, 인상 확률이 해당 회의와 짝을 이루도록 결과 확정 시각을 확률과 함께 읽으세요.
pull(
"Fed", "/v1/predictions/policy-paths/federal-reserve", "meetings"
);
// Read resolves_at, p_cut, p_hold and p_hike in the Fed tab.IMPORTDATA나 IMPORTXML을 쓰지 않는 이유는 무엇인가요?
IMPORTDATA와 IMPORTXML은 Authorization 헤더를 보낼 수 없습니다. Narwhal API 요청에는 Bearer 헤더가 필요하므로, UrlFetchApp을 쓰는 Apps Script로 요청하세요. 헬퍼는 스크립트 속성에서 키를 읽고, 응답을 가져오기 전에 헤더를 붙입니다.
공휴일 데이터와 함께 NETWORKDAYS를 쓸 수 있나요?
네. Holidays 탭의 date 열을 NETWORKDAYS의 공휴일 인수로 쓰세요. 공휴일 이름이 아니라 그 열의 날짜를 사용해야 합니다. 이 스크립트의 공휴일 요청은 2026년 미국 공휴일 날짜를 제공합니다.
CPI 응답이 요청한 기간보다 늦게 시작할 수 있는 이유는 무엇인가요?
모든 계정이 전체 이력을 조회할 수 있습니다. 시계열이 요청한 시작일보다 늦게 시작하면 응답은 첫 관측값부터 시작합니다.
에 게시되었습니다.