【GAS学習04】フォームの質問の選択肢をスプレッドシートから生成する

こんにちは。

めいめいです。

前回はタカハシさんのブログを読み込みながら、

をして、
GASでフォームを作成することができました。

タカハシさんのブログの連載記事で、
スプレッドシートから設問項目を読み込みする方法が記載されていたので
そちらをもとに、
GASでGoogleフォームを作成してみました。

作成にあたっては色々と乗り越えなければいけない壁が多く…
タカハシさんのブログを読み込みながら、GASの復習もできました。

参考にさせていただいた記事はこちらです。

tonari-it.com

手順としては以下です。

  1. スプレッドシートで選択肢の項目を列挙する
  2. スプレッドシートに列挙した項目を取得して(この時点では2次元配列)一次元配列にする
  3. [2]の一次元配列を、項目の選択肢としてセットする

こうやって復習がてらに記述すると、
思考が整理されるのですが、
記事を一読しただけではチンプンカンプンでした。
プログラミングって文字情報だけで吸収しようとしたり、身につけるの難しいですね涙

恥じらいもなく、
タカハシさんのやり方マルコピですが、
どのようにやったかを記録します。

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で走らせることができてよかったです><

もっと勉強します・・・!