Google Apps Script(GAS) Google Forms Part(4)

GAS

はじめに

こんにちは、swim-loverです。 こんにちは、swim-loverです。第4回は、リストアイテムの追加方法について紹介したいと思います。第3回は、Google Apps Script(GAS)を使って、ラジオボタンの追加方法について説明しました。

第4回は、リストアイテムをアンケートフォームに追加する方法について紹介したいと思います。

前回までのおさらい

前回までに勉強した内容です。基本的には、アンケート内容が変更される可能性のある箇所によっては、スプレッドシートから読み込んで、フォームを作成するようにしています。

  • 第1回は、スプレッドシートの内容をもとに、スクリプトを記述し、フォームの新規作成まで
  • 第2回は、フォームへテキスト(Mailアドレスと氏名の入力フォーム)を追加する方法
  • 第3回は、ラジオボタンの追加方法

GAS ‘リストを追加する’

スプレッドシートには、”種目リスト”、”年齢区分”タブを用意しました。

function createEventForm(){
 
  const MAX_ENTRY=3; //max entry num,エントリー可能な種目数
  const ss = SpreadsheetApp.getActiveSpreadsheet();//get active spread spped,現在開いているスプレッドシートを取得
  const values = ss.getSheetByName('イベント内容').getDataRange().getValues();
  const dataValues_1 = ss.getSheetByName('種目リスト').getDataRange().getValues();
  const dataValues_2 = ss.getSheetByName('年齢区分').getDataRange().getValues();
  
  const formTitle = values[0][1]; //read cell[0][1],title,タイトル
  const formDescription = values[1][1]; //read cell[1][1],event content,内容
 
  const form = FormApp.create(formTitle);// create new form

  form.setDescription(formDescription);//set form description、フォームの説明欄

  //Add text
  const validationEmail = FormApp.createTextValidation().requireTextIsEmail().build();
  form.addTextItem().setTitle('メールアドレス/Mail-address').setRequired(true).setValidation(validationEmail);
  form.addTextItem().setTitle('氏名/Name').setRequired(true);
  
  //Add choice item(part1)
  /*
  form.addMultipleChoiceItem()
    .setTitle('性別/sex')
    .setChoiceValues(['男性/Male','女性/Female'])
    .setRequired(true);
  */
  //Add choice item(part2)
   var item=form.addMultipleChoiceItem()
   item.setTitle('性別/sex')
   item.setChoices([
       item.createChoice('男性/Male'),
       item.createChoice('女性/Female')])
   item.setRequired(true);
  
  //Add list item
  item=form.addListItem()
  item.setTitle('エントリー種目')
  item.setChoiceValues(ConvertArray(dataValues_1))//get entry category
  item.setRequired(true);
  
  item=form.addListItem()
  item.setTitle('年齢区分')
  item.setChoiceValues(ConvertArray(dataValues_2))//get age category
  item.setRequired(true);
}

//sub function:convert 2 dimension array to 1 dimension arrary
function ConvertArray(values){
  values.shift();//remove 1st line
  return values.map(record => record[0]);
}

このタブの内容を、以下のコードで読み込んでいます。dataValue_1,dataValue_2はそれぞれ二次元の配列データです。

  const dataValues_1 = ss.getSheetByName('種目リスト').getDataRange().getValues();
  const dataValues_2 = ss.getSheetByName('年齢区分').getDataRange().getValues();

今、取得したいのは、1列目のデータです。そこで、次のような関数を作って、一列目のデータだけ取得するようにしました。shift()メソッドによって、一列目の”種目リスト”、”年齢区分”を除いています。

次に、map()メソッドによって、一列目のデータを取得して関数の戻り値にしています。私には、アロー(=>)の処理が、まだしっくりと理解できていません。

//sub function:convert 2 dimension array to 1 dimension arrary
function ConvertArray(values){
  values.shift();//remove 1st line
  return values.map(val => val[0]);
}

調べてみると、同じことがコールバック関数で書けるようなので試してみます。map()の引数にはコールバック関数を渡します。C言語であれば、callback関数は、ポインタとして、関数名を渡しますが、JavaScriptでは、関数名ではなく、戻り値(tmp)を渡すようです。

また、コードバック関数の引数として’val’を定義していますが、これは、map()メソッドにおいて、二次元配列のvaluesがセットされると理解すれば良さそうです。

function ConvertArray(values){
  values.shift();//remove 1st line

  var tmp = function(val){ //callback func
  return val[0]
  }; 
 return values.map(tmp) //1st arg:callback
}

スクリプトの実行結果

エントリー種目と年齢区分のリストアイテムが追加されていることが確認できました。

まとめ

今回は、リストアイテムをアンケートフォームに追加する方法を紹介してみました。次回もさらにアンケート内容を充実させていきたいと思います。

コメント

タイトルとURLをコピーしました