自動で作りたい!と思いますよね。スプレッドシートからある程度は自動で作ってくれるようになっていたようなので、GASを使って作成する手順を書いていきます。
※この記事の内容は、Google Apps Script(GAS)を扱える知識が必要です。
※現段階では、質問による分岐、グリッド式の選択肢は作れません。(そのうち更新したいとは思います…)
手順1 スプレッドシートを作成する
フォームのタイトルや説明、質問事項を記入したスプレッドシートを作成します。
実際の入力例は、以下の通り。
作成したExcelを置いておきます。(スプレッドシートに転記するなどしてお使いください。)
手順2 シートにApp Scriptを記述する
以下のコードをすべて貼り付けます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 |
function createForm() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // フォームのタイトルをB1から取得 const formTitle = sheet.getRange('B1').getDisplayValue(); // フォームの説明をB2から取得 const formDescription = sheet.getRange('B2').getDisplayValue(); const firstRow = 5; const lastRow = sheet.getLastRow(); const dataRows = lastRow - (firstRow - 1); //質問の選択肢は、N列(14)までの最大10個 var questionList = sheet.getRange(firstRow, 1, dataRows, 14).getDisplayValues(); questionList = questionList.map(question => { return { title: question[0], //質問のタイトル helpText: question[1], //質問の説明 type: question[2], //回答の種類 must: question[3], //必須かどうか choices: [question[4], question[5], question[6], question[7], question[8],question[9],question[10],question[11],question[12],question[13]] } }); //フォームのタイトルを設定 const form = FormApp.create(formTitle); //フォームの説明を設定 form.setDescription(formDescription); //以下、質問の種類による分岐 questionList.forEach(question => { if (question.type == '記述式'){ console.log('記述式') var choiceItem = form.addTextItem(); choiceItem.setTitle(question.title) .setHelpText(question.helpText) if (question.must =='必須'){ choiceItem.setRequired(true) } } else if (question.type == '段落'){ console.log('段落') var choiceItem = form.addParagraphTextItem(); choiceItem.setTitle(question.title) .setHelpText(question.helpText) if (question.must =='必須'){ choiceItem.setRequired(true) } } else if (question.type == 'ラジオボタン') { console.log('ラジオボタン') var choiceItem = form.addMultipleChoiceItem(); var choiceList = []; question.choices.forEach((choice) => { if (choice != '') { let choiceObj = choiceItem.createChoice(choice); choiceList.push(choiceObj); } }); choiceItem.setTitle(question.title) .setHelpText(question.helpText) .setChoices(choiceList); if (question.must =='必須'){ choiceItem.setRequired(true) }; } else if (question.type == 'チェックボックス') { console.log('チェックボックス') var choiceItem = form.addCheckboxItem(); var choiceList = []; question.choices.forEach((choice) => { if (choice != '') { let choiceObj = choiceItem.createChoice(choice); choiceList.push(choiceObj); } }); choiceItem.setTitle(question.title) .setHelpText(question.helpText) .setChoices(choiceList); if (question.must =='必須'){ choiceItem.setRequired(true) }; } else if (question.type == 'プルダウン') { console.log('プルダウン') var choiceItem = form.addListItem(); var choiceList = []; question.choices.forEach((choice) => { if (choice != '') { let choiceObj = choiceItem.createChoice(choice); choiceList.push(choiceObj); } }); choiceItem.setTitle(question.title) .setHelpText(question.helpText) .setChoices(choiceList); if (question.must =='必須'){ choiceItem.setRequired(true) }; } else if (question.type == '均等目盛') { console.log('均等目盛') var choiceItem = form.addScaleItem(); var choiceList = []; question.choices.forEach((choice) => { if (choice != '') { choiceList.push(choice); } }); choiceItem.setTitle(question.title) .setHelpText(question.helpText) .setBounds(choiceList[0],choiceList[1]) .setLabels(choiceList[2],choiceList[3]); if (question.must =='必須'){ choiceItem.setRequired(true) }; } else if (question.type == '日付'){ console.log('日付') var choiceItem = form.addDateItem(); choiceItem.setTitle(question.title) .setHelpText(question.helpText) if (question.must =='必須'){ choiceItem.setRequired(true) } } else if (question.type == '時刻'){ console.log('時刻') var choiceItem = form.addTimeItem(); choiceItem.setTitle(question.title) .setHelpText(question.helpText) if (question.must =='必須'){ choiceItem.setRequired(true) } } else if (question.type == '日時'){ console.log('日時') var choiceItem = form.addDateTimeItem(); choiceItem.setTitle(question.title) .setHelpText(question.helpText) if (question.must =='必須'){ choiceItem.setRequired(true) } } else{ Browser.msgBox('「'+ question.title +'」は作成できない問題形式です'); } }); //作成したフォームのアドレスをB3セルに入力 sheet.getRange('B3').setValue(form.getEditUrl()); Browser.msgBox('「' + formTitle + '」の作成が完了しました'); // 作成したフォームを開く var url = form.getPublishedUrl(); var script = "<script>window.open('" + url + "', '_blank').focus()</script>"; var html = HtmlService.createHtmlOutput(script); SpreadsheetApp.getUi().showModalDialog(html, '作成したフォームを開きます \n'+ url); // 通常のURLをログに表示 console.log('URL= ' +form.getPublishedUrl()); // 短縮したURLをログに表示 console.log('短縮URL= ' + form.shortenFormUrl(form.getPublishedUrl())); } |
サンプルExcelの中にも、コードは記述してあります。
手順3 ボタンにスクリプトを割り当てる
最後に、スプレッドシートのボタンにスクリプトを割り当てれば完成です。
ボタンを押すと、スプレッドシートと同じ場所にフォームが出来ています。
※押したら押した分だけ次々にできるので気を付けましょう…
あとは、集計するスプレッドシートは、フォームから作るのがいいでしょう。自動で作ると、どのファイルか分からなくなりますので…。あとは、やはり作ったら動作確認を忘れずに…
今後の予定
選択肢によって、違うページに飛ぶようにしたい。技術的には可能です。
しかし、今は一覧でとりあえず作って、分岐は手作業で頑張ります…。
また、グリッド式の質問は、スプレッドシートの記述方法の問題なので、考えればすぐにできそうです。需要があれば作ります。
終わりに…
多くの学校でこういったものはどんどん使われるようになっているのだから、本当は個人で作るのではなく、作成ツールとして教育委員会とかもっと上の方で作ってくれたら嬉しいな…
「Googleフォームを…」に1件のコメントがあります