/* ============================================================================= * spreadsheet_functions.ts (주인 B) * 함수 표 — 이름(대문자) → 뜻. 몸은 `spreadsheet_functions_math.ts` · `_misc.ts` · `_lookup.ts` 에 * 두고 여기서 모음. 1단계 약 45 + 2단계 첫 묶음(2026-09-27) — 아래 `FUNC_HELP_BATCH2`(sub1 의 * `spreadsheet_func_help.ts` 가 읽어 이름 목록에 더할 것 — 그 파일은 sub1 몫이라 안 고침). * 없는 이름 = `#NAME?` · 인자 수가 min · max 밖이면 A 의 eval 이 `#VALUE!` + 까닭(엑셀은 입력을 막음). * ========================================================================== */ import type { SheetFunction } from "./spreadsheet_types"; import { MATH_FUNCTIONS } from "./spreadsheet_functions_math"; import { MISC_FUNCTIONS } from "./spreadsheet_functions_misc"; import { LOOKUP_FUNCTIONS } from "./spreadsheet_functions_lookup"; const TABLE: Record = { ...MATH_FUNCTIONS, ...MISC_FUNCTIONS, ...LOOKUP_FUNCTIONS, }; export function getFunction(name: string): SheetFunction | undefined { return TABLE[name.toUpperCase()]; } /** 아는 함수 이름 전부(가나다 · 자동 완성은 2단계) */ export function functionNames(): string[] { return Object.keys(TABLE).sort(); } /** 2단계 첫 묶음(2026-09-27) — sub1 `spreadsheet_func_help.ts` 의 `TABLE` 에 이 모양대로 더할 것. * `이름` · `꼴`(인자 모양 · 대괄호 = 생략 가능) · `뜻`(한 줄). */ export interface FuncHelpEntry { 이름: string; 꼴: string; 뜻: string; } export const FUNC_HELP_BATCH2: FuncHelpEntry[] = [ { 이름: "MROUND", 꼴: "MROUND(수, 배수)", 뜻: "배수의 가장 가까운 정수 배로 반올림" }, { 이름: "ODD", 꼴: "ODD(수)", 뜻: "홀수로 올림(0 에서 먼 쪽)" }, { 이름: "EVEN", 꼴: "EVEN(수)", 뜻: "짝수로 올림(0 에서 먼 쪽)" }, { 이름: "LOG", 꼴: "LOG(수, [밑=10])", 뜻: "로그(밑 지정)" }, { 이름: "LOG10", 꼴: "LOG10(수)", 뜻: "상용로그" }, { 이름: "LN", 꼴: "LN(수)", 뜻: "자연로그" }, { 이름: "EXP", 꼴: "EXP(수)", 뜻: "e 의 거듭제곱" }, { 이름: "SUMIFS", 꼴: "SUMIFS(합할범위, 조건범위1, 조건1, [조건범위2, 조건2], …)", 뜻: "여러 조건에 다 맞는 칸의 합", }, { 이름: "COUNTIFS", 꼴: "COUNTIFS(조건범위1, 조건1, [조건범위2, 조건2], …)", 뜻: "여러 조건에 다 맞는 칸 개수", }, { 이름: "AVERAGEIF", 꼴: "AVERAGEIF(범위, 조건, [평균범위])", 뜻: "조건에 맞는 칸(또는 짝 칸)의 평균", }, { 이름: "AVERAGEIFS", 꼴: "AVERAGEIFS(평균범위, 조건범위1, 조건1, …)", 뜻: "여러 조건에 다 맞는 칸의 평균", }, { 이름: "MAXIFS", 꼴: "MAXIFS(최대범위, 조건범위1, 조건1, …)", 뜻: "여러 조건에 다 맞는 칸의 최댓값", }, { 이름: "MINIFS", 꼴: "MINIFS(최소범위, 조건범위1, 조건1, …)", 뜻: "여러 조건에 다 맞는 칸의 최솟값", }, { 이름: "IFS", 꼴: "IFS(조건1, 값1, [조건2, 값2], …)", 뜻: "처음으로 참인 조건의 값", }, { 이름: "SWITCH", 꼴: "SWITCH(식, 값1, 결과1, [값2, 결과2], …, [기본값])", 뜻: "식과 같은 값을 찾아 그 결과", }, { 이름: "XLOOKUP", 꼴: "XLOOKUP(찾을값, 찾을범위, 돌려줄범위, [못찾으면], [맞춤꼴], [찾는방향])", 뜻: "찾을범위에서 찾아 돌려줄범위의 같은 자리 값", }, { 이름: "TEXTJOIN", 꼴: "TEXTJOIN(구분자, 빈칸건너뜀, 글1, [글2], …)", 뜻: "구분자로 여러 글을 이어 붙임", }, { 이름: "TRIM", 꼴: "TRIM(글)", 뜻: "앞뒤 · 겹친 빈칸을 뺌" }, { 이름: "UPPER", 꼴: "UPPER(글)", 뜻: "대문자로" }, { 이름: "LOWER", 꼴: "LOWER(글)", 뜻: "소문자로" }, { 이름: "SUBSTITUTE", 꼴: "SUBSTITUTE(글, 옛글, 새글, [몇번째])", 뜻: "글 안 옛글을 새글로 바꿈", }, { 이름: "REPLACE", 꼴: "REPLACE(글, 시작, 글자수, 새글)", 뜻: "자리로 콕 집어 바꿈" }, { 이름: "FIND", 꼴: "FIND(찾을글, 안글, [시작])", 뜻: "글자 그대로 찾음(대소문자 가림)" }, { 이름: "SEARCH", 꼴: "SEARCH(찾을글, 안글, [시작])", 뜻: "찾음(대소문자 안 가림 · * ? 자리표시)", }, { 이름: "REPT", 꼴: "REPT(글, 번)", 뜻: "글을 번 만큼 되풀이" }, { 이름: "ISNUMBER", 꼴: "ISNUMBER(값)", 뜻: "수면 참" }, { 이름: "ISTEXT", 꼴: "ISTEXT(값)", 뜻: "글이면 참" }, { 이름: "ISBLANK", 꼴: "ISBLANK(값)", 뜻: "빈 칸이면 참" }, { 이름: "ISERROR", 꼴: "ISERROR(값)", 뜻: "오류 값이면 참" }, { 이름: "NA", 꼴: "NA()", 뜻: "#N/A 오류를 만듦" }, { 이름: "TODAY", 꼴: "TODAY()", 뜻: "오늘 날짜(일련번호)" }, { 이름: "DATE", 꼴: "DATE(년, 월, 일)", 뜻: "날짜 일련번호를 만듦" }, { 이름: "YEAR", 꼴: "YEAR(일련번호)", 뜻: "연도" }, { 이름: "MONTH", 꼴: "MONTH(일련번호)", 뜻: "월" }, { 이름: "DAY", 꼴: "DAY(일련번호)", 뜻: "일" }, ];