구글 앱스크립트를 활용한 구글 설문지 생성 자동화

소개

  • 원래 저의 목적은 만들어진 설문지 퀴즈 80개를 섞어서 60개로 랜덤으로 만들어지는 자동화를 하려고 했는데 복잡하고 난해하여 아무래도 성공이 어렵습니다.
    여러가지 방법을 사용하다가 원샷님의 구글 설문지 생성 자동화 사례글을 읽고 아이디어를 얻었어요.
    쉬운 것부터 차근차근 해보자라는 마음으로..

진행 방법

  • 일단 Claude에게 아래와 같이 명령을 했어요
    "너는 구글 설문지를 만드는 전문가야. 10개의 구글 설문지를 만들어줘. 내용은 과일의 영어 이름을 맞추는 퀴즈 설문지야"

  • 처음에는 Error 발생했어요

9:33:20 PM Error Exception: Questions cannot have duplicate choice values. (anonymous) @ Code.gs:126 createQuiz @ Code.gs:111 (anonymous) @ Code.gs:97 createMultipleFruitQuizzes @ Code.gs:96






  • 오류를 다시 클로드에게 답장을 보냈더니 아래와 같이 답을 해줬어요

오류가 발생했습니다. 중복된 선택지를 방지하기 위해 코드를 수정하겠습니다.

Unique Choices Fruit Quiz Creator

Click to open code

주요 수정사항:

  1. 중복된 선택지 방지 로직 추가

  2. 선택지 생성 시 중복 체크 메커니즘 구현

  3. 부족한 선택지는 고유한 추가 옵션으로 채움

  4. 과일 데이터에 고유한 오답 추가

실행 방법은 이전과 동일합니다:

  1. 새 앱스크립트 프로젝트 생성

  2. 코드 복사하여 붙여넣기

  3. 저장 후 'createMultipleFruitQuizzes' 함수 실행

  4. 권한 허용

이제 중복된 선택지 문제가 해결되었습니다. 퀴즈 생성 중 오류가 발생하지 않을 것입니다. 추가로 수정이 필요하다면 알려주세요!

function createMultipleFruitQuizzes() {
  // 과일 데이터베이스 생성 (중복 선택지 제거)
  const fruitDB = {
    basic: [
      ['사과', 'Apple', 'Aple', 'Appel', 'Core'],
      ['바나나', 'Banana', 'Yellow', 'Curved', 'Soft'],
      ['오렌지', 'Orange', 'Citrus', 'Round', 'Sweet'],
      ['포도', 'Grape', 'Purple', 'Small', 'Cluster'],
      ['딸기', 'Strawberry', 'Red', 'Sweet', 'Berry']
    ],
    tropical: [
      ['망고', 'Mango', 'Yellow', 'Tropical', 'Soft'],
      ['파인애플', 'Pineapple', 'Spiky', 'Tropical', 'Yellow'],
      ['코코넛', 'Coconut', 'Hard', 'Brown', 'Palm'],
      ['파파야', 'Papaya', 'Green', 'Soft', 'Tropical'],
      ['구아바', 'Guava', 'Green', 'Small', 'Sweet']
    ],
    berries: [
      ['블루베리', 'Blueberry', 'Blue', 'Small', 'Sweet'],
      ['라즈베리', 'Raspberry', 'Red', 'Soft', 'Summer'],
      ['블랙베리', 'Blackberry', 'Dark', 'Sweet', 'Wild'],
      ['크랜베리', 'Cranberry', 'Tart', 'Red', 'Juice'],
      ['전체딸기', 'Strawberry', 'Heart', 'Sweet', 'Red']
    ],
    citrus: [
      ['레몬', 'Lemon', 'Sour', 'Yellow', 'Juice'],
      ['라임', 'Lime', 'Green', 'Sour', 'Small'],
      ['자몽', 'Grapefruit', 'Pink', 'Sour', 'Large'],
      ['귤', 'Tangerine', 'Orange', 'Small', 'Sweet'],
      ['추가오렌지', 'Orange', 'Juice', 'Round', 'Vitamin']
    ],
    exotic: [
      ['드래곤프룻', 'Dragon Fruit', 'Pink', 'Exotic', 'Seeds'],
      ['두리안', 'Durian', 'Spiky', 'Smell', 'Large'],
      ['리치', 'Lychee', 'White', 'Sweet', 'Small'],
      ['패션프룻', 'Passion Fruit', 'Purple', 'Seeds', 'Tropical'],
      ['람부탄', 'Rambutan', 'Hairy', 'Red', 'Sweet']
    ]
  };

  // 퀴즈 설정 배열
  const quizSettings = [
    {
      title: '기초 과일 영어 퀴즈',
      description: '가장 기본적인 과일들의 영어 이름을 배워봅시다!',
      fruits: fruitDB.basic
    },
    {
      title: '열대 과일 영어 퀴즈',
      description: '열대 과일들의 영어 이름을 알아보아요!',
      fruits: fruitDB.tropical
    },
    {
      title: '베리류 과일 영어 퀴즈',
      description: '다양한 베리류 과일들의 영어 이름을 공부해봅시다!',
      fruits: fruitDB.berries
    },
    {
      title: '상큼한 시트러스 과일 퀴즈',
      description: '새콤달콤한 시트러스 계열 과일들의 영어 이름을 맞춰보세요!',
      fruits: fruitDB.citrus
    },
    {
      title: '이국적인 과일 영어 퀴즈',
      description: '특별하고 이국적인 과일들의 영어 이름에 도전해보세요!',
      fruits: fruitDB.exotic
    },
    {
      title: '과일 영어 종합 퀴즈 Level 1',
      description: '다양한 과일들의 영어 이름을 테스트합니다! (초급)',
      fruits: [...fruitDB.basic, ...fruitDB.tropical].slice(0, 5)
    },
    {
      title: '과일 영어 종합 퀴즈 Level 2',
      description: '다양한 과일들의 영어 이름을 테스트합니다! (중급)',
      fruits: [...fruitDB.berries, ...fruitDB.citrus].slice(0, 5)
    },
    {
      title: '과일 영어 종합 퀴즈 Level 3',
      description: '다양한 과일들의 영어 이름을 테스트합니다! (고급)',
      fruits: [...fruitDB.exotic, ...fruitDB.tropical].slice(0, 5)
    },
    {
      title: '과일 영어 마스터 도전',
      description: '모든 종류의 과일 영어 이름에 도전하세요! (최상급)',
      fruits: [...fruitDB.exotic, ...fruitDB.citrus, ...fruitDB.berries].slice(0, 5)
    },
    {
      title: '오늘의 랜덤 과일 퀴즈',
      description: '무작위로 선택된 과일들의 영어 이름을 맞춰보세요!',
      fruits: shuffleArray([...fruitDB.basic, ...fruitDB.tropical, ...fruitDB.berries, ...fruitDB.citrus, ...fruitDB.exotic]).slice(0, 5)
    }
  ];

  // 각 퀴즈 생성
  quizSettings.forEach(function(setting) {
    createQuiz(setting);
  });
}

function createQuiz(setting) {
  // 새로운 폼 생성
  var form = FormApp.create(setting.title);
  
  // 퀴즈 설정
  form.setIsQuiz(true)
      .setTitle(setting.title)
      .setDescription(setting.description);
  
  // 각 과일에 대한 문제 생성
  setting.fruits.forEach(function(fruit) {
    var question = form.addMultipleChoiceItem();
    
    // 선택지 생성 (중복 방지)
    var choices = [
      question.createChoice(fruit[1], true)  // 정답
    ];
    
    // 오답 추가 (고유한 값만)
    var wrongChoices = [fruit[2], fruit[3], fruit[4]];
    wrongChoices.forEach(function(wrongChoice) {
      // 중복 체크
      if (!choices.some(function(choice) { 
        return choice.getValue() === wrongChoice; 
      })) {
        choices.push(question.createChoice(wrongChoice, false));
      }
    });
    
    // 부족한 경우 추가 오답 생성
    while (choices.length < 4) {
      var additionalWrong = getUniqueWrongChoice(choices);
      choices.push(question.createChoice(additionalWrong, false));
    }
    
    // 선택지 섞기
    choices = shuffleArray(choices);
    
    // 문제 설정
    question.setTitle('다음 과일의 영어 이름으로 올바른 것은? : ' + fruit[0])
           .setPoints(1)
           .setChoices(choices)
           .setHelpText('정답은 "' + fruit[1] + '" 입니다!');
  });
  
  // 퀴즈 설정
  form.setCollectEmail(true)
      .setLimitOneResponsePerUser(true)
      .setPublishingSummary(true);
      
  Logger.log(setting.title + ' 생성 완료! URL: ' + form.getPublishedUrl());
}

// 고유한 잘못된 선택지 생성 함수
function getUniqueWrongChoice(existingChoices) {
  var wrongOptions = [
    'Sweet', 'Sour', 'Round', 'Green', 'Yellow', 
    'Red', 'Blue', 'Soft', 'Hard', 'Tropical'
  ];
  
  // 기존 선택지와 중복되지 않는 값 찾기
  for (var i = 0; i < wrongOptions.length; i++) {
    if (!existingChoices.some(function(choice) { 
      return choice.getValue() === wrongOptions[i]; 
    })) {
      return wrongOptions[i];
    }
  }
  
  // 모든 옵션 사용 시 랜덤 문자열 반환
  return 'Option_' + Math.random().toString(36).substr(2, 5);
}

// 배열을 섞는 함수
function shuffleArray(array) {
  var arrayCopy = array.slice();
  for (var i = arrayCopy.length - 1; i > 0; i--) {
    var j = Math.floor(Math.random() * (i + 1));
    var temp = arrayCopy[i];
    arrayCopy[i] = arrayCopy[j];
    arrayCopy[j] = temp;
  }
  return arrayCopy;
}

  • 😀 아래는 앱스크립트가 생성해준 구글 설문지 URL 입니다.
    단계별로 만들어줬어요. 정말 신기합니다.

  • 9:35:50 PM

    Info

    기초 과일 영어 퀴즈 생성 완료! URL: https://docs.google.com/forms/d/e/1FAIpQLScn1cqx5C0p7xu_Avs42cunnnwWjR5jhqbHHfyA1SRJwIukqg/viewform

    9:35:56 PM

    Info

    열대 과일 영어 퀴즈 생성 완료! URL: https://docs.google.com/forms/d/e/1FAIpQLSdOOeBIjYxdoJTlZA6YAxGNouBUd8oGwyLFC22Jdn3MVTAOzw/viewform

    9:36:02 PM

    Info

    베리류 과일 영어 퀴즈 생성 완료! URL: https://docs.google.com/forms/d/e/1FAIpQLSfV7b_wsFMvD6k7kvKbEjWgT86clSkMwugVveQHITcRZUuQ6Q/viewform

    9:36:09 PM

    Info

    상큼한 시트러스 과일 퀴즈 생성 완료! URL: https://docs.google.com/forms/d/e/1FAIpQLSch6WFOX9qUJzy5Y6IpQLqy3Bg2hDHXy2Ueqvh2HK5V0jUWaQ/viewform

    9:36:15 PM

    Info

    이국적인 과일 영어 퀴즈 생성 완료! URL: https://docs.google.com/forms/d/e/1FAIpQLSfr9i_haxyPFOX3FPvL8lGN0RoDH8NUd3Uywp0RLnXpvCHvQw/viewform

    9:36:22 PM

    Info

    과일 영어 종합 퀴즈 Level 1 생성 완료! URL: https://docs.google.com/forms/d/e/1FAIpQLSdkMUxdrWcYb3UUys2eVMdSRndcRE07UlQ6g5mo9oHONIwEQA/viewform

    9:36:28 PM

    Info

    과일 영어 종합 퀴즈 Level 2 생성 완료! URL: https://docs.google.com/forms/d/e/1FAIpQLSfR97b86-BS6eUe_q2R-QCjeRpPrT0BXqlni27_bWKgC6SBPw/viewform

    9:36:33 PM

    Info

    과일 영어 종합 퀴즈 Level 3 생성 완료! URL: https://docs.google.com/forms/d/e/1FAIpQLSeMx-axcnbRq9kEeDA9H77fb4Ty84GxkMJuLotd6BTMmzjAYg/viewform

    9:36:39 PM

    Info

    과일 영어 마스터 도전 생성 완료! URL: https://docs.google.com/forms/d/e/1FAIpQLSf2NDJgPYs4JeALnXgSPD9BFSZUz5nodEq5_0V7oKcA9mabXw/viewform

    9:36:44 PM

    Info

    오늘의 랜덤 과일 퀴즈 생성 완료! URL: https://docs.google.com/forms/d/e/1FAIpQLSeNL-1wdMu5IS-3AG97AeLfOSkEHwEUlXNdTs_V37NdaZIkug/viewform

    9:36:44 PM

    Notice

    Execution completed

결과와 배운 점

‎​(내용 입력) 실패는 성공의 어머니라는 말이 맞아요 ^^

미리보기에서 보면 정답 해설이 이미 보이는 것이 흠인데요.

클로드에서 다시 "정답 해설이 안 보이게 해줘"라고 질문했더니 무료 한도에 달해서 프로로 업그레이드 해라 하는 멘트가 뜨네요 😂

Your message will exceed the length limit for this chat. Try shortening your message or starting a new conversation. Or consider upgrading to Claude Pro.

도움 받은 글 (옵션)

‎​(내용 입력) 원샷님의 (아장 아장 아이(AI)의 설문지 자동화 1단계 성공담: 오~ 예!!!)구글 설문지 생성 자동화 그리고 조현정 방장님의 사례가 도움이 되었습니다.

1

👉 이 게시글도 읽어보세요