강의 자료 기반 맞춤 설문을 자동으로! Google App Script + AI 활용기

  • 교실에서 아이들의 만화 이미지

    <소개>

  • 강의 계획이 바뀔 때마다, 강의 주제에 따라 설문 내용도 수동으로 수정해야 했습니다.

  • 매 학기마다 반복적으로 작성해야 하는 강의 만족도 설문지가 너무 번거로웠습니다.😢

    파란색 배경에 선글라스가있는 만화 얼굴

    😢 매번 Google Form을 열고, 제목 바꾸고, 문항 복사하고, 강의명 바꾸는 작업이 반복되었죠.
    😄 그래서 이 과정을 자동화해보자는 생각에 Google App Script를 활용하게 되었습니다.

  • 이 반복적인 작업에서 벗어나고 싶어서 자동화 방안을 찾게 되었습니다.

🙌 Google App Script를 활용해 Google Form을 자동 생성하면서,
설문 제작에 드는 시간을 크게 줄일 수 있었고,✨
사람이 직접 하면서 생기는 실수도 자연스럽게 줄어들었습니다.✨

<진행 방법>

  • 강의 자료(PDF)를 Gemini 또는 Claude 같은 LLM에 입력해서

  • 그 내용을 기반으로 설문 문항을 자동 생성하고

  • 이를 Google Form으로 자동으로 만들어주는 Google App Script를 만들고자 함! 💡

강의 자료(PDF)를 Gemini나 Claude에 넣어 문항 아이디어를 얻은 후,
Google App Script로 해당 내용을 Google Form으로 자동 생성하는 스크립트를 작성하도록 AI에게 요구했습니다.

프롬프트 입력창에 아래와 같이 주문을 했습니다.
"이 강의 교안에 맞추어 강의 만족도 조사에 대한 설문지 문항을 10개 이상 만들고 싶어/이 강의 만족도 조사를 위해 구글 설문지를 만들수 있는 앱스크립트를 생성해줘"

강의교안 첨부화일

0_Appscript 활용한 업무자동화_1.Yotube 검색 자동화_2.NotebookLM.pdf
7.23MB

Gemni 가 만든 강의 만족도 설문조사 문항은 다음과 같음


강의 만족도 조사 설문지 문항 (10개 이상) 제공된 강의 교안 PDF 파일의 내용을 바탕으로 구성한 강의 만족도 조사 설문지 문항입니다.

  1. 본 강의의 전반적인 만족도는 어떻습니까? (매우 불만족 - 매우 만족 5점 척도)

  2. Appscript를 활용한 업무 자동화에 대한 설명이 명확하고 이해하기 쉬웠습니까? (전혀 그렇지 않다 - 매우 그렇다 5점 척도)

  3. Google Apps Script의 장점(무료 사용, 쉬운 인터페이스, Google Workspace와의 통합, 실시간 협업)에 대한 설명이 도움이 되었습니까? (전혀 그렇지 않다 - 매우 그렇다 5점 척도)

  4. YouTube 검색 자동화(썸네일 포함) 활용 사례 실습은 유익하고 따라하기 쉬웠습니까? (전혀 그렇지 않다 - 매우 그렇다 5점 척도)

  5. YouTube Data API 키 발급 방법 설명(Google Cloud Console 프로젝트 생성, YouTube Data API v3 활성화, API 키 생성)은 명확하게 전달되었습니까? (전혀 그렇지 않다 - 매우 그렇다 5점 척도)

  6. NotebookLM을 활용한 자료 분석의 개념과 기능(AI 기반 연구 파트너, 자료 통합, 노트 분석 및 요약, 정보 검색, 아이디어 발상 및 글쓰기 지원)에 대해 충분히 이해하셨습니까? (전혀 그렇지 않다 - 매우 그렇다 5점 척도)

  7. Google Apps Script의 교육 현장 활용 사례(학생 관리 자동화, 문서 자동화, 설문 및 평가 자동화)가 실제 업무에 적용 가능하다고 생각하십니까? (전혀 그렇지 않다 - 매우 그렇다 5점 척도)

  8. 강의 내용 중 가장 유익했던 부분은 무엇입니까? (주관식)

  9. 강의 내용 중 개선이 필요하다고 생각하는 부분이 있다면 구체적으로 작성해 주십시오. (주관식)

  10. 본 강의는 귀하의 업무 효율성 향상에 기여할 것으로 예상하십니까? (전혀 그렇지 않다 - 매우 그렇다 5점 척도)

  11. 다음 강의에서 다루었으면 하는 Google Apps Script 또는 NotebookLM 관련 주제가 있다면 무엇입니까? (주관식)

  12. 본 강의를 주변 동료 또는 지인에게 추천하시겠습니까? (예/아니오)

function createLectureSatisfactionSurveyFromPDFContent() {
  var formTitle = "강의 만족도 조사 설문지: Appscript 및 NotebookLM 활용";
  var formDescription = "본 설문지는 'Appscript 활용한 업무자동화 및 NotebookLM 활용한 자료 분석' 강의에 대한 만족도를 파악하고 향후 강의 개선에 활용하기 위한 것입니다. 여러분의 소중한 의견 부탁드립니다.";

  var form = FormApp.create(formTitle);
  form.setDescription(formDescription);

  var item; // 각 문항을 담을 변수 선언

  // 문항 1
  item = form.addScaleItem();
  item.setTitle('1. 본 강의의 전반적인 만족도는 어떻습니까?');
  item.setHelpText('(매우 불만족 - 매우 만족 5점 척도)');
  item.setLowerBound(1);
  item.setUpperBound(5);
  item.setLabels(FormApp.ScaleDisplayPolicy.START_END_AND_LABELS, '매우 불만족', '매우 만족');

  // 문항 2
  item = form.addScaleItem();
  item.setTitle('2. Appscript를 활용한 업무 자동화에 대한 설명이 명확하고 이해하기 쉬웠습니까?');
  item.setHelpText('(전혀 그렇지 않다 - 매우 그렇다 5점 척도)');
  item.setLowerBound(1);
  item.setUpperBound(5);
  item.setLabels(FormApp.ScaleDisplayPolicy.START_END_AND_LABELS, '전혀 그렇지 않다', '매우 그렇다');

  // 문항 3
  item = form.addScaleItem();
  item.setTitle('3. Google Apps Script의 장점(무료 사용, 쉬운 인터페이스, Google Workspace와의 통합, 실시간 협업)에 대한 설명이 도움이 되었습니까?');
  item.setHelpText('(전혀 그렇지 않다 - 매우 그렇다 5점 척도)');
  item.setLowerBound(1);
  item.setUpperBound(5);
  item.setLabels(FormApp.ScaleDisplayPolicy.START_END_AND_LABELS, '전혀 그렇지 않다', '매우 그렇다');

  // 문항 4
  item = form.addScaleItem();
  item.setTitle('4. YouTube 검색 자동화(썸네일 포함) 활용 사례 실습은 유익하고 따라하기 쉬웠습니까?');
  item.setHelpText('(전혀 그렇지 않다 - 매우 그렇다 5점 척도)');
  item.setLowerBound(1);
  item.setUpperBound(5);
  item.setLabels(FormApp.ScaleDisplayPolicy.START_END_AND_LABELS, '전혀 그렇지 않다', '매우 그렇다');

  // 문항 5
  item = form.addScaleItem();
  item.setTitle('5. YouTube Data API 키 발급 방법 설명(Google Cloud Console 프로젝트 생성, YouTube Data API v3 활성화, API 키 생성)은 명확하게 전달되었습니까?');
  item.setHelpText('(전혀 그렇지 않다 - 매우 그렇다 5점 척도)');
  item.setLowerBound(1);
  item.setUpperBound(5);
  item.setLabels(FormApp.ScaleDisplayPolicy.START_END_AND_LABELS, '전혀 그렇지 않다', '매우 그렇다');

  // 문항 6
  item = form.addScaleItem();
  item.setTitle('6. NotebookLM을 활용한 자료 분석의 개념과 기능(AI 기반 연구 파트너, 자료 통합, 노트 분석 및 요약, 정보 검색, 아이디어 발상 및 글쓰기 지원)에 대해 충분히 이해하셨습니까?');
  item.setHelpText('(전혀 그렇지 않다 - 매우 그렇다 5점 척도)');
  item.setLowerBound(1);
  item.setUpperBound(5);
  item.setLabels(FormApp.ScaleDisplayPolicy.START_END_AND_LABELS, '전혀 그렇지 않다', '매우 그렇다');

  // 문항 7
  item = form.addScaleItem();
  item.setTitle('7. Google Apps Script의 교육 현장 활용 사례(학생 관리 자동화, 문서 자동화, 설문 및 평가 자동화)가 실제 업무에 적용 가능하다고 생각하십니까?');
  item.setHelpText('(전혀 그렇지 않다 - 매우 그렇다 5점 척도)');
  item.setLowerBound(1);
  item.setUpperBound(5);
  item.setLabels(FormApp.ScaleDisplayPolicy.START_END_AND_LABELS, '전혀 그렇지 않다', '매우 그렇다');

  // 문항 8 (주관식)
  form.addParagraphTextItem()
      .setTitle('8. 강의 내용 중 가장 유익했던 부분은 무엇입습니까?')
      .setRequired(false);

  // 문항 9 (주관식)
  form.addParagraphTextItem()
      .setTitle('9. 강의 내용 중

😢 Gemini에서 만든 앱스크립트가 계속 애러가 나서...

결국 Claude에게 앱스크립트를 만들어달라고 함




-📋 설문 문항 구성

기본 정보

  • 성명, 소속

핵심 평가 문항 (14개)

  1. 전반적인 만족도 (5점 척도)

  2. 실무 유용성 (5단계 선택)

  3. Google Apps Script 이해도 (5점 척도)

  4. YouTube 검색 자동화 실습 도움도 (5단계 선택)

  5. NotebookLM 설명 명확성 (5점 척도)

  6. 강의 진행 속도 (5단계 선택)

  7. 실습 시간 적절성 (5단계 선택)

  8. 강사 설명력 (5점 척도)

  9. 실무 적용 계획 (복수선택)

  10. 추가 학습 의향 (5단계 선택)

  11. 가장 유용했던 내용 (선택형)

  12. 개선점 (주관식)

  13. 추천 의향 (5점 척도)

  14. 기타 의견 (주관식)




    /**
     * Google Apps Script를 활용한 강의 만족도 조사 자동 생성 스크립트
     * 강의명: Appscript 활용한 업무자동화 & NotebookLM
     * 강사: 이지영 교수
     */
    
    function createLectureSurvey() {
      try {
        // 새로운 Google Form 생성
        const form = FormApp.create('Appscript & NotebookLM 강의 만족도 조사');
        
        // 폼 설명 추가
        form.setDescription(
          '안녕하세요. "Appscript 활용한 업무자동화 & NotebookLM" 강의에 참여해주셔서 감사합니다.\n' +
          '더 나은 강의를 위해 솔직한 의견을 부탁드립니다.\n' +
          '소요시간: 약 3-5분'
        );
        
        // 응답자 정보
        form.addTextItem()
            .setTitle('성명')
            .setRequired(true);
        
        form.addTextItem()
            .setTitle('소속 (학과/부서)')
            .setRequired(true);
        
        // 1. 전반적인 만족도
        form.addScaleItem()
            .setTitle('1. 전반적으로 이번 강의에 대해 얼마나 만족하십니까?')
            .setBounds(1, 5)
            .setLabels('매우 불만족', '매우 만족')
            .setRequired(true);
        
        // 2. 강의 내용의 유용성
        form.addMultipleChoiceItem()
            .setTitle('2. 강의 내용이 실무에 얼마나 도움이 될 것 같습니까?')
            .setChoiceValues([
              '매우 도움이 될 것 같다',
              '어느 정도 도움이 될 것 같다',
              '보통이다',
              '별로 도움이 안 될 것 같다',
              '전혀 도움이 안 될 것 같다'
            ])
            .setRequired(true);
        
        // 3. Google Apps Script 이해도
        form.addScaleItem()
            .setTitle('3. Google Apps Script의 개념과 활용 방법을 얼마나 이해하셨습니까?')
            .setBounds(1, 5)
            .setLabels('전혀 이해 못함', '완전히 이해함')
            .setRequired(true);
        
        // 4. YouTube 검색 자동화 실습
        form.addMultipleChoiceItem()
            .setTitle('4. YouTube 검색 자동화 실습이 얼마나 도움이 되었습니까?')
            .setChoiceValues([
              '매우 도움이 되었다',
              '도움이 되었다',
              '보통이다',
              '별로 도움이 안 되었다',
              '전혀 도움이 안 되었다'
            ])
            .setRequired(true);
        
        // 5. NotebookLM 활용법
        form.addScaleItem()
            .setTitle('5. NotebookLM의 기능과 활용법에 대한 설명이 명확했습니까?')
            .setBounds(1, 5)
            .setLabels('매우 불명확', '매우 명확')
            .setRequired(true);
        
        // 6. 강의 진행 속도
        form.addMultipleChoiceItem()
            .setTitle('6. 강의 진행 속도는 어떠했습니까?')
            .setChoiceValues([
              '너무 빨랐다',
              '약간 빨랐다',
              '적절했다',
              '약간 느렸다',
              '너무 느렸다'
            ])
            .setRequired(true);
        
        // 7. 실습 시간의 적절성
        form.addMultipleChoiceItem()
            .setTitle('7. 실습 시간이 충분했습니까?')
            .setChoiceValues([
              '매우 충분했다',
              '충분했다',
              '적절했다',
              '부족했다',
              '매우 부족했다'
            ])
            .setRequired(true);
        
        // 8. 강사의 설명력
        form.addScaleItem()
            .setTitle('8. 강사의 설명이 이해하기 쉬웠습니까?')
            .setBounds(1, 5)
            .setLabels('매우 어려웠음', '매우 쉬웠음')
            .setRequired(true);
        
        // 9. 실무 적용 가능성
        form.addCheckboxItem()
            .setTitle('9. 이번 강의에서 배운 내용 중 실제로 적용해볼 생각이 있는 것은? (복수 선택 가능)')
            .setChoiceValues([
              'Google Apps Script 기본 사용법',
              'YouTube 검색 자동화',
              'NotebookLM을 활용한 자료 분석',
              '업무 자동화 아이디어 적용',
              '교육 현장에서의 활용',
              '기타 Google Workspace 연동',
              '없음'
            ])
            .setRequired(true);
        
        // 10. 추가 학습 의향
        form.addMultipleChoiceItem()
            .setTitle('10. 관련 심화 강의가 있다면 참여하실 의향이 있으십니까?')
            .setChoiceValues([
              '매우 참여하고 싶다',
              '참여하고 싶다',
              '보통이다',
              '별로 참여하고 싶지 않다',
              '전혀 참여하고 싶지 않다'
            ])
            .setRequired(true);
        
        // 11. 가장 유용했던 내용
        form.addMultipleChoiceItem()
            .setTitle('11. 강의에서 가장 유용했던 내용은 무엇입니까?')
            .setChoiceValues([
              'Google Apps Script 소개 및 장점',
              '교육 현장 자동화 사례들',
              'YouTube 검색 자동화 실습',
              'API 키 발급 및 설정 방법',
              'NotebookLM 기능 소개',
              'NotebookLM 활용 사례',
              '모든 내용이 유용했음'
            ])
            .setRequired(true);
        
        // 12. 개선점 (주관식)
        form.addParagraphTextItem()
            .setTitle('12. 강의에서 개선되었으면 하는 점이나 추가로 다뤘으면 하는 내용이 있다면 자유롭게 작성해주세요.')
            .setRequired(false);
        
        // 13. 추천 의향
        form.addScaleItem()
            .setTitle('13. 이 강의를 동료나 지인에게 추천하실 의향이 있으십니까?')
            .setBounds(1, 5)
            .setLabels('절대 추천 안함', '적극 추천함')
            .setRequired(true);
        
        // 14. 기타 의견 (주관식)
        form.addParagraphTextItem()
            .setTitle('14. 강의에 대한 기타 의견이나 제안사항이 있으시면 자유롭게 작성해주세요.')
            .setRequired(false);
        
        // 폼 설정
        form.setAcceptingResponses(true);
        form.setLimitOneResponsePerUser(false);
        form.setShowLinkToRespondAgain(false);
        
        // 응답 결과를 저장할 스프레드시트 생성
        const spreadsheet = SpreadsheetApp.create('강의 만족도 조사 결과 - Appscript & NotebookLM');
        form.setDestination(FormApp.DestinationType.SPREADSHEET, spreadsheet.getId());
        
        // 결과 출력
        const formUrl = form.getPublishedUrl();
        const editUrl = form.getEditUrl();
        const spreadsheetUrl = spreadsheet.getUrl();
        
        Logger.log('=== 강의 만족도 조사 생성 완료 ===');
        Logger.log('설문지 URL: ' + formUrl);
        Logger.log('설문지 편집 URL: ' + editUrl);
        Logger.log('결과 스프레드시트 URL: ' + spreadsheetUrl);
        
        // 현재 시트에 URL 정보 입력 (선택사항)
        try {
          const sheet = SpreadsheetApp.getActiveSheet();
          if (sheet) {
            sheet.getRange('A1').setValue('강의 만족도 조사 정보');
            sheet.getRange('A2').setValue('설문지 URL:');
            sheet.getRange('B2').setValue(formUrl);
            sheet.getRange('A3').setValue('편집 URL:');
            sheet.getRange('B3').setValue(editUrl);
            sheet.getRange('A4').setValue('결과 시트 URL:');
            sheet.getRange('B4').setValue(spreadsheetUrl);
            sheet.getRange('A5').setValue('생성 일시:');
            sheet.getRange('B5').setValue(new Date());
          }
        } catch (e) {
          Logger.log('현재 시트에 정보 입력 중 오류: ' + e.toString());
        }
        
        // 사용자에게 이메일로 결과 전송 (선택사항)
        try {
          const user = Session.getActiveUser().getEmail();
          if (user) {
            MailApp.sendEmail({
              to: user,
              subject: '강의 만족도 조사 생성 완료',
              body: '강의 만족도 조사가 성공적으로 생성되었습니다.\n\n' +
                    '설문지 URL: ' + formUrl + '\n' +
                    '편집 URL: ' + editUrl + '\n' +
                    '결과 시트 URL: ' + spreadsheetUrl + '\n\n' +
                    '생성 일시: ' + new Date()
            });
            Logger.log('결과를 이메일로 전송했습니다: ' + user);
          }
        } catch (emailError) {
          Logger.log('이메일 전송 중 오류 (무시 가능): ' + emailError.toString());
        }
        
        return {
          formUrl: formUrl,
          editUrl: editUrl,
          spreadsheetUrl: spreadsheetUrl
        };
        
      } catch (error) {
        Logger.log('오류 발생: ' + error.toString());
        console.error('설문지 생성 중 오류가 발생했습니다: ' + error.toString());
        throw error;
      }
    }
    
    /**
     * 스프레드시트 환경에서 실행할 때만 사용 (메뉴 추가)
     * 일반 Apps Script에서는 사용하지 않음
     */
    function onOpen() {
      try {
        const ui = SpreadsheetApp.getUi();
        ui.createMenu('강의 만족도 조사')
          .addItem('설문지 생성', 'createLectureSurvey')
          .addToUi();
      } catch (e) {
        // 스프레드시트 환경이 아닌 경우 무시
        Logger.log('메뉴 추가는 스프레드시트 환경에서만 가능합니다.');
      }
    }
    
    /**
     * 기존 설문지 복사해서 새로운 설문지 만들기 (선택사항)
     */
    function copyAndCustomizeSurvey(originalFormId) {
      try {
        const originalForm = FormApp.openById(originalFormId);
        const newForm = originalForm.duplicate('강의 만족도 조사 - ' + Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyy-MM-dd'));
        
        Logger.log('복사된 설문지 URL: ' + newForm.getPublishedUrl());
        Logger.log('복사된 설문지 편집 URL: ' + newForm.getEditUrl());
        
        return newForm.getPublishedUrl();
      } catch (error) {
        Logger.log('설문지 복사 중 오류: ' + error.toString());
        throw error;
      }
    }

    🚀 사용 방법

    Apps Script 환경에서 실행

    1. Google Apps Script 접속

    2. 새 프로젝트 생성

    3. 수정된 코드 복사/붙여넣기

    4. createLectureSurvey 함수 선택 후 실행

    5. 실행 로그 확인 (중요!)

      • 실행 후 "로그" 탭 클릭

      • 설문지 URL, 편집 URL, 결과 시트 URL 확인

    결과 확인 위치

    • 로그 창: 모든 URL 정보 표시

    • 이메일: 실행 결과가 자동으로 이메일로 전송 (Gmail 계정으로)

    ✨ 주요 특징

    • 자동 생성: 원클릭으로 완전한 설문지 생성

    • 실시간 수집: Google Sheets에 자동으로 응답 저장

    • 맞춤 설계: 강의 내용(Apps Script, YouTube 자동화, NotebookLM)에 특화

    • 다양한 문항 유형: 척도, 선택형, 주관식 등 다양한 형태

    • 결과 분석 지원: 수집된 데이터를 바로 분석 가능

    이 스크립트를 실행하면 전문적인 강의 만족도 조사가 완성되고, 학생들의 피드백을 체계적으로 수집할 수 있습니다!






  • Claude 도 한번 애러가 났지만 바로 수정하여 "강의만족도 조사 설문지(구글 폼)"를 잘 만들어줌

https://docs.google.com/forms/d/e/1FAIpQLScB7L38j5kwgsPh0WAb2rdZ1KegM-SnnZToUQKLMgcjhe1bmw/viewform

<결과와 배운 점>

  • 반복적인 설문지 제작 시간을 대폭 줄일 수 있었습니다 ✅

  • 수동 수정 중 발생하던 실수가 사라졌고, 매끄러운 설문 생성이 가능해졌습니다

  • AI로 문항을 추출하고 스크립트로 자동화하는 과정 자체가 큰 학습이 되었고, 다른 강의나 교육 자료에도 쉽게 응용할 수 있을 것 같다는 가능성을 느꼈습니다

    😄 "AI와 자동화는 생각보다 더 쉽게 시작할 수 있어요!"
    "시도해보면, 분명히 시간도 절약되고 결과물의 퀄리티도 올라갑니다."

도움 받은 글 (옵션)

참고한 지피터스 글이나 외부 사례를 알려주세요.

(내용 입력)

7
5개의 답글

👉 이 게시글도 읽어보세요