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コードの分割を基に、取得部分を独立させて試してください。
