<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>연구비 관리 &#8211; Unwrittenpage</title>
	<atom:link href="https://unwrittenpage.com/tag/%ec%97%b0%ea%b5%ac%eb%b9%84-%ea%b4%80%eb%a6%ac/feed/" rel="self" type="application/rss+xml" />
	<link>https://unwrittenpage.com</link>
	<description>페이지로 작성되지 못한 이야기들</description>
	<lastBuildDate>Wed, 25 Feb 2026 21:48:20 +0000</lastBuildDate>
	<language>ko-KR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://unwrittenpage.com/wp-content/uploads/2024/02/cropped-ms-icon-512x512-1-32x32.jpg</url>
	<title>연구비 관리 &#8211; Unwrittenpage</title>
	<link>https://unwrittenpage.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">229780142</site>	<item>
		<title>R&#038;D 과제(RCMS) 연구비 관리 반자동화 시트</title>
		<link>https://unwrittenpage.com/national_project/management/1237/</link>
		
		<dc:creator><![CDATA[Writer JY]]></dc:creator>
		<pubDate>Wed, 25 Feb 2026 09:04:15 +0000</pubDate>
				<category><![CDATA[과제관리 이야기]]></category>
		<category><![CDATA[National Project]]></category>
		<category><![CDATA[RCMS]]></category>
		<category><![CDATA[연구비 관리]]></category>
		<guid isPermaLink="false">https://unwrittenpage.com/?p=1237</guid>

					<description><![CDATA[필자가 수행하는 R&#038;D 과제들은 주로 RCMS에서 연구비를 관리하는 것이 많아, RCMS 사이트를 기반으로 연구비 관리 '반자동화' 시트를 만들었다.]]></description>
										<content:encoded><![CDATA[
<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<p>필자가 직접 과제를 관리하는 기업들뿐 아니라, 신규 문의로도 연구비 관리에 대한 문의는 많다.</p>



<p>보통 수행하는 과제가 하나라면, 매번 과제비 관리 사이트를 접속하여 확인하는 방법이 편할 수 있다.</p>



<p>또는 과제비를 담당하는 연구원이 매 과제비 사용건마다 엑셀 등으로 관리하는 방법도 있을 것이다.</p>



<p>다만 수행하는 과제가 세 개가 넘어간다면, 이런 방법은 매우 번잡해질 수 있다.</p>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<p><strong><span style="text-decoration: underline;">수행 과제가 많을 때는 과제별로 유기적인 과제비 사용이 필요</span>할 때도 있기 때문에, 한 눈에 혹은 한 시트에서 과제비 사용 현황을 보는 것이 더욱 편할 것이다.</strong></p>



<p>이는 과제에 참여하는 연구원 혹은 과제비 사용현황을 공유받고자 하는 사람(부서)들이 늘어날 수록 더욱 그렇다.</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<p><strong>RCMS 등의 정부과제비 관리 사이트에서는 보안때문에 외부 프로그램과 연결이 쉽지 않다.</strong></p>



<p>단순히 API 등을 받아 외부에서 연동시키는 것은 어렵다는 뜻이다.</p>



<p>가끔 그룹웨어나 ERP 등에서 연결이 가능하다면 홍보를 하기는 한다.</p>



<p>하지만 연구비 사용현황을 보는 정도라면 굳이 큰 비용을 들여 이를 도입하자는 의견을 내는 것도 비용상 문제가 있을 것이다.</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<p><strong>필자는 직접 관리하는 과제들이 많다보니, 이를 한 눈에 볼 필요가 있다고 판단했다.</strong></p>



<p>또 우리 기업 중에도 과제비 사용 현황을 이를 실시간으로 확인하고 싶다는 의견이 여럿 있었기도 하다.</p>



<p>그래서 최근에는 구글 워크스페이스를 이용해, 간단히 유사한 시스템을 만들었다.</p>



<p><strong><span style="text-decoration: underline;">필자가 수행하는 R&amp;D 과제들은 주로 RCMS에서 연구비를 관리하는 것이 많아, RCMS 사이트를 기반으로 연구비 관리 &#8216;반자동화&#8217; 시트를 만들었다.</span></strong></p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">1. 연구비 관리 시트 기획</h2>



<p>앞서 언급했듯이 과제비 관리 사이트와 실시간으로 연동하는 것은 보안 때문에 문제가 있다.</p>



<p><strong><span style="text-decoration: underline;">그래서 필자가 간단하게 구성이 가능한 몇 가지만 집중했다.</span></strong></p>



<ul class="wp-block-list">
<li>무료로 구성되고 구성 자체가 매우 쉬울 것</li>



<li>최대한 사용자(연구원)이 귀찮지 않게 할 것</li>



<li>쉽게 타부서 또는 타 연구원과 공유할 수 있을 것</li>
</ul>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<p>사용 방법은 아주 간단하다.</p>



<p><strong>RCMS에 접속해서,&nbsp;</strong></p>



<p><strong>연구비 사용내역을 그냥 전체 다 다운받아,</strong></p>



<p><strong>구글 드라이브 특정 폴더에 넣으면,</strong></p>



<p><strong>지정한 구글 시트에 사용내역이 모두 정리된다.</strong></p>



<p><strong><span style="text-decoration: underline;">이 이후에는 엑셀에서 하듯이 표를 만들거나 그래프를 만들어 공유하면 되는 것이다.</span></strong></p>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<p><strong><span style="text-decoration: underline;">사용한 프로그램이라고는 구글 시트와 구글 드라이브뿐이다.</span></strong></p>



<p>구글 드라이브는 아무나 사용이 가능하고,</p>



<p>구글 시트는 누구에게나 공유가 쉽고, 엑셀과 인터페이스가 유사하여 쉽게 변형이 가능하기 때문이다.</p>



<div style="height:150px" aria-hidden="true" class="wp-block-spacer"></div>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>


<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-9428344216340986"
     crossorigin="anonymous"></script>
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-9428344216340986"
     data-ad-slot="8313720854"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>


<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">2. 연구비 관리 시트 구성 방법</h2>



<p>구글에 가입 후, 구글 드라이브에 접속하자.</p>



<p>왼쪽 상단의 &#8216;+신규&#8217; 버튼을 누른 후 &#8216;구글 스프레드 시트&#8217;를 클릭하면, &#8216;제목 없는 스프레드시트&#8217;가 하나 열린다.</p>



<p>제목은 적당히 &#8216;정부과제 연구비 관리 시트&#8217; 정도로 잡으면 되겠다.</p>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<p>메뉴의 &#8216;확장 프로그램&#8217; -&gt; &#8216;Apps Script&#8217;로 이동하자.</p>



<p>&#8216;제목 없는 프로젝트&#8217;라는 이름의 스크립트가 실행 될 것이다.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized td-caption-align-center"><img fetchpriority="high" decoding="async" width="856" height="345" src="https://unwrittenpage.com/wp-content/uploads/2026/02/Apps-Script-빈-화면.webp" alt="Apps Script 빈 화면" class="wp-image-1241" style="width:700px" srcset="https://unwrittenpage.com/wp-content/uploads/2026/02/Apps-Script-빈-화면.webp 856w, https://unwrittenpage.com/wp-content/uploads/2026/02/Apps-Script-빈-화면-300x121.webp 300w, https://unwrittenpage.com/wp-content/uploads/2026/02/Apps-Script-빈-화면-768x310.webp 768w, https://unwrittenpage.com/wp-content/uploads/2026/02/Apps-Script-빈-화면-150x60.webp 150w, https://unwrittenpage.com/wp-content/uploads/2026/02/Apps-Script-빈-화면-696x281.webp 696w" sizes="(max-width: 856px) 100vw, 856px" /><figcaption class="wp-element-caption"><strong>&lt;Apps Script 빈 화면&gt;</strong></figcaption></figure>
</div>


<p>이 스크립트와 앞서 실행한&nbsp;&#8216;정부과제 연구비 관리 시트&#8217;는 짝이 되는 것이다.</p>



<p><span style="text-decoration: underline;">역시 적당한 이름을 넣은 후, &#8216;Code.gs&#8217;에 아래 코드를 몽땅 복사해 넣자.</span></p>



<p>참고로 테스트는 &#8216;실행&#8217; 버튼을 누르는 것으로 할 수 있다.</p>



<h3 class="wp-block-heading">[코드]</h3>



<pre class="wp-block-code"><code>// ▼▼▼ 실행할 때 꼭 'startMultiProcessing'을 선택하세요! ▼▼▼
function startMultiProcessing() {
  const SPREADSHEET_ID = '<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>'; 
  const PROCESSED_FOLDER_ID = '<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>'; 

  // ============================================================
  // &#91;설정] 과제별 폴더 ID와 시트 매핑
  // ============================================================
  const PROJECT_CONFIG = &#91;
    {
      name: "<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>",       
      folderId: "<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>",   
      sheetName: "<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>", 
      startRow: <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>,
      dateCell: "<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>"
    },
    {
      name: "<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>",       
      folderId: "<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>",   
      sheetName: "<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>",
      startRow: <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>,
      dateCell: "<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>"
    },
    {
      name: "<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>",       
      folderId: "<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>",   
      sheetName: "<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>",
      startRow: <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>,
      dateCell: "<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>"
    },
    {
      name: "<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>",       
      folderId: "<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>",   
      sheetName: "<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>",
      startRow: <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>,
      dateCell: "<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>"
    },
    {
      name: "<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>",       
      folderId: "<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>",   
      sheetName: "<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>",
      startRow: <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>,
      dateCell: "<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>"
    }
  ];

  // 공통 설정
  const START_COL = <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">2</mark>; // B열
  const COLUMN_INDICES = &#91;<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">0, 1, 2, 3, 5, 6, 7, 32, 35, 46, 57</mark>]; 
  const CHECK_COLUMNS = &#91;<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">2, 7, 32</mark>]; 
  
  // &#x2b50; &#91;안전장치] 파일 생성 후 최소 2분이 지나야 처리 (업로드 중단 방지)
  const SAFETY_DELAY_MINUTES = 2; 

  // ============================================================

  const processedFolder = DriveApp.getFolderById(PROCESSED_FOLDER_ID);
  const masterSs = SpreadsheetApp.openById(SPREADSHEET_ID);

  Logger.log(`&#x1f680; &#91;NEW] 총 ${PROJECT_CONFIG.length}개의 과제 처리를 시작합니다.`);

  for (let i = 0; i &lt; PROJECT_CONFIG.length; i++) {
    let config = PROJECT_CONFIG&#91;i];
    Logger.log(`\n========================================`);
    Logger.log(`&#x1f449; &#91;${i + 1}/${PROJECT_CONFIG.length}] 프로젝트: ${config.name}`);

    try {
      // 1. 폴더 확인
      let uploadFolder;
      try {
        uploadFolder = DriveApp.getFolderById(config.folderId);
      } catch(e) {
        Logger.log(`&#x1f6a8; &#91;오류] 폴더 ID가 올바르지 않습니다.`);
        continue;
      }

      // 2. 시트 확인
      let masterSheet = masterSs.getSheetByName(config.sheetName);
      if (!masterSheet) {
        Logger.log(`&#x1f6a8; &#91;오류] 시트 이름(${config.sheetName})이 없습니다.`);
        continue;
      }

      // ---------------------------------------------------------
      // &#91;기능 추가] 해당 시트의 지정된 셀(O15)에 날짜 업데이트
      // ---------------------------------------------------------
      if (config.dateCell) {
        let now = new Date();
        let timeStamp = Utilities.formatDate(now, "GMT+9", "yyyy-MM-dd HH:mm:ss");
        masterSheet.getRange(config.dateCell).setValue("최종 업데이트: " + timeStamp);
      }
      // ---------------------------------------------------------

      // 3. 엑셀 파일 탐색 (안전장치 적용)
      let allFiles = uploadFolder.getFiles();
      let excelFiles = &#91;];
      let nowTime = new Date().getTime(); // 현재 시간

      while (allFiles.hasNext()) {
        let f = allFiles.next();
        let fName = f.getName().toLowerCase();
        
        // 엑셀 파일인지 확인
        if (fName.endsWith(".xlsx") || fName.endsWith(".xls")) {
          
          // &#x2b50; &#91;안전장치 로직] 방금 올린 파일은 건너뛰기
          let lastUpdated = f.getLastUpdated().getTime();
          let diffMinutes = (nowTime - lastUpdated) / (1000 * 60);

          if (diffMinutes &lt; SAFETY_DELAY_MINUTES) {
            Logger.log(`&#x23f3; &#91;대기] '${f.getName()}'은(는) 방금 업로드됨. (안전을 위해 다음 턴에 처리)`);
            continue; 
          }

          excelFiles.push(f);
        }
      }

      if (excelFiles.length === 0) {
        Logger.log(`&#x26a0; 처리할 엑셀 파일이 없습니다.`);
        continue;
      } else {
        Logger.log(`&#x1f4c4; 발견된 안전한 파일: ${excelFiles.length}개`);
      }

      // 4. 타겟 행 계산
      let targetRow;
      let cellStart = masterSheet.getRange(config.startRow, START_COL);
      if (String(cellStart.getValue()).trim() === "") {
        targetRow = config.startRow;
      } else {
        let lastRow = masterSheet.getRange(masterSheet.getMaxRows(), START_COL)
                                 .getNextDataCell(SpreadsheetApp.Direction.UP)
                                 .getRow();
        targetRow = Math.max(config.startRow, lastRow + 1);
      }
      Logger.log(`   - 입력 시작 행: ${targetRow}행`);

      // 5. 중복 방지 키 로딩
      const existingKeys = new Set();
      const lastRowInSheet = masterSheet.getLastRow();
      if (lastRowInSheet &gt;= config.startRow) {
        const sheetData = masterSheet.getRange(1, 1, lastRowInSheet, masterSheet.getLastColumn()).getValues();
        const mapping = CHECK_COLUMNS.map(colIdx =&gt; COLUMN_INDICES.indexOf(colIdx));
        for (let r = config.startRow - 1; r &lt; sheetData.length; r++) {
          if (!sheetData&#91;r]) continue;
          let key = mapping.map(pos =&gt; {
            let colIdx = (START_COL - 1) + pos;
            return (colIdx &lt; sheetData&#91;r].length) ? String(sheetData&#91;r]&#91;colIdx]).trim() : "";
          }).join("_");
          if (key.replace(/_/g, "") !== "") existingKeys.add(key);
        }
      }

      // 6. 파일 처리
      for (let file of excelFiles) {
        let tempSheetId = convertExcelToGoogleSheet(file, config.folderId);
        let tempSheet = SpreadsheetApp.openById(tempSheetId).getSheets()&#91;0];
        let tempData = tempSheet.getDataRange().getValues();
        let newData = &#91;];

        for (let j = 1; j &lt; tempData.length; j++) {
          let row = tempData&#91;j];
          let hasContent = COLUMN_INDICES.some(idx =&gt; row&#91;idx] &amp;&amp; String(row&#91;idx]).trim() !== "");
          if (!hasContent) continue;

          let rowKey = CHECK_COLUMNS.map(idx =&gt; String(row&#91;idx]).trim()).join("_");
          if (!existingKeys.has(rowKey)) {
            let filteredRow = COLUMN_INDICES.map(idx =&gt; row&#91;idx]);
            newData.push(filteredRow);
            existingKeys.add(rowKey);
          }
        }

        if (newData.length &gt; 0) {
          masterSheet.getRange(targetRow, START_COL, newData.length, newData&#91;0].length).setValues(newData);
          Logger.log(`      &#x2705; ${newData.length}건 저장 완료`);
          targetRow += newData.length;
        }

        DriveApp.getFileById(tempSheetId).setTrashed(true);
        let timestamp = Utilities.formatDate(new Date(), "GMT+9", "yyyyMMdd_HHmmss");
        let newName = `${file.getName().replace(/\.xlsx?$/, "")}_${config.sheetName}_${timestamp}.xlsx`;
        file.setName(newName);
        file.moveTo(processedFolder);
      }
            // ---------------------------------------------------------
      // &#91;기능 수정] 데이터가 실제로 추가되었을 때만 날짜 갱신
      // ---------------------------------------------------------
      if (isDataUpdated &amp;&amp; config.dateCell) {
        let now = new Date();
        let timeStamp = Utilities.formatDate(now, "GMT+9", "yyyy-MM-dd HH:mm:ss");
        masterSheet.getRange(config.dateCell).setValue("최종 업데이트: " + timeStamp);
        Logger.log(`&#x1f552; &#91;날짜 갱신] ${config.sheetName} (${config.dateCell})`);
      } else {
        Logger.log(`&#x2139; &#91;날짜 유지] 새로운 데이터가 없어 업데이트 날짜를 변경하지 않습니다.`);
      }
      // ---------------------------------------------------------

    } catch (e) {
      Logger.log(`&#x1f6a8; 에러: ${e.toString()}`);
    }
  }
  Logger.log("&#x1f3c1; 작업 종료");
}

function convertExcelToGoogleSheet(file, folderId) {
  let blob = file.getBlob();
  let resource = { title: file.getName().replace(/\.xlsx?$/, ""), parents: &#91;{id: folderId}] };
  return Drive.Files.insert(resource, blob, {convert: true}).id;
}</code></pre>



<p><strong><span style="text-decoration: underline;">&#8216;<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">?????????????????</mark>&#8216;로 표기된 부분은 아래 수정 방법 확인 후, 필요에 따라 수정하면 된다.</span></strong></p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">[수정 방법]</h3>



<p>1) 과제별 설정</p>



<pre class="wp-block-code"><code>const PROJECT_CONFIG = &#91;
&nbsp; {
&nbsp;&nbsp;&nbsp; name: "과제명(로그용)",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 실행 로그에서 식별할 이름
&nbsp;&nbsp;&nbsp; folderId: "폴더ID_입력",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 엑셀 파일이 업로드될 구글 드라이브 폴더의 ID
&nbsp;&nbsp;&nbsp; sheetName: "시트이름",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 데이터가 입력될 시트 탭 이름 (정확해야 함)
&nbsp;&nbsp;&nbsp; startRow: 16,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 데이터 작성을 시작할 행 번호
&nbsp;&nbsp;&nbsp; dateCell: "O15"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 최종 업데이트 날짜를 찍을 셀 위치 (생략 가능)
&nbsp; },
&nbsp; // ... 콤마(,)로 구분하여 계속 추가 가능
];</code></pre>



<p>2) 전체 공통 설정</p>



<pre class="wp-block-code"><code>// 1. 메인 시트 및 완료 폴더 ID
const SPREADSHEET_ID = '...';      // 데이터를 모을 스프레드시트의 ID
const PROCESSED_FOLDER_ID = '...'; // 처리가 끝난 파일을 보관할 폴더의 ID

// 2. 데이터 매핑 (엑셀의 몇 번째 열을 가져올지: A열=0, B열=1 ...) - '연구비 사용내역' 시트에서 어떤 열의 데이터를 가져올지
const COLUMN_INDICES = &#91;0, 1, 2, 3, 5, 6, 7, 32, 35, 46, 57];

// 3. 중복 체크 기준 (이 열들의 값이 모두 같으면 중복으로 간주)
const CHECK_COLUMNS = &#91;2, 7, 32];

// 4. 안전장치 설정 (분 단위)
const SAFETY_DELAY_MINUTES = 2;

// 5. 시트 내 연구비 사용 내역이 시작될 열
  const START_COL = 2; // B열</code></pre>



<div style="height:150px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">3. 연구비 관리 시트 사용 방법</h2>



<p><strong><span style="text-decoration: underline;">사용법은 간단하다.</span></strong></p>



<p>위에서 지정한 폴더에, 과제에 해당하는 &#8216;연구비 사용 내역&#8217; 엑셀 파일을 넣고 잠시만 기다리면 구글 시트에 해당하는 사용 내역이 쭉 정리된다.</p>



<p>현재는 약 10분 단위로 체크하도록 자동화하였으나, 시간을 줄이거나 혹은 수동으로 사용 내역을 옮길 수도 있다.</p>



<p>위의 코드로 필자가 구성한 형태는 대략 이런 식이다.</p>



<p>상단에는 과제의 기본정보를 볼 수 있도록 표를 작성했고, 하단의 사용내역을 정리하여 한눈에 볼 수 있도록 예산표를 만들었다.</p>



<p>하단의 과제비 사용 내역이 RCMS로부터 다운받은 사용내역이 자동으로 정리되는 부분이다.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized td-caption-align-center"><img decoding="async" width="1024" height="613" src="https://unwrittenpage.com/wp-content/uploads/2026/02/과제비-정리-예시-1024x613.png" alt="연구비 관리 시트 예시" class="wp-image-1247" style="width:700px" srcset="https://unwrittenpage.com/wp-content/uploads/2026/02/과제비-정리-예시-1024x613.png 1024w, https://unwrittenpage.com/wp-content/uploads/2026/02/과제비-정리-예시-300x180.png 300w, https://unwrittenpage.com/wp-content/uploads/2026/02/과제비-정리-예시-768x460.png 768w, https://unwrittenpage.com/wp-content/uploads/2026/02/과제비-정리-예시-701x420.png 701w, https://unwrittenpage.com/wp-content/uploads/2026/02/과제비-정리-예시-150x90.png 150w, https://unwrittenpage.com/wp-content/uploads/2026/02/과제비-정리-예시-696x417.png 696w, https://unwrittenpage.com/wp-content/uploads/2026/02/과제비-정리-예시-1068x639.png 1068w, https://unwrittenpage.com/wp-content/uploads/2026/02/과제비-정리-예시.png 1438w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><strong>&lt;연구비 관리 시트 예시></strong></figcaption></figure>
</div>


<p>이후에는 엑셀에서 하듯이 표를 만들거나 그래프를 만들어 필요한 사람과 공유하면 된다.</p>



<p>엑셀에서와 같이 &#8216;=&#8217; 함수로 여러 개의 과제를 한 개의 시트에 모을 수도 있으니, 이는 사용자의 입맛대로 하면 될 것이다.</p>



<div style="height:150px" aria-hidden="true" class="wp-block-spacer"></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<div style="height:150px" aria-hidden="true" class="wp-block-spacer"></div>



<p><strong><span style="text-decoration: underline;">좀 번거롭기는 하지만, 미리 언급했듯이 &#8216;반자동화&#8217;라는 것을 고려하자.</span></strong></p>



<p>좀 더 응용한다면 매크로 등을 이용해 RCMS 로그인부터 시작해 &#8216;억지 자동화&#8217;를 만들 수도 있을 것이다.</p>



<p>다만 필자의 상황에서는 이정도면 충분한 것 같다는 판단이다.</p>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<p>최근 AI가 발전함에 따라 코딩에 &#8216;ㅋ&#8217;자도 모르던 필자도, 손쉽게 이런식의 관리가 가능해졌다.</p>



<p><strong><span style="text-decoration: underline;">단점은 어떤 문제가 발생할지 모른다는 것이다.</span></strong></p>



<p>혹시 문제가 발생하면, 피드백을 주거나 스스로(?) 고쳐 쓰시는 것도 좋겠다;;</p>



<p>과제와 관련하여 또 재밌거나 혹은 유익한 것들이 만들어지면 공유하겠다.</p>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<div style="height:200px" aria-hidden="true" class="wp-block-spacer"></div>



<hr class="wp-block-separator has-alpha-channel-opacity is-style-default"/>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<p style="font-size:14px">본문 내용을 포함하여, 궁금하거나 또는 상담이 필요한 부분이 있으면 아래 연락처로 문의 바랍니다.</p>



<p style="font-size:14px">궁금한 내용이나 상담받으실 내용을 미리 아래 메일로 미리 보내주시면 정리하여 연락드리겠습니다.</p>



<p style="font-size:14px"><strong>Office. 02-2135-4046</strong><br><strong>E-mail. <a href="mailto:ibaronlabs@outlook.com">jycho@ibaronlabs.com</a></strong><br><strong>Home. <a href="http://www.ibaronlabs.com/" target="_blank" rel="noopener">https://www.ibaronlabs.com</a></strong></p>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-9428344216340986"
     crossorigin="anonymous"></script>
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-9428344216340986"
     data-ad-slot="5687557512"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div></div>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1237</post-id>	</item>
	</channel>
</rss>
