GoogleSpreadSheet에서 GoogleForm을 만드는 GAS

개요



선택사항이나 섹션이 많은 설문지를 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;
}

좋은 웹페이지 즐겨찾기