MEDIAN·MODE·STDEV(.S/.P)·VAR·RANK(.EQ)·LARGE·SMALL·PERCENTILE·QUARTILE· COUNTBLANK을 새 spreadsheet_functions_stat.ts에 둠. NOW·WEEKDAY·EDATE· EOMONTH·DATEDIF·NETWORKDAYS·HOUR·MINUTE·TIME을 misc.ts에 더함(EDATE는 월말 넘침을 다음 달로 안 넘기고 그 달 말일로 눌러 담음 — 엑셀과 같게). numfmt에 날짜 형식(yyyy-mm-dd·m/d·요일 aaa/aaaa)을 더함. sub1 func_help용 이름 목록은 functions.ts의 FUNC_HELP_BATCH3에 둠(그 파일은 안 고침). 경계값 시험 180건 전부 통과. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RrQ65VtGZbae2VKgYVMhmc
155 lines
7.4 KiB
TypeScript
155 lines
7.4 KiB
TypeScript
/* =============================================================================
|
|
* spreadsheet_functions.ts (주인 B)
|
|
* 함수 표 — 이름(대문자) → 뜻. 몸은 `spreadsheet_functions_math.ts` · `_misc.ts` · `_lookup.ts` ·
|
|
* `_stat.ts` 에 두고 여기서 모음. 1단계 약 45 + 2단계 묶음(2026-09-27) — 아래 `FUNC_HELP_BATCH2` ·
|
|
* `FUNC_HELP_BATCH3`(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";
|
|
import { STAT_FUNCTIONS } from "./spreadsheet_functions_stat";
|
|
|
|
const TABLE: Record<string, SheetFunction> = {
|
|
...MATH_FUNCTIONS,
|
|
...MISC_FUNCTIONS,
|
|
...LOOKUP_FUNCTIONS,
|
|
...STAT_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(일련번호)", 뜻: "일" },
|
|
];
|
|
|
|
/** 2단계 셋째 묶음(2026-09-27) — 위 `FUNC_HELP_BATCH2` 와 같은 모양 · 같이 sub1 표에 더할 것. */
|
|
export const FUNC_HELP_BATCH3: FuncHelpEntry[] = [
|
|
{ 이름: "MEDIAN", 꼴: "MEDIAN(수1, [수2], …)", 뜻: "가운데 값" },
|
|
{ 이름: "MODE", 꼴: "MODE(수1, [수2], …)", 뜻: "가장 자주 나오는 값" },
|
|
{ 이름: "STDEV", 꼴: "STDEV(수1, [수2], …)", 뜻: "표본 표준편차" },
|
|
{ 이름: "STDEV.S", 꼴: "STDEV.S(수1, [수2], …)", 뜻: "표본 표준편차" },
|
|
{ 이름: "STDEV.P", 꼴: "STDEV.P(수1, [수2], …)", 뜻: "모집단 표준편차" },
|
|
{ 이름: "VAR", 꼴: "VAR(수1, [수2], …)", 뜻: "표본 분산" },
|
|
{ 이름: "RANK", 꼴: "RANK(수, 범위, [순서=0])", 뜻: "범위 안 순위(0=내림차순)" },
|
|
{ 이름: "RANK.EQ", 꼴: "RANK.EQ(수, 범위, [순서=0])", 뜻: "범위 안 순위(0=내림차순)" },
|
|
{ 이름: "LARGE", 꼴: "LARGE(범위, k)", 뜻: "k 번째로 큰 값" },
|
|
{ 이름: "SMALL", 꼴: "SMALL(범위, k)", 뜻: "k 번째로 작은 값" },
|
|
{ 이름: "PERCENTILE", 꼴: "PERCENTILE(범위, k)", 뜻: "k(0~1) 자리 백분위 값" },
|
|
{ 이름: "QUARTILE", 꼴: "QUARTILE(범위, 사분위수)", 뜻: "사분위수(0~4)" },
|
|
{ 이름: "COUNTBLANK", 꼴: "COUNTBLANK(범위)", 뜻: "빈 칸 개수" },
|
|
{ 이름: "NOW", 꼴: "NOW()", 뜻: "지금 날짜 · 시각(일련번호)" },
|
|
{ 이름: "WEEKDAY", 꼴: "WEEKDAY(일련번호, [유형=1])", 뜻: "요일 번호" },
|
|
{ 이름: "EDATE", 꼴: "EDATE(시작일, 개월수)", 뜻: "개월 뒤(앞) 같은 날" },
|
|
{ 이름: "EOMONTH", 꼴: "EOMONTH(시작일, 개월수)", 뜻: "개월 뒤(앞) 달의 말일" },
|
|
{ 이름: "DATEDIF", 꼴: "DATEDIF(시작일, 종료일, 단위)", 뜻: "두 날짜 차(단위 Y·M·D·YM·MD·YD)" },
|
|
{
|
|
이름: "NETWORKDAYS",
|
|
꼴: "NETWORKDAYS(시작일, 종료일, [휴일범위])",
|
|
뜻: "평일 일수(토·일 · 휴일 뺌)",
|
|
},
|
|
{ 이름: "HOUR", 꼴: "HOUR(일련번호)", 뜻: "시" },
|
|
{ 이름: "MINUTE", 꼴: "MINUTE(일련번호)", 뜻: "분" },
|
|
{ 이름: "TIME", 꼴: "TIME(시, 분, 초)", 뜻: "시각 일련번호를 만듦" },
|
|
];
|