GAS에서 GoogleFrom 선택사항을 동적으로 표시
15399 단어 googleformGoogleAppsScriptgas
평소에는 비즈니스 버전 매칭 앱 yenta에서 커뮤니티 관리자로 일하고 있습니다.
소개
이번에는 이벤트 신청 양식 등에 사용할 수 있는 GAS 구현을 소개합니다.
이벤트를 연일 개최하는 경우, 각 일정에 정원이 있어 만석이 된 일정을 선택사항을 지워가는 것을 해 나가고 싶습니다.
일정마다 GoogleForm을 준비하고 만석이 되면 양식을 닫도록 하는 등 다른 방법도 있습니다만,
1개의 폼으로 관리할 수 있게 되므로 참고로 해 주시면 다행입니다.
할 일
이하의 순서로 해설해 갑니다.
이하의 순서로 해설해 갑니다.
일정 및 정원의 마스터 데이터 작성
다음과 같은 스프레드시트 파일을 준비합니다.
- 시트 이름을 '마스터'
- 일정과 정원을 아래와 같이 기입
Google 양식 만들기
스크립트 편집기로 GAS 편집
답변 스프레드시트 준비
아래 버튼에서 답변용 스프레드시트 만들기
답변 시트의 이름을 '양식 답변'으로 변경
사용할 변수 설명
※
d/
와 /edit
사이의 xxx 가 spreadSheetIDGAS
//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 설문지에서 답변 수를 제한하는 방법
Reference
이 문제에 관하여(GAS에서 GoogleFrom 선택사항을 동적으로 표시), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/_xAGAx_/items/9bf13b020cb605908cf5
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Google Form을 편리하게 만드는 방법을 소개했습니다.
정원이 있는 이벤트를 복수 일정 개최하고 있는 분 등은 GAS를 사용해 효율적으로 관리해 보는 것은 어떻습니까?
참고로 한 사례로서 라디오 버튼으로 비슷한 일을 하고 있는 기사가 있었습니다.
Google 설문지에서 답변 수에 따라 선택사항 변경
Google 설문지에서 답변 수를 제한하는 방법
Reference
이 문제에 관하여(GAS에서 GoogleFrom 선택사항을 동적으로 표시), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/_xAGAx_/items/9bf13b020cb605908cf5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)