🦔

【GAS】Googleフォームの選択肢を変更する:ラジオボタン・プルダウン・チェックボックス

2024/06/24に公開

Googleフォームを活用してアンケートや申込フォームを作成する際、選択肢の設定が重要です。Googleフォームでは、ラジオボタン、プルダウン、チェックボックスといった選択肢を用意できます。これらの選択肢は、GAS(Google Apps Script)を使用して動的に変更することが可能です。この記事では、GASを用いてGoogleフォームの選択肢を変更する方法を具体的に解説します。

フォームID

フォームIDはフォームの管理ページ(設定画面)のURLの一部分です。
https://docs.google.com/forms/d/ フォームID /edit

フォームIDが誤ってると次のエラーになります。

Exception: No item with the given ID could be found.
Possibly because you have not edited this item or you do not have permission to access it.

getItems メソッドとは

getItems メソッドは、Googleフォーム内の全ての設問(アイテム)を取得するためのメソッドです。このメソッドを使用することで、フォーム内の特定の設問を操作・変更することが可能となります。

function formItems() {

 //ご自身のフォームIDに変更する
  const formId = "フォームID";
  const form = FormApp.openById(formId);
  console.log(`form: ${form.getTitle()}`);

  const items = form.getItems();
  for (const item of items) {
    const title = item.getTitle();
    const type = item.getType();
    const index = item.getIndex();
    const itemId = item.getId();

    console.log(`●設問${index + 1}`)
    console.log(`title: ${title}`);
    console.log(`type: ${type}`);
    console.log(`itemId: ${itemId}`);
  }
}

このメソッドは、フォーム内の全ての設問を FormItem オブジェクトの配列として返します。各 FormItem オブジェクトは、具体的なアイテムタイプ(例えば、複数選択、リスト、チェックボックスなど)にキャストして操作することができます。

設問のタイプを指定して取得する

getItems メソッドの引数としてアイテムタイプを指定することで、特定のタイプのアイテムのみを取得することができます。
例えば、ラジオボタンのアイテムを取得する場合:

const multipleChoiceItems = form.getItems(FormApp.ItemType.MULTIPLE_CHOICE);

アイテムタイプの一覧:

  • FormApp.ItemType.TEXT - 単一行のテキスト質問
  • FormApp.ItemType.PARAGRAPH_TEXT - 複数行のテキスト質問
  • FormApp.ItemType.MULTIPLE_CHOICE - ラジオボタン
  • FormApp.ItemType.CHECKBOX - チェックボックス
  • FormApp.ItemType.LIST - プルダウンリスト
  • FormApp.ItemType.SCALE - スケール(1〜5など)
  • FormApp.ItemType.GRID - グリッド
  • FormApp.ItemType.DATE - 日付
  • FormApp.ItemType.TIME - 時間

設問(アイテム)の選択肢を動的に変更する

getItemsメソッドで取得した複数の設問(アイテム)から、選択肢を変更する設問(アイテム)を特定して操作をします。設問のタイプ(type: ラジオボタン、チェックボックス、プルダウンリスト)によりキャストするメソッドが変わります。

function updateChoiceValues() {
  //変更対象の設問タイトル
  const targetTitle = "設問1";
  //変更する選択肢文言
  const values = ["選択肢A", "選択肢B", "選択肢C", "選択肢D"];
 //ご自身のフォームIDに変更する
  const formId = "フォームID";
  const form = FormApp.openById(formId);
  console.log(`form: ${form.getTitle()}`);

  const items = form.getItems();
  for (const item of items) {
    const title = item.getTitle();
    const type = item.getType().toString();

    //対象以外の設問は処理をスキップする
    if (targetTitle !== title) continue;

    console.log(`●設問の選択肢を変更する`);
    console.log(`title: ${title}`);
    console.log(`type: ${type}`);
    console.log(values);

    //設問のタイプによりメソッドが異なる。
    //as<○○○○>Item()で各タイプにキャストして、選択肢を変更する
    if (type === "LIST") { //プルダウンリスト
      item.asListItem().setChoiceValues(values);
    } else if (type === "MULTIPLE_CHOICE") { //ラジオボタン
      item.asMultipleChoiceItem().setChoiceValues(values);
    } else if (type === "CHECKBOX") { //チェックボックス
      item.asCheckboxItem().setChoiceValues(values);
    }
  }
}

エラー: Exception: Invalid conversion for item type

設問のタイプと異なるas<○○○○>Item()メソッドでキャストをするとエラーに至る。

Exception: Invalid conversion for item type: MULTIPLE_CHOICE.
Exception: Invalid conversion for item type: CHECKBOX.
Exception: Invalid conversion for item type: LIST.

設問のタイプ(type: ラジオボタン、チェックボックス、プルダウンリスト)がどれかによって、キャストのメソッドを変える必要がある。

Discussion