MENU

GASでフォームの質問IDから回答を読む

当ページのリンクには広告(PR)が含まれていることがあります。
GASでフォームの質問IDから回答を読む。フォームの回答、質問IDで対応、項目の変更を検知の処理例。

Googleフォームの質問文を「所属」から「部署名」へ変えると、質問名をキーにした処理が合わなくなる場合があります。質問そのものをIDで指定すれば、表示する名前と、処理が使う識別子を分けられます。

ただし、同じ名前の質問を作り直せば、以前と同じ項目になるわけではありません。質問IDがあること、想定した質問型であること、その回答に値があることを順に確認します。ここでは記述式の必須項目を読む例に絞ります。

目次

質問の順番をIDにしない

getItems()[0]は現在の先頭の項目です。質問を並べ替えると対象が変わるので、先頭だから部署名だという前提で使わないようにします。質問のIDはgetIdで取得できます。

練習用フォームへ記述式の「部署名」を作り、次の一覧関数でIDと名前を控えます。質問文が変わった場合も、処理がどのIDを参照するかを照合できます。IDをコードへ埋め込むなら、その用途も一緒に残しておきます。

公式のFormのgetItemByIdは、該当項目がなければnullを返します。同名の別質問へ自動で切り替えるのではなく、設定の見直しとして止める使い方です。

記述式の回答だけを受け取る

質問IDと回答IDは別の値です。ITEM_IDは部署名の質問、RESPONSE_IDは練習として送信した回答のIDへ置き換えます。

function listPracticeQuestionIds() {
  const form = FormApp.openById('練習用フォームID');
  console.log(JSON.stringify(form.getItems()
    .map(item => ({id: item.getId(), title: item.getTitle()}))));
}

function readRequiredTextAnswer(form, response, itemId) {
  const item = form.getItemById(itemId);
  if (!item || item.getType() !== FormApp.ItemType.TEXT) {
    throw new Error('指定した記述式の質問がありません');
  }
  const answer = response.getResponseForItem(item);
  if (!answer || answer.getItem().getId() !== itemId) {
    throw new Error('対象の質問への回答がありません');
  }
  const value = answer.getResponse();
  if (typeof value !== 'string' || value.trim() === '') {
    throw new Error('必須の記述回答を確認してください');
  }
  return {itemId: itemId, title: item.getTitle(), value: value};
}

function previewItemAnswer() {
  const ITEM_ID = 0; // 一覧で確認した質問IDへ置き換えます。
  const RESPONSE_ID = '練習回答ID';
  const form = FormApp.openById('練習用フォームID');
  console.log(JSON.stringify(readRequiredTextAnswer(
    form, form.getResponse(RESPONSE_ID), ITEM_ID)));
}

質問IDが123、質問名が「部署名」、入力が「営業部」という架空の条件なら、結果はitemId:123,title:"部署名",value:"営業部"です。コード内の0は置き換える目印です。実際のフォームでこの番号になるという意味ではありません。

未回答と質問の削除を分ける

質問が見つからない場合と、回答の中にその項目がない場合では、直す場所が違います。前者は現在のフォームの質問構成、後者は対象回答と、回答時点の構成を確認します。

公式のFormResponseでは、getResponseForItemで指定項目の回答を取得し、対応がなければnullになり得ることを確認できます。ItemResponseの値は質問型によって形が違うので、複数選択の配列を記述式の文字列と同じように扱いません。

この例は空文字や空白だけの記述回答もエラーにしています。任意項目で未回答を認める業務なら、この条件は変更が必要です。値を取得できたという理由だけで、必須項目が入力済みとは判断しないようにします。

質問を変更するときの確認

練習用フォームで質問を並べ替え、IDで指定した項目の回答を読めるかを確認します。続けて質問を別の型へ変更した場合や削除した場合に、意図せず別の回答を採用せず止まることを確かめます。

実際の回答をログへ出す前には、住所や相談内容などが含まれないかも確認してください。例は部署名の架空データだけです。通知へ流す場合も、回答の取得と送信の処理を分けておきます。

ローカルでは代用フォームと回答で、正常なID、項目なし、型違い、回答なし、空白の値を確認しました。Googleフォーム上の質問変更や既存回答への影響は未実行です。フォーム回答の処理とGASコードの分割を基に、取得部分を独立させて試してください。

この記事を書いた人

Watanabeのアバター Watanabe サイト運営者

2020年よりブログ開始。
SEOが思いのほか性にあっていたようで現在に至る。
モットーは「勝率の高い選択をする」
AIは活用するが吉、最後は人間が息を吹き込む。
アートと科学を追求し、日々精進。
―――
収益:6~7桁をウゴウゴ。
サイト:ペラサイト~中規模サイトまで運営中。
案件:1000円以上の案件をメインに取組中。
打ち手:ブラックSEO~ホワイトSEOまで
―――

目次