구글폼 선착순 모집 자동 마감하기 (앱스 스크립트 활용)

✨ 소개

1주차인가 2주차 후토크 때 에듀테크 버디이신 테크권님께서 앱스스크립트로 이런것까지 할수있다~고 소개해주시면서 구글폼 자동 마감도 가능하다는 이야기를 듣고 시도해보았습니다!

인기 있는 교육 프로그램을 모집할 때 구글폼을 자주 사용합니다.
하지만 정원이 100명일 경우, 몇 분 만에 마감되어버려 수동으로 폼을 닫으려다 보면 정원 초과로 3~5명이 더 접수되는 문제가 종종 발생했습니다. 🤣🤣💦

이를 해결하기 위해 구글폼 + 앱스 스크립트를 활용해 자동으로 마감되도록 구현해 보았습니다. 추가로, 구글폼 항목 중 사진 제출 부분이 있는데 미제출자에게 선착순 마감 후 안내 메일 발송하는 것까지 자동화하는 것을 목표로 진행했습니다.

테스트는 정원 3명으로 설정하여 진행했습니다.

🛠️사용 도구

  • Google Forms

  • Google Apps Script

  • Gemini (보조 아이디어 및 코드 개선 확인용)

▶️ 진행 방법

  1. 먼저, 구글폼을 만들고 그 링크를 주면서 제미나이에게 앱스 스크립트를 작성해달라고 요청했습니다.

    한국어 텍스트가있는 검은 색 화면

  2. 제미나이가 알려준 방식대로 구글폼 > 우측 상단의 더보기 (⋮) 아이콘을 클릭한 후 스크립트 편집기 열기

  3. 코드붙여 넣기 및 트리거 설정하기

    한국 텍스트가 강조된 코드 편집기

    웹 페이지의 한국어 설정 스크린 샷

  1. 구글폼 답변 제출하여 테스트

    => 선착순 마감은 반은 성공, 사진 미제출자 이메일 발송은 실패 ㅠㅠ

    => 테스트 시 정원 3명으로 설정 후, 2명이 응답한 상태에서 2명이 동시에 제출하면 결과적으로 4명이 접수되는 문제가 있었습니다.

    => 사진 미제출자 안내 메일 발송은 앱스 스크립트에서 따로 오류는 없었는데, 메일 발송이 안되었습니다. (제미나이한테 계속 물어보면서 해결해보려 했지만 안돼서 우선 보류...)

앱스 스크립트 코드

// 여기에 직접 작성하신 코드 붙여주세요
/**
 * @OnlyCurrentDoc
 * 이 스크립트는 구글 설문지에 연결되어 사용됩니다.
 */

// 설문지 제출 시 자동으로 실행될 메인 함수
function onFormSubmitTrigger() {
  const form = FormApp.getActiveForm();
  const responses = form.getResponses();
  const limit = 3; // 선착순 마감 인원 설정

  // 현재까지 제출된 응답 수가 설정된 인원 이상인지 확인
  if (responses.length >= limit) {
    // 설문지를 비활성화하여 더 이상 응답을 받지 않도록 설정
    form.setAcceptingResponses(false);
    Logger.log(`총 ${responses.length}개의 응답이 있어 설문지를 마감합니다.`);
    
    // 마감 후 사진 미제출자에게 안내 메일 발송 함수 호출
    sendEmailToPhotoNotSubmitted();
  }
}

// 사진을 제출하지 않은 응답자에게 안내 메일을 발송하는 함수
function sendEmailToPhotoNotSubmitted() {
  const form = FormApp.getActiveForm();
  const responses = form.getResponses();
  
  // 설문지에서 '사진'이라는 질문 항목의 제목을 정확하게 입력해야 합니다.
  // 만약 질문이 다르다면 아래 '사진' 부분을 실제 질문 제목으로 수정해주세요.
  const photoQuestionTitle = '사진'; 
  
  const emailSubject = '코딩 클래스 사진 제출 안내';
  
  // 모든 응답을 하나씩 확인
  responses.forEach(response => {
    const respondentEmail = response.getRespondentEmail();
    let photoSubmitted = false;
    
    // 응답 항목들을 확인
    const itemResponses = response.getItemResponses();
    itemResponses.forEach(itemResponse => {
      // 질문 제목이 '사진'과 일치하는 항목을 찾음
      if (itemResponse.getItem().getTitle() === photoQuestionTitle) {
        // 응답이 비어있지 않다면 사진이 제출된 것으로 간주
        if (itemResponse.getResponse() && itemResponse.getResponse().length > 0) {
          photoSubmitted = true;
        }
      }
    });
    
    // 유효한 이메일 주소가 있고, 사진이 제출되지 않았다면 메일 발송
    if (respondentEmail && !photoSubmitted) {
      const emailBody = `
        안녕하세요, 코딩 클래스에 신청해주셔서 감사합니다.
        
        신청서에 사진이 제출되지 않은 것을 확인했습니다.
        원활한 클래스 진행을 위해 빠른 시일 내에 사진 제출을 부탁드립니다.

        감사합니다.
      `;
      
      try {
        MailApp.sendEmail(respondentEmail, emailSubject, emailBody);
        Logger.log(`${respondentEmail} 주소로 사진 미제출 안내 메일을 발송했습니다.`);
      } catch (e) {
        Logger.log(`${respondentEmail} 주소로 메일 발송에 실패했습니다: ${e.toString()}`);
      }
    }
  });
}


결과와 배운 점

  • 선착순 마감 정교화와 사진 미제출자 안내 메일 발송하는 부분을 조금 더 수정해서 꼭 성공해보고 싶습니다!!!


1
2개의 답글

👉 이 게시글도 읽어보세요