はじめに
こんにちは、swim-loverです。 こんにちは、swim-loverです。第4回は、リストアイテムの追加方法について紹介したいと思います。第3回は、Google Apps Script(GAS)を使って、ラジオボタンの追加方法について説明しました。
第4回は、リストアイテムをアンケートフォームに追加する方法について紹介したいと思います。
前回までのおさらい
前回までに勉強した内容です。基本的には、アンケート内容が変更される可能性のある箇所によっては、スプレッドシートから読み込んで、フォームを作成するようにしています。
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
}
スクリプトの実行結果
エントリー種目と年齢区分のリストアイテムが追加されていることが確認できました。
まとめ
今回は、リストアイテムをアンケートフォームに追加する方法を紹介してみました。次回もさらにアンケート内容を充実させていきたいと思います。
組み込み系ソフトエンジニアをしています。これまでフロントエンド技術は避けてきましたが、食わず嫌いをやめて、勉強を始めました。
趣味は、水泳、ロードバイク、ランニング、登山です。
組み込み系技術ネタ、勉強したフロントエンド技術、たまに趣味の運動について発信していきます。
どうぞよろしくお願いします。
コメント