인공지능 (AI) 따라잡기

[DART OPEN API] <1> 사업보고서 출자현황 구글시트로 불러오기

MoneyManager 2025. 6. 29. 23:16
728x90

 

금융감독원 DART OPEN API 를

구글시트로 다루는 과정에서

중요사항을

메모하기 위해 작성합니다.

 

이주일 전 쯤 사업보고서에 있는

타법인 출자현황을 불러오는

코드를 작성했습니다. 

 

  chatGPT 인지 코파일럿인지

잘 기억이 안나는 군요. 

 

 

다시 활용하려고 보니까

가져오는 값들이 전부 텍스트 형태인

raw data로 불러오고 있는 상황입니다.  

 

 

수정전 기존 앱 스크립트 입니다. 

금융감독원 오픈 API 를 사용하시기 위해서는 

역시 인증키를 받으셔야 하구요.

 

아래 코드에는 인증키에

일부 xxxxxxx 로 가려놨으니

인증키를 승인받으시면 

해당 부분을 바꿔서 사용해 보세요. 

 

 

비 개발자이고, 코딩을 모르지만

직관적으로 봤을떄

아래 코드가 썩 잘 짜여진 것

같지는 않습니다. 


 

  • 원본 스크립트

 

/**
 *  ────────────────────────────────────────────────
 *  DART 기타특수관계자 출자현황 (otrCprInvstmntSttus)
 *  숫자·날짜를 값(Value)으로 반환
 *  ────────────────────────────────────────────────
 */
function getInvestmentStatus(corpCode, year, reportType) {
  const apiKey = "e042bxxxxxxxxxxxxxxxxxx34b400fc5d4";   // 인증키
  const url = `https://opendart.fss.or.kr/api/otrCprInvstmntSttus.json` +
              `?crtfc_key=${apiKey}&corp_code=${corpCode}` +
              `&bsns_year=${year}&reprt_code=${reportType}`;

  const response = UrlFetchApp.fetch(url);
  const jsonData = JSON.parse(response.getContentText());

  if (!jsonData.list || jsonData.list.length === 0) {
    return [["데이터 없음"]];
  }

  /* ── 값 변환 헬퍼 ───────────────────────────────── */
  const n = v => (v && v !== "-" ? Number(String(v).replace(/,/g, "")) : "");   // 숫자
  const d = v => {                                                              // 날짜(yyyymmdd)
    if (!v || v === "-") return "";
    v = String(v).replace(/-/g, "");            // '2023-03-31' → '20230331'
    if (v.length === 8) {
      return new Date(+v.substr(0, 4), +v.substr(4, 2) - 1, +v.substr(6, 2));
    }
    return new Date(v);                         // 혹시 다른 포맷이면 그대로 시도
  };

  /* ── 헤더 ─────────────────────────────────────── */
  const rowData = [[
    "회사명","출자 법인명","최초 취득 일자","출자 목적","최초 취득 금액",
    "기초 잔액 수량","기초 잔액 지분율","기초 잔액 장부 가액",
    "증가 감소 취득·처분 수량","증가 감소 취득·처분 금액","증가 감소 평가 손액",
    "기말 잔액 수량","기말 잔액 지분율","기말 잔액 장부 가액",
    "최근 사업연도 총 자산","최근 사업연도 당기 순이익","결산 기준일"
  ]];

  /* ── 본문 ─────────────────────────────────────── */
  jsonData.list.forEach(item => {
    rowData.push([
      item.corp_name                      || "-",          // 회사명
      item.inv_prm                        || "-",             // 출자 법인명
      d(item.frst_acqs_de),                               // 최초 취득 일자
      item.invstmnt_purps                 || "-",        // 출자 목적
      n(item.frst_acqs_amount),                       // 최초 취득 금액
      n(item.bsis_blce_qy),                               // 기초 잔액 수량
      n(item.bsis_blce_qota_rt),                        // 기초 잔액 지분율
      n(item.bsis_blce_acntbk_amount),           // 기초 잔액 장부 가액
      n(item.incrs_dcrs_acqs_dsps_qy),           // 증감 수량
      n(item.incrs_dcrs_acqs_dsps_amount),   // 증감 금액
      n(item.incrs_dcrs_evl_lstmn),                   // 증감 평가손액
      n(item.trmend_blce_qy),                           // 기말 잔액 수량
      n(item.trmend_blce_qota_rt),                    // 기말 잔액 지분율
      n(item.trmend_blce_acntbk_amount),                      // 기말 잔액 장부 가액
      n(item.recent_bsns_year_fnnr_sttus_tot_assets),     // 최근 총 자산
      n(item.recent_bsns_year_fnnr_sttus_thstrm_ntpf),    // 최근 순이익
      d(item.stlm_dt)                                                           // 결산 기준일
    ]);
  });

  return rowData;   // 이중 배열 그대로 시트에 setValues()
}

 


  • 해당 스크립트 실행결과 

실행은 C3 셀에다 입력함.

=getInvestmentStatus(C3,C4,C5)

 

결과값이 좌측으로 정렬되어 있네요?

 

이건 결과값을

텍스트로 반환했기 때문입니다. 

 

 

 


기존 작성은 유료  구독하기 전에

작성된 것이 확실합니다. 

 

이번에는 chatGPT PLUS

버전 o3 (고급 이성 사용) 에게

수정을 요청했습니다. 

 

명령어 아래에

기존 스크립트를

그대로 복붙했습니다. 

  • chatGPT에 코드 수정 요청

 

 

...


  • chatGPT 코드 수정 중
12초 동안 생각함

아래처럼 숫자·날짜 필드를 실제 “값”(Number, Date 객체)으로 변환해 주면 시트에 붙었을 때 더 이상 텍스트가 아니라 숫자/날짜 형식으로 인식됩니다.

 
 
 
/**
 *  ────────────────────────────────────────────────
 *  DART 기타특수관계자 출자현황 (otrCprInvstmntSttus)
 *  숫자·날짜를 값(Value)으로 반환
 *  ────────────────────────────────────────────────
 */
function getInvestmentStatus(corpCode, year, reportType) {
  const apiKey = "e042b29bxxxxxxxxxxxxxxxxxxxxxxxx0fc5d4";   // 인증키
  const url = `https://opendart.fss.or.kr/api/otrCprInvstmntSttus.json` +
              `?crtfc_key=${apiKey}&corp_code=${corpCode}` +
              `&bsns_year=${year}&reprt_code=${reportType}`;

  const response = UrlFetchApp.fetch(url);
  const jsonData = JSON.parse(response.getContentText());

  if (!jsonData.list || jsonData.list.length === 0) {
    return [["데이터 없음"]];
  }

  /* ── 값 변환 헬퍼 ───────────────────────────────── */
  const n = v => (v && v !== "-" ? Number(String(v).replace(/,/g, "")) : "");   // 숫자
  const d = v => {                                                              // 날짜(yyyymmdd)
    if (!v || v === "-") return "";
    v = String(v).replace(/-/g, "");            // '2023-03-31' → '20230331'
    if (v.length === 8) {
      return new Date(+v.substr(0, 4), +v.substr(4, 2) - 1, +v.substr(6, 2));
    }
    return new Date(v);                         // 혹시 다른 포맷이면 그대로 시도
  };

  /* ── 헤더 ─────────────────────────────────────── */
  const rowData = [[
    "회사명","출자 법인명","최초 취득 일자","출자 목적","최초 취득 금액",
    "기초 잔액 수량","기초 잔액 지분율","기초 잔액 장부 가액",
    "증가 감소 취득·처분 수량","증가 감소 취득·처분 금액","증가 감소 평가 손액",
    "기말 잔액 수량","기말 잔액 지분율","기말 잔액 장부 가액",
    "최근 사업연도 총 자산","최근 사업연도 당기 순이익","결산 기준일"
  ]];

  /* ── 본문 ─────────────────────────────────────── */
  jsonData.list.forEach(item => {
    rowData.push([
      item.corp_name                      || "-",          // 회사명
      item.inv_prm                        || "-",             // 출자 법인명
      d(item.frst_acqs_de),                               // 최초 취득 일자
      item.invstmnt_purps                 || "-",        // 출자 목적
      n(item.frst_acqs_amount),                        // 최초 취득 금액
      n(item.bsis_blce_qy),                                // 기초 잔액 수량
      n(item.bsis_blce_qota_rt),                          // 기초 잔액 지분율
      n(item.bsis_blce_acntbk_amount),                    // 기초 잔액 장부 가액
      n(item.incrs_dcrs_acqs_dsps_qy),                    // 증감 수량
      n(item.incrs_dcrs_acqs_dsps_amount),            // 증감 금액
      n(item.incrs_dcrs_evl_lstmn),                       // 증감 평가손액
      n(item.trmend_blce_qy),                               // 기말 잔액 수량
      n(item.trmend_blce_qota_rt),                        // 기말 잔액 지분율
      n(item.trmend_blce_acntbk_amount),                       // 기말 잔액 장부 가액
      n(item.recent_bsns_year_fnnr_sttus_tot_assets),     // 최근 총 자산
      n(item.recent_bsns_year_fnnr_sttus_thstrm_ntpf),    // 최근 순이익
      d(item.stlm_dt)                                     // 결산 기준일
    ]);
  });

  return rowData;   // 이중 배열 그대로 시트에 setValues()
}

 

✅ 변경 핵심

구분변환 전 (텍스트)변환 후 (값)
숫자 "1234567" 1234567 (Number)
날짜 "20240331" new Date(2024-03-31)
 
  • n(): 쉼표(,)·빈 문자열 처리 후 Number()로 변환
  • d(): yyyymmdd → Date 객체로 변환 (셀에서 날짜로 인식)
  • 값이 없거나 "-"이면 빈 셀로 남기기 ("")

이제 구글시트에 setValues() 하면 숫자는 숫자 서식을, 날짜는 날짜 서식을 자유롭게 적용할 수 있습니다. 필요하면 함수 이름(getInvestmentStatus)을 시트 사용자 정의 함수로 그대로 사용해도 됩니다.

  • chatGPT 답변종료

  • 수정된 스크립트 적용하기

특별한 문제없이

바로 value 값으로 들어오는 것을

확인했습니다. 

 

역시 chatGPT 알면 알수록 

대단하네요. 

 

 

 

 

 

 

 

728x90