Google Forms内に、テキストボックス(TextItem)、単一選択形式のラジオボタン(CheckboxItem)、複数選択形式のチェックボックス(MultipleChoiceItem)などの様々なアイテムが混在している場合、
後からGoogle Apps Scriptで正解や点数、フィードバックなどの情報を参照したり変更しようとするときに躓くかもしれません。
アイテム情報を参照・編集するにはまず asTextItem()
asCheckboxItem()
asMultipleChoiceItem()
などによってアイテムタイプごとのオブジェクトを取得しないといけないのですが、
事前にアイテムタイプがわかっていないとどのメソッドを呼び出せば良いのかわからないためです。
すべてのアイテムタイプのインターフェースであるItemインターフェースにはタイトルなどの基本的な情報を取得するメソッドしか定義されていませんし・・・
そこで、まずアイテムタイプを取得し、それをメソッド名に変換する作業が必要です。
const form = FormApp.openById('フォームID');
const items = form.getItems();
items.forEach(item => {
// アイテムタイプの取得
const itemType = item.getType().name();
// アッパースネークケースをアッパーキャメルケースに変換
const itemTypeCamel = itemType.split('_').map(
word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
).join('');
// as~メソッド名を生成し、各アイテムのオブジェクトを取得
const quizItem = item[`as${itemTypeCamel}Item`]();
// 点数の取得
console.log(quizItem.getPoints());
});
まず、getType()
でアイテムタイプを取得します。
戻り値はアッパースネークケースのアイテムタイプです。(MULTIPLE_CHOICE
など)
アイテムタイプ一覧
これをアンダースコアで分割し、各文字列を先頭大文字、以降小文字に変換したうえで再結合し、
アッパーキャメルケースに変換します。(MULTIPLE_CHOICE
→ MultipleChoice
)
あとはas~Item
の間に埋め込んであげれば、
各アイテムタイプ固有のメソッド(上記例ではgetPoints()
)が使えるようになります。
(この形でメソッドを呼び出すとコード補完が効かないのでメソッド名の候補は出てきません)
うーん、無理やり感がすごい。
もっとスマートな方法があれば教えてください!