Googleフォームは便利だけど、作るのが結構面倒くさい。
Googleフォームを使って業務アンケートや問い合わせ対応を行っている方は多いと思いますが、あのUIは地味にマウスを使わされて手元往復が煩雑で嫌になりませんか?
見た目、カラーレイアウトもなかなか設定が面倒くさい(テンプレート登録はできるんですがね)。
などなど、ひたすら面倒くさい人向けにGoogleフォームを動的に量産・管理できるGASコードを書いていこうと思います。
ほぼそのままコピペで使える(はず)なのでぜひお試しください。
では早速ステップは以下の通り。
ステップ1: スプレッドシートの準備
まず、Googleスプレッドシートにフォームの情報を入力します。このスプレッドシートは、フォームの「設計図」のようなものです。各列には以下の情報を入力します。
- A列: フォームの名前
- B列: 質問の内容
- C列: 質問のタイプ(テキスト、チェックボックスなど)
- D列: 質問の選択肢(複数選択やチェックボックスの場合)
- E列: フォームを保存するGoogleドライブのフォルダID
ステップ2: スクリプトの準備
スプレッドシートのメニューから「拡張機能」>「Apps Script」を選び、スクリプトエディタを開きます。ここに、フォームを自動生成するコードを書きます。
function createFormsAndMove() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const rows = sheet.getDataRange().getValues();
const formMap = {}; // 作成したフォームのキャッシュ
// ヘッダーを除いたデータでループ
for (let i = 1; i < rows.length; i++) {
const [formName, question, answerType, options, folderId] = rows[i];
// フォームがまだ作成されていない場合は新規作成
if (!formMap[formName]) {
const form = FormApp.create(formName);
const formId = form.getId();
formMap[formName] = formId;
// フォームを指定のフォルダに移動
moveFormToFolder(formId, folderId);
}
// フォームに質問を追加
const form = FormApp.openById(formMap[formName]);
addQuestionToForm(form, question, answerType, options);
}
}
function moveFormToFolder(formId, folderId) {
const file = DriveApp.getFileById(formId);
const folder = DriveApp.getFolderById(folderId);
folder.addFile(file);
DriveApp.getRootFolder().removeFile(file); // 必要に応じてルートフォルダから削除
}
function addQuestionToForm(form, question, answerType, options) {
// 質問タイプに応じてフォームに質問を追加する処理
// (この部分は以前の例に基づいて適宜追加してください)
}
function addQuestionToForm(form, question, answerType, options) {
switch (answerType) {
case 'テキスト':
form.addTextItem().setTitle(question);
break;
case 'パラグラフ':
form.addParagraphTextItem().setTitle(question);
break;
case '複数選択':
const mcChoices = options ? options.split(',').map(option => option.trim()) : [];
form.addMultipleChoiceItem().setTitle(question).setChoiceValues(mcChoices);
break;
case 'チェックボックス':
const cbChoices = options ? options.split(',').map(option => option.trim()) : [];
form.addCheckboxItem().setTitle(question).setChoiceValues(cbChoices);
break;
case 'プルダウン':
const ddChoices = options ? options.split(',').map(option => option.trim()) : [];
form.addListItem().setTitle(question).setChoiceValues(ddChoices);
break;
case '日付':
form.addDateItem().setTitle(question);
break;
case '時間':
form.addTimeItem().setTitle(question);
break;
case '日時':
form.addDateTimeItem().setTitle(question);
break;
case '期間':
form.addDurationItem().setTitle(question);
break;
case '画像':
form.addImageItem().setTitle(question);
// 画像の追加にはURLまたはDriveのファイルIDが必要です。ここではサンプルとして単純化しています。
break;
case '動画':
form.addVideoItem().setTitle(question);
// 動画の追加にはYouTubeのURLが必要です。ここではサンプルとして単純化しています。
break;
case 'スケール':
form.addScaleItem().setTitle(question).setBounds(1, 5); // 1から5のスケール
break;
case 'グリッド':
const gridRows = options ? options.split(';').map(option => option.trim()) : [];
const gridColumns = ['非常に不満', '不満', '普通', '満足', '非常に満足'];
form.addGridItem().setTitle(question).setRows(gridRows).setColumns(gridColumns);
break;
case '複数選択グリッド':
const msGridRows = options ? options.split(';').map(option => option.trim()) : [];
const msGridColumns = ['選択1', '選択2', '選択3'];
form.addCheckboxGridItem().setTitle(question).setRows(msGridRows).setColumns(msGridColumns);
break;
// 他の質問タイプをここに追加
default:
console.log('未対応の質問タイプ:', answerType);
}
}
いったいこのコードは何をやっているんだ??
ってお感じの方がほとんどと思います。
GASの本領は、各アプリケーションの連携です。
自分がいくらエディタでGASが書けても、エディタすら開けない(そりゃ開くの怖いよね)人が大多数ですのでフォーム作成にかかる変数はスプレッドシートで動的に管理、調整できるようにしておく方がコードの保守性からも有効だと思っています。
わかりやすくするために移動先のGoogleドライブのidをカラムに書いて管理していますが、
もし、フォームを生成するプロジェクトごとに移動先ドライブがはっきりとしている場合は、driveidなどのシートを作ってA1セルに記入して管理してもよいでしょう。
関数やメソッドごとに、細かい解説をまた付け加えて次回以降に進みたいと思います。
では、今日も楽しいGASライフを!