スプレとGASでGoogleフォームを量産する

Googleフォームでは同じフォームを複数人に送信し回答してもらうことができますが、事情により中身が同じでタイトルだけ違うフォームを量産する必要がありました。

調べてもフォームを量産するスクリプト例がなかったので備忘録的に残しておきます。
自分のやり方ではスプレッドシートを使い誰でも使いやすいようにしました。

##### フォーム生成設定シート
<img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276059/c73f0fa5-f91f-cf65-1564-7dedcbf1e6f8.png" width="650px">

A列B列G列でタイトルを指定 G列,A列,B列の順で一つのタイトルになります。
A列とB列はタイトルの要素が変数になっており、ここでタイトルの変えたい要素を指定できます。
例:【りんご早食いコンテスト】3/3(木)イベントアンケート

保存先フォルダをD列で指定して、E列でスクリプトで使用するフォルダーIDを入力
D2にURLをいれるとE2列にフォルダーIDが書き込まれるよう関数を入れておきます。
```
=mid(D2,40,33)
```

ベースフォーム列では量産元となるフォームをURLで指定します。
フォーム生成用ボタンを押すことで設定した内容を元にフォームを生成します。

##### フォーム生成結果シート


<img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276059/036a9134-572d-6cd3-756e-cebb0c5b9141.png" width="650px">

　フォーム生成結果シートでは生成したフォームのタイトルと編集用URLと送信用の短縮URLも自動で記載されるようになっています。

##### スクリプト
```
function makeForm() {
	var activeSheet = SpreadsheetApp.getActiveSpreadsheet(); //シートの読み取り
	var sheet = activeSheet.getActiveSheet();
	var sheet2 = activeSheet.getSheetByName("フォーム生成結果シート"); //生成結果シートを指定
	var rowSheet = sheet.getDataRange().getLastRow();
	var folder_ID = sheet.getRange('E2').getValues(); //E2に記載された保存先のフォルダーIDを取得
	var baseForm_URL = sheet.getRange('F2').getValues(); //ベースとなるフォームのURLを指定
	var titleElements_C = sheet.getRange('G2').getValues();
	var baseFormOpen = FormApp.openByUrl(baseForm_URL);
	var baseForm_ID = DriveApp.getFileById(baseFormOpen.getId());

	//フォーム名と説明文を取得し、フォームを作成
	for (var i = 2; i <= rowSheet; i++) {
		var titleElements_A = sheet.getRange(i, 1).getValue(); //タイトル要素A
		//var formUser = (formTitleElements_A);
		var titleElements_B = sheet.getRange(i, 2).getValue(); //タイトル要素B
		var formTitle = (titleElements_C + titleElements_A + titleElements_B); //タイトル要素をC,A,Bの順で繋げる
		var form = baseForm_ID.makeCopy(formTitle); //フォームファイルをコピーしてタイトルを変える

		var newFormId = form.getId(); //コピーしたフォームIDを取得
		var editForm = FormApp.openById(newFormId);　 //編集URLと短縮URLの取得のためフォームIDから生成したフォームを開く 
		var form_ID = DriveApp.getFileById(form.getId());
		DriveApp.getFolderById(folder_ID).addFile(form_ID);
		var getURL = editForm.getPublishedUrl();
		var shortURL = editForm.shortenFormUrl(getURL);　 //短縮URLを作ってくれる
		var editURL = editForm.getEditUrl();

		sheet2.getRange(i, 1).setValue(formTitle).getValue(); //生成結果シートに記載
		sheet2.getRange(i, 2).setValue(editURL).getValue();
		sheet2.getRange(i, 3).setValue(shortURL).getValue();

	}
	var strResult = Browser.msgBox(rowSheet - 1 + "件のフォームを自動生成しました 保存場所:" +
		"https://drive.google.com/drive/folders/" + folder_ID, Browser.Buttons.OK);

}
```

フォームを新規制作するやり方だと大変なので、ベースとなるフォームをコピーしてタイトルを変更しています。
このやり方であればベースフォームの公開設定などの細かい設定も引き継いでくれます。

#### Googleフォーム

<img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276059/c609f23e-c16a-a630-6fd7-f38b4e2712d0.png" width="650px">


ベースとなるGoogleフォームを作ります。
今回のスクリプトではタイトルの変更しか対応していないので、タイトル以外は好きに作ります。
タイトルの注意点としてGoogleフォームには上の画像のように①と②のタイトルの箇所があります。
これらはそれぞれ自由に編集できますが、②に自由なタイトルを入れてしまった場合、②のタイトルはスクリプトで変更できず、ユーザーから見えない①の部分のみ変更されてしまいます。
これを防ぐため、②のタイトルを編集し削除します。
②のタイトルを削除した場合、①のタイトルが自動で入力され、スクリプトでコピーしてタイトルを変更した際に①と②両方変更される状態にすることができます。

<img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276059/af515c63-6e5d-8c46-3ec4-17175b405906.png" width="650px">

フォームが完成しましたら、設定項目を確認します。ここで設定した要素も引き継がれるため念入りに確認します。その他ヘッダーやテーマ色も任意に変更することで引き継がれます。

#### 参考
https://developers.google.com/apps-script/reference/forms

https://blog.synnex.co.jp/google/gas-google-form-from-spreadsheet/