GoogleSpreadSheet에서 GoogleForm을 만드는 GAS
                                            
                                                
                                                
                                                
                                                
                                                
                                                 17313 단어  googleformGoogleSpreadSheetgas
                    
개요
선택사항이나 섹션이 많은 설문지를 Form에서 편집하면서 만드는 것은 번거롭고, 실수가 발생하기 쉽다고 생각했으므로, SpreadSheet의 정보를 바탕으로 생성할 수 있는 툴을 개발했습니다.
 실현할 수 있는 일
1프로그래밍을 할 수 없는 유저가 사용하는 것을 상정해, 필요한 변수는 SpreadSheet로부터 읽어들이도록(듯이) 하고 있습니다
2 설명식 (메일 주소 형식도 설정 가능), 라디오 버튼, 체크 박스, 풀다운을 설정할 수 있습니다
3 필수로 할지를 선택할 수 있습니다
4 라디오 버튼, 체크 박스의 경우, 텍스트 박스로 입력할 수 있도록 할 수 있습니다
5 질문에 섹션을 설정할 수 있습니다.
6 원칙, Form은 SpreadSheet가있는 드라이브에 저장되지만 대상을 설정할 수 있습니다.
 실현되지 않은 것
1 회답에 따라 섹션을 분기시킬 수 없었습니다. 루프 처리를 돌릴 때의 처리가 너무 복잡해져 구현이 어려웠습니다. 필요한 경우에는 완성된 양식을 손으로 수정해야 합니다.
2 Form 헤더에의 이미지 삽입, 그리드 형식의 질문 등은 직장에서의 수요가 없었기 때문에 구현하고 있지 않습니다. 요청이 있으면 별도로 개발해 보겠습니다.
 SpreadSheet 화면 이미지
1 질문을 입력하는 표
 
2 선택을 입력하는 표
 
3 양식의 저장 위치를 입력하는 표
이쪽은 공백이라도 상관 없습니다.
 
 소스 코드
const createEventForm = (e) => {
  // 質問シート情報の取得
  const ss = SpreadsheetApp.getActiveSpreadsheet()
  const q_data = ss.getSheetByName('質問').getDataRange().getValues();
  const q_lastrow = ss.getSheetByName('質問').getLastRow();
  // 質問が1問も設定されていない場合、処理を終了する
  if (q_lastrow < 3) {
    Browser.msgBox("スプレッドシートには最低1問以上、質問を入力してください。",
                   Browser.Buttons.OK_CANCEL);
    return;
  }
  // タイトルと説明の設定
  const title = q_data[0][1]; //タイトル
  if (title == "") {
    Browser.msgBox("フォームの名称を入力してください。", 
                   Browser.Buttons.OK_CANCEL);
    return;
  }
  const form = setHeader(title);
  // 選択肢シート情報の取得
  const s_data = ss.getSheetByName('選択肢').getDataRange().getValues();
  s_data.shift()
 // 質問の設定
  let j = 0; // 選択肢の列番号
  let selections = null;
  let section_prev = null;
  for (let i = 2; i < q_lastrow; i++) {     
    // セクションの切り替えを行う
    if(q_data[i][0] != section_prev && section_prev !== null) {
      form.addPageBreakItem().setTitle(q_data[i][0]);
    }
    section_prev = q_data[i][0];
    if (q_data[i][1] == 'ラジオボタン' || 
        q_data[i][1] == 'チェックボックス' || 
        q_data[i][1] == 'プルダウン') {
      selections = getSelections(s_data, j);
      if (!selections.length) {
        Browser.msgBox("質問に対応する選択肢を入力してください。", 
                       Browser.Buttons.OK_CANCEL);
        return;        
      }
    }
    // B列に指定した入力した内容に応じてフォームに入力項目を追加する
    if (q_data[i][1] == '記述式') {
      setTextQuestion(form, q_data[i][2], q_data[i][3], Boolean(q_data[i][4]));
    } else if (q_data[i][1] == 'メールアドレス') {
      setMail(form, q_data[i][2], q_data[i][3], Boolean(q_data[i][4]))
    } else if (q_data[i][1] == 'ラジオボタン') {
      setRadiobutton(form, q_data[i][2], q_data[i][3], 
                     Boolean(q_data[i][4]), Boolean(q_data[i][5]), selections);
      j++;
    } else if (q_data[i][1] == 'チェックボックス') {
      setCheckbox(form, q_data[i][2], q_data[i][3], 
                  Boolean(q_data[i][4]), Boolean(q_data[i][5]), selections);
      j++;
    } else if (q_data[i][1] == 'プルダウン') {
      setDropdownlist(form, q_data[i][2], q_data[i][3], 
                      Boolean(q_data[i][4]), selections);
      j++;
    }      
  }
  // フォームの移動
  let dest = ss.getSheetByName('移動先').getRange(1, 2).getValue();
  if (dest) {
    dest = dest.replace('https://drive.google.com/drive/folders/', '')
    moveForm(form, dest);
  }
  Browser.msgBox("フォームの作成が完了しました。", Browser.Buttons.OK_CANCEL);
  return;
}
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Reference
                            
                            이 문제에 관하여(GoogleSpreadSheet에서 GoogleForm을 만드는 GAS), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://qiita.com/hirovirgo24/items/80b1795045550c43bd9d
                            
                            
                            
                                텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                            
                            
                                
                                
                                 우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
1프로그래밍을 할 수 없는 유저가 사용하는 것을 상정해, 필요한 변수는 SpreadSheet로부터 읽어들이도록(듯이) 하고 있습니다
2 설명식 (메일 주소 형식도 설정 가능), 라디오 버튼, 체크 박스, 풀다운을 설정할 수 있습니다
3 필수로 할지를 선택할 수 있습니다
4 라디오 버튼, 체크 박스의 경우, 텍스트 박스로 입력할 수 있도록 할 수 있습니다
5 질문에 섹션을 설정할 수 있습니다.
6 원칙, Form은 SpreadSheet가있는 드라이브에 저장되지만 대상을 설정할 수 있습니다.
실현되지 않은 것
1 회답에 따라 섹션을 분기시킬 수 없었습니다. 루프 처리를 돌릴 때의 처리가 너무 복잡해져 구현이 어려웠습니다. 필요한 경우에는 완성된 양식을 손으로 수정해야 합니다.
2 Form 헤더에의 이미지 삽입, 그리드 형식의 질문 등은 직장에서의 수요가 없었기 때문에 구현하고 있지 않습니다. 요청이 있으면 별도로 개발해 보겠습니다.
 SpreadSheet 화면 이미지
1 질문을 입력하는 표
 
2 선택을 입력하는 표
 
3 양식의 저장 위치를 입력하는 표
이쪽은 공백이라도 상관 없습니다.
 
 소스 코드
const createEventForm = (e) => {
  // 質問シート情報の取得
  const ss = SpreadsheetApp.getActiveSpreadsheet()
  const q_data = ss.getSheetByName('質問').getDataRange().getValues();
  const q_lastrow = ss.getSheetByName('質問').getLastRow();
  // 質問が1問も設定されていない場合、処理を終了する
  if (q_lastrow < 3) {
    Browser.msgBox("スプレッドシートには最低1問以上、質問を入力してください。",
                   Browser.Buttons.OK_CANCEL);
    return;
  }
  // タイトルと説明の設定
  const title = q_data[0][1]; //タイトル
  if (title == "") {
    Browser.msgBox("フォームの名称を入力してください。", 
                   Browser.Buttons.OK_CANCEL);
    return;
  }
  const form = setHeader(title);
  // 選択肢シート情報の取得
  const s_data = ss.getSheetByName('選択肢').getDataRange().getValues();
  s_data.shift()
 // 質問の設定
  let j = 0; // 選択肢の列番号
  let selections = null;
  let section_prev = null;
  for (let i = 2; i < q_lastrow; i++) {     
    // セクションの切り替えを行う
    if(q_data[i][0] != section_prev && section_prev !== null) {
      form.addPageBreakItem().setTitle(q_data[i][0]);
    }
    section_prev = q_data[i][0];
    if (q_data[i][1] == 'ラジオボタン' || 
        q_data[i][1] == 'チェックボックス' || 
        q_data[i][1] == 'プルダウン') {
      selections = getSelections(s_data, j);
      if (!selections.length) {
        Browser.msgBox("質問に対応する選択肢を入力してください。", 
                       Browser.Buttons.OK_CANCEL);
        return;        
      }
    }
    // B列に指定した入力した内容に応じてフォームに入力項目を追加する
    if (q_data[i][1] == '記述式') {
      setTextQuestion(form, q_data[i][2], q_data[i][3], Boolean(q_data[i][4]));
    } else if (q_data[i][1] == 'メールアドレス') {
      setMail(form, q_data[i][2], q_data[i][3], Boolean(q_data[i][4]))
    } else if (q_data[i][1] == 'ラジオボタン') {
      setRadiobutton(form, q_data[i][2], q_data[i][3], 
                     Boolean(q_data[i][4]), Boolean(q_data[i][5]), selections);
      j++;
    } else if (q_data[i][1] == 'チェックボックス') {
      setCheckbox(form, q_data[i][2], q_data[i][3], 
                  Boolean(q_data[i][4]), Boolean(q_data[i][5]), selections);
      j++;
    } else if (q_data[i][1] == 'プルダウン') {
      setDropdownlist(form, q_data[i][2], q_data[i][3], 
                      Boolean(q_data[i][4]), selections);
      j++;
    }      
  }
  // フォームの移動
  let dest = ss.getSheetByName('移動先').getRange(1, 2).getValue();
  if (dest) {
    dest = dest.replace('https://drive.google.com/drive/folders/', '')
    moveForm(form, dest);
  }
  Browser.msgBox("フォームの作成が完了しました。", Browser.Buttons.OK_CANCEL);
  return;
}
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Reference
                            
                            이 문제에 관하여(GoogleSpreadSheet에서 GoogleForm을 만드는 GAS), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://qiita.com/hirovirgo24/items/80b1795045550c43bd9d
                            
                            
                            
                                텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                            
                            
                                
                                
                                 우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
1 질문을 입력하는 표

2 선택을 입력하는 표

3 양식의 저장 위치를 입력하는 표
이쪽은 공백이라도 상관 없습니다.

소스 코드
const createEventForm = (e) => {
  // 質問シート情報の取得
  const ss = SpreadsheetApp.getActiveSpreadsheet()
  const q_data = ss.getSheetByName('質問').getDataRange().getValues();
  const q_lastrow = ss.getSheetByName('質問').getLastRow();
  // 質問が1問も設定されていない場合、処理を終了する
  if (q_lastrow < 3) {
    Browser.msgBox("スプレッドシートには最低1問以上、質問を入力してください。",
                   Browser.Buttons.OK_CANCEL);
    return;
  }
  // タイトルと説明の設定
  const title = q_data[0][1]; //タイトル
  if (title == "") {
    Browser.msgBox("フォームの名称を入力してください。", 
                   Browser.Buttons.OK_CANCEL);
    return;
  }
  const form = setHeader(title);
  // 選択肢シート情報の取得
  const s_data = ss.getSheetByName('選択肢').getDataRange().getValues();
  s_data.shift()
 // 質問の設定
  let j = 0; // 選択肢の列番号
  let selections = null;
  let section_prev = null;
  for (let i = 2; i < q_lastrow; i++) {     
    // セクションの切り替えを行う
    if(q_data[i][0] != section_prev && section_prev !== null) {
      form.addPageBreakItem().setTitle(q_data[i][0]);
    }
    section_prev = q_data[i][0];
    if (q_data[i][1] == 'ラジオボタン' || 
        q_data[i][1] == 'チェックボックス' || 
        q_data[i][1] == 'プルダウン') {
      selections = getSelections(s_data, j);
      if (!selections.length) {
        Browser.msgBox("質問に対応する選択肢を入力してください。", 
                       Browser.Buttons.OK_CANCEL);
        return;        
      }
    }
    // B列に指定した入力した内容に応じてフォームに入力項目を追加する
    if (q_data[i][1] == '記述式') {
      setTextQuestion(form, q_data[i][2], q_data[i][3], Boolean(q_data[i][4]));
    } else if (q_data[i][1] == 'メールアドレス') {
      setMail(form, q_data[i][2], q_data[i][3], Boolean(q_data[i][4]))
    } else if (q_data[i][1] == 'ラジオボタン') {
      setRadiobutton(form, q_data[i][2], q_data[i][3], 
                     Boolean(q_data[i][4]), Boolean(q_data[i][5]), selections);
      j++;
    } else if (q_data[i][1] == 'チェックボックス') {
      setCheckbox(form, q_data[i][2], q_data[i][3], 
                  Boolean(q_data[i][4]), Boolean(q_data[i][5]), selections);
      j++;
    } else if (q_data[i][1] == 'プルダウン') {
      setDropdownlist(form, q_data[i][2], q_data[i][3], 
                      Boolean(q_data[i][4]), selections);
      j++;
    }      
  }
  // フォームの移動
  let dest = ss.getSheetByName('移動先').getRange(1, 2).getValue();
  if (dest) {
    dest = dest.replace('https://drive.google.com/drive/folders/', '')
    moveForm(form, dest);
  }
  Browser.msgBox("フォームの作成が完了しました。", Browser.Buttons.OK_CANCEL);
  return;
}
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Reference
                            
                            이 문제에 관하여(GoogleSpreadSheet에서 GoogleForm을 만드는 GAS), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://qiita.com/hirovirgo24/items/80b1795045550c43bd9d
                            
                            
                            
                                텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                            
                            
                                
                                
                                 우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
const createEventForm = (e) => {
  // 質問シート情報の取得
  const ss = SpreadsheetApp.getActiveSpreadsheet()
  const q_data = ss.getSheetByName('質問').getDataRange().getValues();
  const q_lastrow = ss.getSheetByName('質問').getLastRow();
  // 質問が1問も設定されていない場合、処理を終了する
  if (q_lastrow < 3) {
    Browser.msgBox("スプレッドシートには最低1問以上、質問を入力してください。",
                   Browser.Buttons.OK_CANCEL);
    return;
  }
  // タイトルと説明の設定
  const title = q_data[0][1]; //タイトル
  if (title == "") {
    Browser.msgBox("フォームの名称を入力してください。", 
                   Browser.Buttons.OK_CANCEL);
    return;
  }
  const form = setHeader(title);
  // 選択肢シート情報の取得
  const s_data = ss.getSheetByName('選択肢').getDataRange().getValues();
  s_data.shift()
 // 質問の設定
  let j = 0; // 選択肢の列番号
  let selections = null;
  let section_prev = null;
  for (let i = 2; i < q_lastrow; i++) {     
    // セクションの切り替えを行う
    if(q_data[i][0] != section_prev && section_prev !== null) {
      form.addPageBreakItem().setTitle(q_data[i][0]);
    }
    section_prev = q_data[i][0];
    if (q_data[i][1] == 'ラジオボタン' || 
        q_data[i][1] == 'チェックボックス' || 
        q_data[i][1] == 'プルダウン') {
      selections = getSelections(s_data, j);
      if (!selections.length) {
        Browser.msgBox("質問に対応する選択肢を入力してください。", 
                       Browser.Buttons.OK_CANCEL);
        return;        
      }
    }
    // B列に指定した入力した内容に応じてフォームに入力項目を追加する
    if (q_data[i][1] == '記述式') {
      setTextQuestion(form, q_data[i][2], q_data[i][3], Boolean(q_data[i][4]));
    } else if (q_data[i][1] == 'メールアドレス') {
      setMail(form, q_data[i][2], q_data[i][3], Boolean(q_data[i][4]))
    } else if (q_data[i][1] == 'ラジオボタン') {
      setRadiobutton(form, q_data[i][2], q_data[i][3], 
                     Boolean(q_data[i][4]), Boolean(q_data[i][5]), selections);
      j++;
    } else if (q_data[i][1] == 'チェックボックス') {
      setCheckbox(form, q_data[i][2], q_data[i][3], 
                  Boolean(q_data[i][4]), Boolean(q_data[i][5]), selections);
      j++;
    } else if (q_data[i][1] == 'プルダウン') {
      setDropdownlist(form, q_data[i][2], q_data[i][3], 
                      Boolean(q_data[i][4]), selections);
      j++;
    }      
  }
  // フォームの移動
  let dest = ss.getSheetByName('移動先').getRange(1, 2).getValue();
  if (dest) {
    dest = dest.replace('https://drive.google.com/drive/folders/', '')
    moveForm(form, dest);
  }
  Browser.msgBox("フォームの作成が完了しました。", Browser.Buttons.OK_CANCEL);
  return;
}
Reference
이 문제에 관하여(GoogleSpreadSheet에서 GoogleForm을 만드는 GAS), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hirovirgo24/items/80b1795045550c43bd9d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)