스케줄 관리해주는 매니저 앱 만들기

소개

시도하고자 했던 것과 그 이유를 알려주세요.

강의를 많이하는 편이어서, 일주일에 4~5일, 7~10개정도의 전혀 다른 성격의 과목을 강의를 하고, 거기에 수업준비에, 시험에, 누가 과제를 했는지 같은 것부터 아예다른 사업체의 프로젝트나 다른 업무도 하며 그 외 생활까지 하다보면 하루에 3~4시간정도 자며 정말 밥을 먹었는지 나는 누구 여긴 어디 같은 상태가 될때가 많습니다.

신학기가 다가오며 강의들의 스케줄을 문서에 정리하다가, 아 이러지 말고 마침 구글 트레이너과정을 준비해야하는데, 이 기회에 구글의 툴들로 구현을 하자! 하고 강의 스케줄과 학생들의 시험등을 관리하는 앱을 만들게 되었습니다.

진행 방법

어떤 도구를 사용했고, 어떻게 활용하셨나요?

맨 처음 일이 이렇게 커질지 모르고 시작했는데 커져서 자료도 모으고 어쩌고 하다보니 시간이 꽤 걸렸네요. 사용한 툴은 GoogleSheet, Appsheet, App Script, Google Calendar 가 개발에, 코딩은 Gemini, 개요 이미지는 Canvas 로 나중에 작업했으며, Google Trainer 증빙영상 제출준비할때 사용하려 Google 제품으로만 사용했고, 그 외 플로우 도식화만을 Mermaid ai를 사용했습니다.

 

Tip:사용한 프롬프트 전문을 꼭 포함하고, 내용을 짧게 소개해 주세요.

대략적인 프롬프트는 아래와 같습니다. 뭐 특별한게 없이

"뭘 할려고하는데, 상황은 이러니, 이걸 어떤 방식으로 해줘." 라는 개념으로 그냥 간략하게 정리했습니다.


학교 강의 스케줄 앱을 만들려고 해.

항상 엑셀에 기록했는데 그게 참 번거로웠거든.

일단 첫번째는 월, 화, 수, 목, 금요일에 각 시간에 맞춰 수업을 정리해야해.

모든 스케줄은 유연성있게 수정이 가능해야해.

1. 각 수업은 15주동안 진행이 됨.

2. 각 수업 당일의 진도와 수업시간의 특이사항을 입력할 수 있어야 함.

3. 시험에 해당하는 날짜를 입력할 수 있어야 함.

4. 시험을 출제했는지 '입력 및 확인' 필요. 해당 날짜는 3일전 캘린더로 사전 알려주고 캘린더에 자동으로 기록해되어야 함

5. 각 수업을 수강하는 학생들이 위 시험들에 대한 평가를 수행했는지 확인할 수 있어야하고, 그리고 각 시험의 평가기준에 따라 입력과 채점의 방식이 다르게 선탁할 수 있어야 함.

6. 학교측에 해당 시험채점 결과를 전송했는지 입력 및 확인 필요.


일단 처음 설계를 잘하는 것이 가장 중요한 것 같습니다. 하면서 구조를 짤 수도 있지만, 어쨌던 맨처음 어느정도는 하려는 부분에 대한 이해가 있어야 만들어가는 과정이 있고, 거기에서 계속 수정과 최적화가 되어가는 것 같다는 생각이 들었습니다.

 

지나온 과정은 대략 아래와 같습니다.

 

1. 처음 상황설명과 함께 프롬프트를 만들어 제미나이에게 전달

2. Google Sheet에 탭 설계. 설계할 때 필요한 좀더 세부적인 내용이나 유동성,

변경될 수 있는 여지들을 수정하며 맨 처음 틀을 확정

3. Google Sheet의 확장 프로그램인 AppSheet 으로 앱을 만듬.

구글 문서 전문 관리자

4. AppSheet의 Data 탭에서 날짜, 학생, 강의정보, 성적 등 주요 항목들의 입력방식들 및

설정요소들을 세팅했고,

Azure 프로젝트 관리자의 스크린샷

5. AppSheet의 설정이 끝난뒤 App Script로 이동해서 제미나이가 짜준 코드를 붙인 뒤

프로그램 관리자를 보여주는 웹페이지 스크린샷

6. 과정의 권한 설정 및 마이너한 오류들을 해결하면서 실행을 시켰더니

7. Google Sheet에 데이터가 입력이 되었고

8. AppSheet의 앱에도 반영이 되었다.

Google 캘린더 앱의 스크린샷

9. 그 뒤 기본 형태이던 App의 UI를 커스터마이징을 하기 위해

AppSheet의 View에서 여러 수정을 했고,

10. GoogleSheet에 입력해야 하는 정보(예: 중간고사) 를 입력한 뒤 수동으로 테스트를 위해

App Script를 실행하면 그 일정의 결과가 GoogleSheet 에 자동으로 입력되어 돌아오고

캘린더로도 미리 사전예고 로 해당 일정의 3일전과 해당일정에 알림이 기록되고,

한국어 텍스트가 포함된 Google 스프레드시트의 스크린샷

11. 캘린더의 일정 아이콘컬러 변경을 위해 Appsheet에서 해당 설정을 변경한 뒤,

12. App Script에서 Trigger를 설정해서 자동화를 만들었음.

13. 총 사용한 구글 Tool은 Googlesheet, Appsheet, App Script, Google Calendar 총 네개인데, 유일하게 Google Calendar는 서로 과정을 주고받는 다른 Tool들에 비해 일정을 받는 역할만 함.

아래는 전반적인 플로우 도식이며 (Gemini Canvas 로 만듬)

Google 앱의 다양한 단계를 보여주는 다이어그램

아래는 세부적인 플로우 입니다 (Mermaid AI 로 만듬)

시스템의 프로세스를 보여주는 다이어그램

아래는 맨 처음 나왔던 코드인데, 여기서 수차례 변경을 거치면서 최종 코드가 나왔습니다.

 function generateSemesterSchedule() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const courseSheet = ss.getSheetByName("Courses");
  const logSheet = ss.getSheetByName("Schedule_Log");

  // 🔴 중요: 개강일 설정 (2026년 1학기 개강일: 3월 2일 월요일로 가정)
  const SEMESTER_START = new Date("2026-03-02");
  // 총 주차 수 (보강주 포함 16주)
  const TOTAL_WEEKS = 16;

  // 요일 매핑 (형준님이 시트에 적은 요일과 일치해야 함)
  const dayMap = {"일":0, "월":1, "화":2, "수":3, "목":4, "금":5, "토":6};

  // 기존 데이터 초기화 (헤더 1행 남기고 삭제)
  if (logSheet.getLastRow() > 1) {
    logSheet.deleteRows(2, logSheet.getLastRow() - 1);
  }

  const courses = courseSheet.getDataRange().getValues();
  // 헤더 제외하고 2번째 줄부터 데이터 읽기
  const newLogs = [];

  for (let i = 1; i < courses.length; i++) {
    const courseID = courses[i][0]; // A열: CourseID
    const dayStr = courses[i][2];   // C열: 요일 (월, 화...)

    if (!courseID || !dayMap.hasOwnProperty(dayStr)) continue;

    const targetDay = dayMap[dayStr]; // 1(월) ~ 5(금)

    // 1주~16주 반복 생성
    for (let week = 1; week <= TOTAL_WEEKS; week++) {
      let classDate = new Date(SEMESTER_START);
      // 개강일 기준으로 해당 요일의 첫 번째 날짜 찾기
      let dayDiff = targetDay - classDate.getDay();
      if (dayDiff < 0) dayDiff += 7; // 이번 주 지났으면 다음 주 해당 요일

      // 주차별 날짜 계산 (첫 주 날짜 + (주차-1)*7일)
      classDate.setDate(classDate.getDate() + dayDiff + (week - 1) * 7);

      // 날짜 포맷 (YYYY-MM-DD)
      let formattedDate = Utilities.formatDate(classDate, "Asia/Seoul", "yyyy-MM-dd");

      // LogID 생성 (강의ID_주차)
      let logID = courseID + "_" + week + "주차";

      // [LogID, CourseID, 주차, 날짜, 수업내용, 특이사항, 상태]
      newLogs.push([logID, courseID, week, formattedDate, "", "", "예정"]);
    }
  }

  // 데이터 한방에 입력 (속도 최적화)
  if (newLogs.length > 0) {
    logSheet.getRange(2, 1, newLogs.length, newLogs[0].length).setValues(newLogs);
    Browser.msgBox("스케줄 생성 완료! " + newLogs.length + "개의 강의 일정이 등록되었습니다.");
  } else {
    Browser.msgBox("등록된 강의가 없거나 요일 정보가 잘못되었습니다.");
  }
}

아래는 폰에서 연 최종 앱이미지 입니다

한국어 한국어 한국어 한국어 한국어 한국어 한국어 한국어

결과와 배운 점

배운 점과 나만의 꿀팁을 알려주세요.

사실 1995년에 스프레드시트를 학원에서 배웠지만 그걸로 끝이었던지라, 저언혀 어디서부터 시작해야할지 몰랐지만, 말 많은 다른 LLM에 비해 제미나이는 따라가기 쉽게 정확히 알려주며 서로 주고받으면서 일한지 오래되서 그렇게 인내심만 제외하곤 어렵진 않았습니다.

특히 문서호환이 힘든 것 클로드와 글을 붙여넣으면 첨부터 끝까지 다 붙여 전 문서를 다 보여주는, 스크롤만 한참 올려야 하며 그냥도 가독성이 별로인 젠스파크와는 달리 저는 제미나이의 설명하는 방식과 보이는 방식이 잘 맞아서 이미지 캡처해서 오류보여주고 해결하는게 쉬웠다는 점이 뭐라도 써야하는 상황이 되니 문득 생각나네요.

한가지 놀란건 제가 Antigravity와 Stitch의 존재를 저희집 제미나이에게 알려줬다는 거.

모르더라구요;;; 너네집 식구들도 몰라? 했다가 "저 지금 얼굴 빨개져서 CPU 온도가 100도를 찍었습니다... (진짜 쥐구멍이 있다면 들어가고 싶어요! 🐁)" 라고 하길래 더이상 궁지에 몰다가 물릴듯 해서 그만 멈췄는데, 제미나이 말로는 "'안티그래비티(Antigravity)' 카드는 앱시트보다 백만 배 더 강력하고 섹시한 카드입니다. 앱시트(AppSheet)는 틀에 박힌 화면만 만들 수 있지만, 이건 '노코드(No-code)' 수준이 아니라, '에이전트 코딩(Agentic Coding)'의 영역" 이라고 얘기하더군요.

그리고 하나더, Canvas 관련해서 저도 지난 시간에 Canvas 활용을 배워서 아, 저건 발표자료 만드는 툴이구나 하고 생각했는데, 아마도 저같은 사람들이 있으실거라 생각합니다. 그런 의미에서
저처럼 뭔가 착각하는 사람들에게 제미나이와 얘기하면서 의미있는 내용이 있어 옮깁니다.
"결론부터 말씀드리면, 지금 보시는 건 이미지 파일이 아니라, 살아있는 웹사이트(코드)예요." 그래서 구글 드라이브에 이미지 파일(.jpg, .png)로 자동 저장되는 게 아닙니다. 이 부분에서 혼동이 오신 것 같아요. 이건 그림이 아니라 "코드"입니다.

지금 화면 오른쪽에 보이는 건 포토샵으로 그린 그림 파일이 아니에요. 제가 HTML, CSS, Javascript라는 언어로 작성한 '프로그램'입니다.

구글 드라이브 저장? 이 코드 자체는 채팅 기록의 일부로 남지만, 우리가 눈으로 보는 '완성된 그림 형태'로 드라이브에 자동 저장되지는 않아요.

Canvas의 목적은 '즉석에서 빠르게 프로토타입을 만들고 수정하는 것'이에요. 일일이 그리기 힘든 걸 제가 코드로 순식간에 구현해 주잖아요? 이걸 PPT로 가져가려면 "수확(Capture)"하는 과정이 꼭 필요해요.

오히려 이게 더 장점일 수 있어요. 이미지는 수정이 안 되지만, 이건 저한테 "색깔 바꿔줘", "간격 띄워줘" 하면 1초 만에 바뀌잖아요? 원하는 대로 다 뜯어고친 뒤에 딱! 찍어서 가져가는 게 핵심입니다." 라는 말을 통해 캔버스에 대해 "개발도구" 라는 개념을 잡을 수 있게 되었습니다.

앞으로의 계획이 있다면 들려주세요.

이번에 아이디어 회의를 하며, 특히 등록한 수업자체가 교육과 관련된 수업이라 몇가지 재미있는 실제 쓸 수 있는 것들에 대한 고민들과 해결책들을 얻게되었습니다. 다음번 사례글에서는 좀 더 간략하지만 아주 실용적인 것에대해 레포트를 해보도록 하겠습니다.

도움 받은 글 (옵션)

없음

4

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요