申請のたびに部署名を入力してもらう代わりに、値が入った状態のGoogleフォームを開くURLを用意できます。GASでは回答を送信せずにFormResponseを作り、toPrefilledUrlで事前入力URLを取得します。
事前入力は、その値を回答者が変更できないようにする機能ではありません。また、URLに値が含まれるため、住所や個人情報などを不用意に埋め込まないことが大切です。部署名の再入力を省く用途と、本人や部署を確定する用途を分けます。
練習用の質問IDを確認する
練習用フォームに、記述式の質問「部署名」を1つ作ります。質問の名前だけで選ぶと、同じ名前の質問が増えた場合に対象を決められないため、質問IDで指定します。
最初にlistPracticeTextItemsを実行して、記述式質問のIDと名前を確認します。これは質問の一覧を読むだけで、フォームの項目や設定は変更しません。ログに出す質問名も練習用のものを使ってください。
公式のFormResponseでは、項目の回答を組み合わせ、事前入力URLを生成するメソッドが説明されています。文字列をURLへ自作で連結するより、対象の質問型に対応した回答を使う形です。
送信しない回答からURLを作る
FORM_IDとITEM_IDは作った練習用フォームと質問の値へ置き換えます。ITEM_IDの0は例の目印で、実際のIDが0とは限りません。
function listPracticeTextItems() {
const form = FormApp.openById('練習用フォームID');
console.log(JSON.stringify(form.getItems(FormApp.ItemType.TEXT)
.map(item => ({id: item.getId(), title: item.getTitle()}))));
}
function buildDepartmentUrl(form, itemId, department) {
if (!Number.isSafeInteger(itemId) || typeof department !== 'string' ||
department.trim() === '') throw new Error('質問IDと部署名を確認してください');
const item = form.getItemById(itemId);
if (!item || item.getType() !== FormApp.ItemType.TEXT) {
throw new Error('指定した記述式質問がありません');
}
const answer = item.asTextItem().createResponse(department);
return form.createResponse().withItemResponse(answer).toPrefilledUrl();
}
function previewDepartmentUrl() {
const FORM_ID = '練習用フォームID';
const ITEM_ID = 0;
console.log(buildDepartmentUrl(FormApp.openById(FORM_ID), ITEM_ID, '営業部'));
}
コードにsubmit()はありません。作ったURLを開き、指定した質問に「営業部」が入っているかを確認します。この段階でフォームの回答一覧へ新しい回答が増えていないことも見てください。回答者が実際に送信するまで、事前入力URLを作っただけの状態です。
質問の型と回答の検査
記述式の質問にはTextItemのcreateResponseを使っています。TextItem資料を基にした例です。選択式へ変えた質問を、記述式のまま扱うコードは使い回しません。
質問を削除して同じ名前で作り直すと、以前の質問IDとは別になります。URL作成でエラーになったときは、名前の表記だけを合わせるのではなく、現在のIDと型を確認します。入力規則がある場合は、埋め込む部署名がその条件を満たすかも試します。
フォームのアクセス範囲や回答の受付状態も別の条件です。URLが作れたことは、送り先の人が開けることを保証しません。実際に使う人と同じ条件のアカウントで開いて確かめます。
URLを配る前に確認する
事前入力された文字はURLをコピーした相手にも伝わる可能性があります。社内資料へ置いたURLを外へ転送してよいか、何を埋め込むかを決めます。部署名の事前入力だけで、回答者の所属確認が済んだとは判断しないようにします。
ローカルでは代用フォームで、質問IDと型の照合、空の部署名の拒否、回答の組み立て、submitを呼ばないことを確認しました。Google上のURL形式や表示、公開・回答受付設定は未実行です。
回答が送信された後の処理はフォーム回答の受付と転記、閲覧者や実行者の範囲はGASの権限と共有と分けて設計できます。
