GAS에서 GoogleFrom 선택사항을 동적으로 표시

Atrae Advent Calendar 2020 의 7일째를 담당하는 아가츠마입니다.
평소에는 비즈니스 버전 매칭 앱 yenta에서 커뮤니티 관리자로 일하고 있습니다.

소개



이번에는 이벤트 신청 양식 등에 사용할 수 있는 GAS 구현을 소개합니다.
이벤트를 연일 개최하는 경우, 각 일정에 정원이 있어 만석이 된 일정을 선택사항을 지워가는 것을 해 나가고 싶습니다.

일정마다 GoogleForm을 준비하고 만석이 되면 양식을 닫도록 하는 등 다른 방법도 있습니다만,
1개의 폼으로 관리할 수 있게 되므로 참고로 해 주시면 다행입니다.

할 일



이하의 순서로 해설해 갑니다.
  • 일정 및 정원의 마스터 데이터 작성
  • 풀다운 선택 항목 설정
  • 양식을 닫는 방법

  • 일정 및 정원의 마스터 데이터 작성



    다음과 같은 스프레드시트 파일을 준비합니다.
    - 시트 이름을 '마스터'
    - 일정과 정원을 아래와 같이 기입



    Google 양식 만들기


  • 선택을 동적으로 하고 싶은 항목을 「풀다운」에
  • 그 항목의 타이틀을 「일정 후보」에


  • 스크립트 편집기로 GAS 편집





    답변 스프레드시트 준비



    아래 버튼에서 답변용 스프레드시트 만들기

    답변 시트의 이름을 '양식 답변'으로 변경


    사용할 변수 설명



    d//edit 사이의 xxx 가 spreadSheetID

    GAS
    //https://docs.google.com/spreadsheets/d/xxx/editのxxxの部分
    //マスター
    var masterSpreadSheetID = 'xxx';
    //回答用
    var answerSpreadSheetID = 'yyy';
    
    // シート名
    var masterSheetName = 'マスター';
    var answerSheetName = 'フォームの回答';
    
    // 選択肢を動的にするプルダウンのタイトル
    var questionName = '日程候補';
    

    시트에서 정원 로드



    GAS
      // スプレッドシートIDでシートを取得
      var masterSheets = SpreadsheetApp.openById(masterSpreadSheetID);
      var masterSheet = masterSheets.getSheetByName(masterSheetName);
    
      var answerSheets = SpreadsheetApp.openById(answerSpreadSheetID);
      var answerSheet = answerSheets.getSheetByName(answerSheetName);
    
      // マスターシートのA行の2行目から下の値を配列で取得
      var sheetLastRow = sheet.getLastRow();
      if (sheetLastRow > 1) {
        var candidate = sheet.getRange(2, 1, sheetLastRow - 1, 2).getValues();
      } else {
        return;
      }
    
      // 回答シートの状況も取得(A行の2行目から)
      var answerSheetLastRow = answerSheet.getLastRow();
      if (answerSheetLastRow > 1) {
        var questionNames = answerSheet.getRange(1, 1, 1, answerSheet.getLastColumn()).getValues();
        var colCount = questionNames[0].indexOf(questionName);    
        var answerData = answerSheet.getRange(2, colCount + 1, answerSheetLastRow - 1).getValues();    
      }
    

    풀다운 옵션 업데이트



    GAS
      // フォーム取得→項目も取得
      var form = FormApp.getActiveForm();
      var item = form.getItems();
    
      // 動的に選択肢を作成
      items.forEach(function(item){
        // 名前が"日程候補"のプルダウンの項目を
        if(item.getTitle() === questionName){
          var listItemQuestion = item.asListItem();
          var choices = [];
    
          candidate.forEach(function(nameAndCapacity){        
            if(nameAndCapacity[0] != ""){
              // 定員が0(null) or 無回答 の場合は選択肢を表示
              if (answerData == null || nameAndCapacity[1] == 0 || nameAndCapacity[1] == ""){
                choices.push(listItemQuestion.createChoice(nameAndCapacity[0]));
              } else {
                var counter = 0;
                // 何人埋まってるか確認
                for(var i = 0; i < answerData.length; i++){
                  if (nameAndCapacity[0] == answerData[i]){
                    counter++;
                  }
                }
                // 埋まってなければ選択肢を表示
                if (counter < nameAndCapacity[1]){
                  choices.push(listItemQuestion.createChoice(nameAndCapacity[0]));
                }
              }
            }
          });
    
          //選択肢の残数によってFormを受け付けるかどうか判断
          if (choices.length > 0) {
            // フォームの回答を受け付ける
            form.setAcceptingResponses(true);
            listItemQuestion.setChoices(choices);
          } else {
            // 回答受付終了
            form.setAcceptingResponses(false);        
          }
          return;
        }
      });
    

    스크립트 트리거 설정



    편집 > 현재 프로젝트 트리거를 선택

    트리거를 추가하고 설정 화면을 엽니다.
    '양식 제출시'에 트리거 설정

    트리거가 추가되었는지 확인


    실행 결과



    스크립트 실행 후



    선택사항이 마스터 데이터와 마찬가지로 3가지


    정원이 묻힌 경우



    2개의 일정이 5회 이상 선택되었을 경우 나머지 1프레임으로 되어 있다


    모든 일정이 채워진 경우



    양식이 닫힙니다.


    결론



    Google Form을 편리하게 만드는 방법을 소개했습니다.
    정원이 있는 이벤트를 복수 일정 개최하고 있는 분 등은 GAS를 사용해 효율적으로 관리해 보는 것은 어떻습니까?

    참고로 한 사례로서 라디오 버튼으로 비슷한 일을 하고 있는 기사가 있었습니다.
    Google 설문지에서 답변 수에 따라 선택사항 변경
    Google 설문지에서 답변 수를 제한하는 방법

    좋은 웹페이지 즐겨찾기