この記事では、GAS(Google Apps script)でねこあつめフォームに「スケールアイテム(5段階評価)」と「パラグラフテキストアイテム(コメント長文入力)」を追加します。
お世話になっているサイトは、いつも隣にITのお仕事さんの
GASでGoogleフォームに追加できる質問の種類とそのメソッドまとめ
です。
まずは、前回のおさらいをします。
「お名前」と「1番お気に入りのグッズ」と「めあど」はテキストアイテムをコードに記述して、「スプレッドシートから、ラジオボタン、チェックボックス、リストアイテムを取得する」コードを追加しました。
下記のコードを実行すると、このようなフォーム(目のマークのプレビュー画面)を得られます。
function myFunction() {
//SpreadsheetAppから現在のスプレッドシートにアクセス
const ss=SpreadsheetApp.getActiveSpreadsheet();
//シート名「イベント概要」のデータを配列として取得する
const values=ss.getSheetByName('イベント概要').getDataRange().getValues();
const formTitle=values[0][1];//タイトル
const formDescription=values[1][1];//概要
//フォームを作成
const form=FormApp.create(formTitle);
//ここでプロパティストアに格納したFOLDER_IDを使って、指定のフォルダにフォームを作成する
const id=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');//idにFOLDER_IDを格納する
const formFile=DriveApp.getFileById(form.getId());//作成したフォームのIDをformFileに格納する
DriveApp.getFolderById(id).addFile(formFile);//指定のフォルダにフォームを格納する
DriveApp.getRootFolder().removeFile(formFile);//マイドライブに作成されたフォームを削除する
//フォームの説明を作成
form.setDescription(formDescription);
//テキストアイテムを追加する
form.addTextItem().setTitle('おなまえ').setRequired(true);//trueにすることで、入力必須にしている。
form.addTextItem().setTitle('1番お気に入りのグッズ');
//メールアドレスのテキストアイテムを加える
const validationEmail=FormApp.createTextValidation().requireTextIsEmail().build();
form.addTextItem().setTitle('めあど').setRequired(true).setValidation(validationEmail);
//←シート「項目データ」から、フォームに追加するアイテムの内容を二次元配列として取得する
const dataValues=ss.getSheetByName('項目データ').getDataRange().getValues();
dataValues.shift();
/**
* シート「項目データ」の値を二次元配列として取得して、指定の列を抜き出し一次元配列を構成する
*
* @param{Object[][]}シート「項目データ」を二次元配列として取得したデータ
* @param{number} 配列の列数(0以上のインデックス)
* @return{Object[]} 指定の列の見出しタイトル行を除くデータによる一次元配列
*
*/
function generateArray(values,column){
return values.map(record=>record[column]).filter(value=>value);
}
//ラジオボタンを加える
form.addMultipleChoiceItem()
.setTitle('ねこ種類')
.setChoiceValues(generateArray(dataValues,0))
.setRequired(true);
//チェックボックスを追加する
form.addCheckboxItem()
.setTitle('他にあそんだグッズ')
.setChoiceValues(generateArray(dataValues,1))
.showOtherOption(true)//その他のチェックボックスを作っている
.setRequired(true);
//←リストアイテムを追加する
form.addListItem()
.setTitle('ねこちゃんの都道府県')
.setChoiceValues(generateArray(dataValues,2))
.setRequired(true);
}
今回の内容に入る前に、ねこあつめ画像で癒されます。
まるこたつで「とびちゃん」がごめん寝してる(=^x^=)
さて、今回は5段階評価などで使う「スケールアイテム」と、長文のコメントを書ける様になる「パラグラフテキストアイテム」を追加します。
それぞれの部品をフォームに追加するコードはこちらになります。
・スケールアイテム のコード
//あなたの「ねこ度」をスケールアイテムで追加する
form.addScaleItem().setTitle('あなたのねこ度は? 1:低い 〜 5:高い').setRequired(true);//trueにすることで、入力必須にしている。
・パラグラフテキストアイテムのコード
//ご意見ご要望をパラグラフテキストアイテムで追加する
form.addParagraphTextItem().setTitle('ご意見ご要望').setRequired(true);//trueにすることで、入力必須にしている。
以上になります。
他にも日付を入れるアイテムとかありましたが、実際に良く使われるのは、スケールアイテムやパラグラフテキストアイテムだと思って、そこに絞って追加しました。
最後にこれまでのコードです。
指定のフォルダに保存したい場合は最初に「setScriptProperty」の32桁のXXX…XXXの所にフォルダIDを指定して実行してから、正しく格納されたことを
「getScriptProperty」で確認してからメインの「myFunction」を実行して下さい。
function myFunction() {
//SpreadsheetAppから現在のスプレッドシートにアクセス
const ss=SpreadsheetApp.getActiveSpreadsheet();
//シート名「イベント概要」のデータを配列として取得する
const values=ss.getSheetByName('イベント概要').getDataRange().getValues();
const formTitle=values[0][1];//タイトル
const formDescription=values[1][1];//概要
//フォームを作成
const form=FormApp.create(formTitle);
//ここでプロパティストアに格納したFOLDER_IDを使って、指定のフォルダにフォームを作成する
const id=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');//idにFOLDER_IDを格納する
const formFile=DriveApp.getFileById(form.getId());//作成したフォームのIDをformFileに格納する
DriveApp.getFolderById(id).addFile(formFile);//指定のフォルダにフォームを格納する
DriveApp.getRootFolder().removeFile(formFile);//マイドライブに作成されたフォームを削除する
//フォームの説明を作成
form.setDescription(formDescription);
//テキストアイテムを追加する
form.addTextItem().setTitle('おなまえ').setRequired(true);//trueにすることで、入力必須にしている。
form.addTextItem().setTitle('1番お気に入りのグッズ');
//メールアドレスのテキストアイテムを加える
const validationEmail=FormApp.createTextValidation().requireTextIsEmail().build();
form.addTextItem().setTitle('めあど').setRequired(true).setValidation(validationEmail);
//←シート「項目データ」から、フォームに追加するアイテムの内容を二次元配列として取得する
const dataValues=ss.getSheetByName('項目データ').getDataRange().getValues();
dataValues.shift();
/**
* シート「項目データ」の値を二次元配列として取得して、指定の列を抜き出し一次元配列を構成する
*
* @param{Object[][]}シート「項目データ」を二次元配列として取得したデータ
* @param{number} 配列の列数(0以上のインデックス)
* @return{Object[]} 指定の列の見出しタイトル行を除くデータによる一次元配列
*
*/
function generateArray(values,column){
return values.map(record=>record[column]).filter(value=>value);
}
//ラジオボタンを加える
form.addMultipleChoiceItem()
.setTitle('ねこ種類')
.setChoiceValues(generateArray(dataValues,0))
.setRequired(true);
//チェックボックスを追加する
form.addCheckboxItem()
.setTitle('他にあそんだグッズ')
.setChoiceValues(generateArray(dataValues,1))
.showOtherOption(true)//その他のチェックボックスを作っている
.setRequired(true);
//リストアイテムを追加する
form.addListItem()
.setTitle('ねこちゃんの都道府県')
.setChoiceValues(generateArray(dataValues,2))
.setRequired(true);
//←あなたの「ねこ度」をスケールアイテムで追加する
form.addScaleItem().setTitle('あなたのねこ度は? 1:低い 〜 5:高い').setRequired(true);//trueにすることで、入力必須にしている。
//←ご意見ご要望をパラグラフテキストアイテムで追加する
form.addParagraphTextItem().setTitle('ご意見ご要望').setRequired(true);//trueにすることで、入力必須にしている。
}
//プロパティストアにフォルダIDを格納する
function setScriptProperty(){
PropertiesService.getScriptProperties().setProperty('FOLDER_ID','XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
}
//プロパティストアにフォルダIDが格納されたことを確認する
function getScriptProperty(){
const folderid=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');
console.log(folderid);
}
ねこフォームの基礎はこの記事で最終回にして、次からはフォーム実践編に入リます。長らくご精読ありがとうございました。
■参考文献の紹介■
初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。
GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本を通してじっくり学べます。