今までの記事一覧
-
Googleフォームの質問変更に負けない!「部分一致」と「秘密の暗号」でcleanFormData(e)の防御力を鉄壁に
-
Googleフォームで同時に大量送信されても踏ん張る!LockServiceで順番制御!try - catch - finally でバトンを繋げ!
前提
この記事は、フォーム回答を保存している スプレッドシート側のGAS を前提にしています。
トリガーは以下を設定しています。
- スプレッドシートから
- フォーム送信時
前回のおさらい
前回はフォームの送信を新規と修正で条件分岐し、修正の場合は
- 受付番号を維持
- 受付シートに上書き または 行を追加してデータを入れる
という処理をするコードを作りました。
今回は、フォームで添付書類を送信した場合の処理を考えていきましょう。
フォームに添付書類を付ける方法
Googleフォームではファイルを送ることもできます。
このように質問の方式を選択するところで「ファイルをアップロード」を選択。
「回答者によるドライブへのファイルのアップロードを許可」が出た場合は、内容を読んで「次へ進む」
ファイル形式や数、最大サイズを制限することも可能です。
- ファイル送信する質問があるフォームは、回答者に必ずGoogleアカウントへのログインが求められます。
- ただし、フォームの設定画面で「メールアドレスを収集する」を「収集しない」にした場合は、スプレッドシートへのメールアドレス記載はされません。
- デフォルトでは、保存されたファイルの名前に、送信者のGoogleアカウントが入ります。
添付されたファイルの挙動
フォームの質問に「ファイルのアップロード」を作った瞬間に、フォームがあるフォルダの中にこのようにファイル保管用のフォルダが自動で作成されます。
フォームで送信されたファイルはこの中に質問名のフォルダが作成され、その中に保存されます。
ファイル名は もともとのファイル名_送信者のアカウント.拡張子。(送信者のアカウント名が自動で付与されます)
ファイルのオーナーは送信者ではなくフォームのオーナーになります。
ファイルの共有権限は上位フォルダを継承します。
スプレッドシートには、このようにファイルのURLが記載されます。
eにも同じようにファイルのURLが入ります。
{"authMode":
"FULL",
"namedValues":{
"ファイルを送信してください":["https://drive.google.com/open?id=1********y"],
"タイムスタンプ":["2026/05/** **:00:17"],
"1問目":["1"],
"2問目":["2"]
},
"range":{
"columnEnd":4,
"columnStart":1,
"rowEnd":7,
"rowStart":7
},
"source":{},
"triggerUid":"1********8",
"values":[
"2026/05/** **:00:17",
"1",
"2",
"https://drive.google.com/open?id=1********y"
]
}
やりたいこと
今回はこんなことにチャレンジしてみましょう。
- フォルダ作成:送信ごとに受付番号のフォルダを作成する
- ファイル移動:作ったフォルダにファイルを移動する
- ファイル名変更:ファイル名の前に受付番号を付ける
- 権限追加:フォルダの閲覧権限を変える
保存されているドライブを開いたとき、どのフォームに対するファイルなのか、デフォルトのまま確認しづらいです。そこで、前回作った「受付番号」と、このURLを紐づけてドライブ側を整理するのが今回のゴールです。
1.フォルダ作成
まずは、ファイルを整理するための「箱」を作り、名前を付けましょう。
今回は「受付番号_123」などとします。
// 保存先の親フォルダを指定(自動作成されたフォルダのIDなど)
const parentFolder = DriveApp.getFolderById("ここに親フォルダIDを記入");
// 受付番号を名前にしたフォルダを作成
const newFolder = parentFolder.createFolder("受付番号_" + currentId);
//新しいフォルダのIDを取得する
const newFolderId = newFolder.getId();
//新しいフォルダのURLを取得する
const newFolderURL = newFolder.getUrl();
2.ファイル移動
作ったフォルダに、添付ファイルを移動させましょう。
移動するには添付ファイルのIDが必要です。
フォームの送信データにあるファイルのURLから正規表現を使ってIDを取り出します。
//ファイルのURLを取得
const fileURL = e.namedValues["ファイルを送信してください"][0];
//URLからファイルIDを取得しファイルを指定
const fileId = fileURL.match(/[-\w]{25,}/);
const file = DriveApp.getFileById(fileId);
// 作成したフォルダへ移動
file.moveTo(newFolder);
3.ファイル名変更
ファイル名も変更しておきましょう。
今回は「受付番号_元のファイル名」にします。
//ファイルのもともとの名前を取得
const fName = file.getName();
//新しい名前を付ける
file.setName(currentId + "_" + fName);
4.投稿者にフォルダ/ファイルの閲覧権限を付与
新しく作ったフォルダの権限は上位フォルダを引き継ぎます。
変更する場合はこちらのメソッドを使います。
addViewer(メールアドレス):閲覧権限
addEditor(メールアドレス):編集権限
addCommenter(メールアドレス):閲覧権限(コメント可) ファイルのみ(フォルダにはコメントを付けられないため)
設定されたメールアドレスにメールが発信されるので注意
//★フォルダに権限付与する場合
//投稿者のメールアドレスを取得
const email = e.namedValues["メールアドレス"][0];
//上で作ったフォルダに投稿者を閲覧者として設定
newFolder.addViewer(email);
//★ファイルに権限付与する場合
//投稿者のメールアドレスを取得
const email = e.namedValues["メールアドレス"][0];
//上で作ったファイルに投稿者を閲覧者(コメント可)として設定
file.addCommenter(email);
まとめ
今回はフォームで添付ファイルを送信した場合に、新しいフォルダを作成し、添付ファイルをそのフォルダに移動し、ファイル名を変更し、権限変更する処理を作りました。
しかしこのコードは、添付ファイルを要求する質問が1つ・添付ファイルも1つのときしか正常に動きません。
次回は添付ファイルの質問が複数あり、それぞれの質問に複数ファイルが送られた場合でもしっかり仕分けできるようなシステムを考えてみたいと思います。
