2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

東京テクニカルカレッジAdvent Calendar 2022

Day 17

【GASの小ネタ】フォーム内アイテムの種別が混在しているときに、アイテムタイプに応じたas~メソッドを呼び出す

Posted at

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_CHOICEMultipleChoice

あとはas~Itemの間に埋め込んであげれば、
各アイテムタイプ固有のメソッド(上記例ではgetPoints())が使えるようになります。
(この形でメソッドを呼び出すとコード補完が効かないのでメソッド名の候補は出てきません)

うーん、無理やり感がすごい。
もっとスマートな方法があれば教えてください!

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?