プロが書く美しいコードじゃない、素人の稚拙なコードだからこそ、得られるものだってきっとある…そんな思いでコードを公開しています。どうぞ生暖かく見守ってください。

【Google Apps Script】formのアイテムタイプごとに処理を変える~分岐処理

[tool1]フォームをシートに書き出しChatGPTGoogle Apps Script
  • アイテムのキャスト??
  • asCheckboxItem()
  • 分岐処理その1(if構文)
  • getChoices()

前回までに作成したコードで、フォームに設置されている項目の種類と質問内容をすべて取得して、一つずつスプレッドシートに書き出すことができました。

今回はいよいよ、ラジオボタンなどに含まれる「選択肢」を取得するため、アイテムタイプごとに違う処理をしていきたいと思います。

アイテムタイプや質問内容など、どんなアイテムにも存在する情報はItemにget***()を付けることで取得できましたが、選択肢などタイプ固有の情報に処理を行う場合には、取得したItemに対してもう一つ処理が必要になります。

以下公式リファレンスより

タイプ固有のプロパティを操作するには、getType() を使用して、アイテムの ItemType を確認し、asCheckboxItem() などのメソッドを使用して適切なクラスにアイテムをキャストします。
公式リファレンスより

キャストしなくても取得できる情報には、

ID、説明テキスト、通し番号、質問内容、アイテムタイプ

があります。→公式リファレンス参照(get****とついている項目がそれです。)

アイテムタイプにキャストすることで取得できる情報は、ラジオボタンだと

配点、選択肢、正解したときの解説、不正解の解説

になります。→公式リファレンス

ということは、順序としては

  1. getItemsでアイテム丸ごと取得
  2. for構文を使って、取得したItemsの1つ目から処理開始
    1. アイテムタイプ・質問内容を取得しシートへ書き込み
    2. アイテムタイプごとにキャスト
    3. もしもアイテムタイプが「ラジオボタン」なら、選択肢取得
    4. 選択肢をシートに書き込み
    5. 次のItemへ(1へ戻る)

でしょうか。ラインの引かれた部分が、今回追加する項目になります。

以上を踏まえてコードを眺めてみましょう。

function myFunction() {

  // フォームを開く
  const form = FormApp.openByUrl(フォームのURL);
  // URLは'https://docs.google.com/fo******/edit'のように''で囲んで入力

  //フォームの要素を配列で取得
  const items = form.getItems();

  //スプレッドシートを開く。
  const spsheet = SpreadsheetApp.openByUrl(シートのURL);
  // URLは'https://docs.google.com/fo******/edit'のように''で囲んで入力
  const sheet = spsheet.getActiveSheet();
  //処理を加えるシートとして、ファイルを開いて最初に表示される(アクティブな)シートを設定

  sheet.clear(); //シートの内容をクリア

  //シートに行を追加し、formタイトル入力
  sheet.appendRow(['フォームタイトル', form.getTitle()]);
  // 項目タイトル行を作成
  sheet.appendRow(['アイテムタイプ', '質問内容']);

  for (let i = 0; i < items.length; i++) {
    //Item数をiと置き換えて、iを0から順番に項目の数だけ1ずつ増やす
    const itemparts = items[i]; //itemという配列のi番目の要素をitempartsとして取り出す。
    const itemType = itemparts.getType(); //取得したitempartsのタイプを確認してitemTypeに保管
    const itemText = itemparts.getTitle();//取得したitempartsの質問内容を確認してitemTextに保管
    sheet.appendRow([itemType, itemText]); // それぞれシートの新しい行に入力
  }
}

シートに項目を入力したあとの部分で、まずはアイテムタイプごとにキャストを行う処理を追記します。

キャストの方法は、先ほどの公式リファレンスにサンプルコードが書かれています。

//公式リファレンスのサンプルスクリプトです
if (item.getType() == 'TEXT') {
var textItem = item.asTextItem();
textItem.setRequired(false); //例:回答を必須としない処理
}

テキストボックスをラジオボタンに置き換えて、変数名も変えました。

さらに、choicesの中に選択肢情報を入れます。

 if (itemType == 'MULTIPLE_CHOICE') {
testPartsItem = itemparts.asMultipleChoiceItem();
const choices = testPartsItem.getChoices(); //選択肢を取得
Logger.log(choices); //ログを確認
}

実行した結果です。

getItemsと同様に、選択肢が配列として入りました。テキスト情報も同様にgetValue()で取得することができます。

選択肢の個数も、Itemsと同様にあらかじめ数が決まっていません。こちらも配列の長さ分だけfor構文を回して取得すると良さそうですが・・・。

選択肢のテキストを取得してはシートに入力…という作業を一回ずつ行うのは人間の作業でも手間がかかりそうです。

機械は文句を言いませんが、作業スピードが落ちてしまう可能性があります。

せめて一行に入力するデータは配列にまとめておいて、一気に入力したいと思います。

そのためには少し配列の知識と操作が必要になってくるのですが、、

素人の私がなんとか使いこなせるようになったので、きっと大丈夫!

配列について基本を押さえながら進めていきましょう。

 

ちなみに、フォームのアイテムタイプは執筆現在で17種類あります。

コメント

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