[3탄] Gemini API + Apps Script + Slides 연동 자동화 + AppSheet 강의자료 관리앱 만들기

💠 소개

강의자료 자동화 프로젝트를 하다 보면, 문서나 슬라이드가 구글 드라이브에 저장되는 것까진 좋지만… 정작 그걸 모바일에서 관리하거나 공유하려면 다시 복잡한 절차를 거쳐야 할 때가 많습니다. 😵

그래서 이번엔 기존에 만들어 두었던 Gemini API + Google Apps Script + Slides 기반의 자동화 시스템을 확장하여, AppSheet를 활용한 강의자료 관리 앱까지 구축해보았습니다! 📱📄

💠 진행 방법

✅ 사용한 도구들

  • Gemini API

  • Google Apps Script

  • Google Slides

  • Google Sheets

  • AppSheet

  • ChatGPT 4o, Gemini 2.5 Flash (App Script 코드 수정, AppSheet 구현 가이드)

🛠 핵심 구현 과정

1. Apps Script 수정 – 생성된 강의자료를 기록하기

기존에는 강의자료(Doc, Slides)가 만들어지고 드라이브에 저장되기만 했지만, 생성된 자료의 목록이 누적되지 않는 문제가 있었습니다. 그래서 다음과 같은 필드를 자동으로 기록하도록 스크립트를 수정했습니다:

// ✅ 기존 recordLectureResource 함수를 이것으로 교체
function recordLectureResource({ projectName, type, targetAudience, materials, link }) {
  const sheetName = '강의자료관리';
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName(sheetName) || ss.insertSheet(sheetName);

  // 헤더가 없으면 추가 (RowID 컬럼 포함)
  if (sheet.getLastRow() === 0) {
    sheet.appendRow(['RowID', '생성일자', '프로젝트명', '형태', '대상', '준비물', '생성링크']);
  }

  // RowID 생성 (더 안전한 방식)
  const lastRow = sheet.getLastRow();
  const newRowID = lastRow === 1 ? 1 : lastRow; // 헤더만 있으면 1, 아니면 현재 마지막 행 번호
  
  const today = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyy-MM-dd');
  
  // 데이터 추가 (순서: RowID, 생성일자, 프로젝트명, 형태, 대상, 준비물, 생성링크)
  sheet.appendRow([newRowID, today, projectName, type, targetAudience, materials, link]);
}
// ✅ 기록
    recordLectureResource({
      projectName: programName + ' DOC',
      type: '강의 계획서',
      targetAudience: extractValue(rawContent, '대상'),
      materials: extractValue(rawContent, '준비물'),
      link: doc.getUrl()
    });
// ✅ 기록
    recordLectureResource({
      projectName: programName + ' PPT',
      type: '강의안',
      targetAudience: extractValue(rawContent, '대상'),
      materials: extractValue(rawContent, '준비물'),
      link: presentation.getUrl()
    });
  • 생성일자

  • 프로젝트명(강의자료명)

  • 형태 (계획서/슬라이드)

  • 대상

  • 준비물

  • 생성링크 (Google Docs or Slides URL)

이 정보는 강의자료관리 시트에 저장됩니다.

한국어가있는 Google 스프레드 시트의 스크린 샷

2. AppSheet 구성 – 강의자료 선택 → 메일로 전송

AppSheet에서 다음 기능을 만들었습니다:

  • 강의자료를 리스트에서 선택

  • ‘메일 전송 요청’ 화면에서 받는 사람 이메일 입력

  • 전송 버튼 클릭 시, 다음 정보가 메일전송요청 시트에 기록되도록 설정

[RowID, 요청일자, 프로젝트명, 형태, 받는사람이메일, 자료링크, 상태]
한국어로 된 Google 스프레드 시트의 스크린 샷

→ 전송 성공 시 ‘완료’, 실패 시 ‘실패’로 상태 변경 (🔜 추후 Make 연결하여 이메일로 강의자료링크 전송 -> 상태 변경)

📱 AppSheet 화면

한국어를 가진 전화의 설정 스크린 샷

3. AppSheet 삽질 기록 (💥 삽질은 최고의 교사)

  • 강의자료관리 시트에 RowID(고유값) 를 만들지 않은 바람에 데이터 연결(ref) 지옥을 경험했습니다 😭

    • 👉 교훈: AppSheet를 염두에 두고 있다면 Key 열은 필수!

  • 확장프로그램으로 AppSheet를 열었더니 다른 시트 때문에 앱이 꼬여서, 빈 템플릿에서 두 시트만 따로 불러와 구성

  • 앱 내 view 간 이동 설정 (ex. 강의자료 상세 → 메일 요청 add 버튼 노출)에 엄청난 삽질

    • ChatGPT가 안내한 기능 이름이 AppSheet에서 다르게 나와서 혼란

    • 결국 이미지 캡처해서 계속 물어보며 문제 해결

  • 후반에는 Gemini로 전환, 실제 메뉴명 기반의 가이드가 훨씬 정확해서 수월하게 마무리할 수 있었습니다

💠 결과와 배운 점

📌 배운 점 요약

  • AppSheet는 Sheet 기반으로 앱을 빠르게 만들 수 있지만, 데이터 구조를 모르고 시작하면 상당히 어렵다는 점!

  • ChatGPT는 논리 흐름이 좋지만 실제 UI 기반 안내는 다소 부족했고, Gemini는 구글 생태계 서비스에선 강력한 가이드를 제공

  • 자동화된 자료 생성 + 관리 + 요청 시스템이 완성되며, 진정한 강의자료 자동화 루프 완성 🎯

💡 깨달음

아는 만큼 보이고, 보이는 만큼만 할 수 있다.
AI와 모든 도구는 아는 만큼 활용할 수 있다.
하지만 내가 아는 것에 AI를 더하면, 내가 아는 것보다 더 많은 것을 보고 더 많은 것을 할 수 있다.

도움 받은 글


👉 이 글은 지피터스(gpters.org) X 개발자F(litt.ly/ekwak) 가 만든 사례 기반 자동화 글입니다!

3
4개의 답글

👉 이 게시글도 읽어보세요