【GAS学習04】フォームの質問の選択肢をスプレッドシートから生成する
こんにちは。
めいめいです。
前回はタカハシさんのブログを読み込みながら、
をして、
GASでフォームを作成することができました。
タカハシさんのブログの連載記事で、
スプレッドシートから設問項目を読み込みする方法が記載されていたので
そちらをもとに、
GASでGoogleフォームを作成してみました。
作成にあたっては色々と乗り越えなければいけない壁が多く…
タカハシさんのブログを読み込みながら、GASの復習もできました。
参考にさせていただいた記事はこちらです。
手順としては以下です。
こうやって復習がてらに記述すると、
思考が整理されるのですが、
記事を一読しただけではチンプンカンプンでした。
プログラミングって文字情報だけで吸収しようとしたり、身につけるの難しいですね涙
恥じらいもなく、
タカハシさんのやり方マルコピですが、
どのようにやったかを記録します。
1. スプレッドシートで選択肢の項目を列挙する
2. スプレッドシートに列挙した項目を取得して(この時点では2次元配列)一次元配列にする
function myFunction_questionlists() { const ss = SpreadsheetApp.getActiveSpreadsheet() const answerchoices = ss.getSheetByName('質問項目').getDataRange().getValues(); //shift:先頭要素を削除する answerchoices.shift(); //二次元配列と、列数を渡すことで、その列のデータを一次元配列に格納する //mapメソッド:二次元配列に含まれる要素から、特定のインデックスを取り出して、一次元配列を生成する //filterメソッド:対象の配列のすべての要素のうち条件式がtrueの要素だけで新たな配列を生成するので、空文字の要素は取り除かれる console.log(answerchoices.map(record => record[2]).filter(value => value)); // [ 'GAS', 'Python', 'VBA' ] }
タカハシさんのブログのソースコードを解読。 めっちゃ勉強になりますが、いきなり関数を組めないので、mapとかfilterとか試しながらconsole.logで出力させつつ、項目行だけ取り出すことに成功。
こちらを関数化する…。 アロー関数も使ってーの、のでなんとかできたかな…? っていうかタカハシさんのコード、ほぼ一緒ですが…。
function generateArray(values, column) { return values.map(record => record[column]).filter(value => value); }
3. [2]の一次元配列を、項目の選択肢としてセットする
function createEventForm05(){ const ss = SpreadsheetApp.getActiveSpreadsheet() const values = ss.getSheetByName('シート1').getDataRange().getValues(); const formTitle = values[0][1]; //タイトル const formDescription = values[1][1]; //説明文 const questiondataValues = ss.getSheetByName('質問項目').getDataRange().getValues(); questiondataValues.shift() const form = FormApp.create(formTitle); const id = PropertiesService.getScriptProperties().getProperty('Folder_ID'); const formFile = DriveApp.getFileById(form.getId()); DriveApp.getFolderById(id).addFile(formFile); DriveApp.getRootFolder().removeFile(formFile); form.setDescription(formDescription); //1問目 form.addTextItem().setTitle('氏名').setRequired(true); //2問目 //まずvalidationbuilderオブジェクトを作る const validationEmail = FormApp.createTextValidation().requireTextIsEmail().build(); form.addTextItem().setTitle('メールアドレス').setRequired(true).setValidation(validationEmail); //3問目 form.addTextItem().setTitle('所属組織').setRequired(true); //4問目 form.addCheckboxItem() .setTitle('参加日程をお選びください') .setChoiceValues(['1日目','2日目','3日目']) .setRequired(true); //5問目 form.addMultipleChoiceItem() .setTitle('食事制限') .setChoiceValues(['なし','ベジタリアン','ビーガン','コーシャ','グルテンフリー']) .showOtherOption(true) .setRequired(true); //6問目 form.addListItem() .setTitle('お住まいはどちらですか') .setChoiceValues(generateArray(questiondataValues,0)) .setRequired(true); } //↓スプレッドシートから質問項目を抽出するための関数 function generateArray(values, column) { return values.map(record => record[column]).filter(value => value); }
そしたらなんとかできました!
自分のメモとしてしか機能しなさそうな記事ですが…。 なんとか読解&自分のGASで走らせることができてよかったです><
もっと勉強します・・・!