問題描述
此處的工作代碼:
Google 生成的文件夾.文件提交到這個文件夾.
新文件夾中的重命名文件.原始文件從上面的文件夾中刪除.
原始文件現在顯示在云端硬盤中,而不是在文件夾中,而是在文件夾中.此文件的名稱與最初上傳的相同.進入passes"文件夾然后從該文件夾中刪除的那個.
片段
//重命名通行證if (itemResponses[f].getItem().getTitle() == "PASSES") {var 文件 = itemResponses[f].getResponse();//Logger.log(files.length);if (files.length > 0) {for (var n in files) {var dFile = DriveApp.getFileById(files[n]);dFile.setName("LSS - " + year + " - " + teamName + " - " + "PASSES - " + 今天);teamFolder.addFile(dFile);//將提交的文件移動到該文件夾passFolder.removeFile(dFile);//從提交文件夾中刪除DriveApp.getRootFolder().removeFile(dFile)//(不起作用)從驅動器文件夾中刪除DriveApp.removeFile(dFile)//(不工作)從驅動器文件夾中刪除}}
完整代碼
函數 getLastResponse() {var form = FormApp.openById('ID');var today = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "MM/dd/yyyy hh:mm a");var year = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "YYYY");Logger.log(今天);var formResponses = form.getResponses();//Logger.log(formResponses.length);var formResponse = formResponses[formResponses.length-1];var respondentEmail = formResponse.getRespondentEmail()var itemResponses = formResponse.getItemResponses();Logger.log(itemResponses.length);var teamName = itemResponses[2].getResponse();//Logger.log("團隊名稱:" + teamName);//檢查文件夾var dropbox = "Lititz Summer Showcase Team Check In (文件回復)";var 文件夾,文件夾 = DriveApp.getFoldersByName(dropbox);var teamBox = 團隊名稱;var teamFolder, teamFolders = DriveApp.getFoldersByName(teamBox);var passFolder = DriveApp.getFolderById('ID');var rosterFolder = DriveApp.getFolderById('ID');var teamInfoFolder = DriveApp.getFolderById('ID');var permissionToTravelFolder = DriveApp.getFolderById('ID');if (folders.hasNext()) {//檢查驅動器是否有文件夾文件夾 = 文件夾.next();} else {//如果不創建文件夾文件夾 = DriveApp.createFolder(dropbox);}if (teamFolders.hasNext()) {//檢查團隊是否存在文件夾團隊文件夾 = 團隊文件夾.next();} else {//如果不創建文件夾teamFolder = 文件夾.createFolder(teamBox);teamFolder.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.COMMENT);}for (var f = 0; f < itemResponses.length; f++) {Logger.log(itemResponses[f].getItem().getType());Logger.log(itemResponses[f].getItem().getTitle());if (itemResponses[f].getItem().getType() == "FILE_UPLOAD") {Logger.log("有一個文件上傳");//重命名通行證if (itemResponses[f].getItem().getTitle() == "PASSES") {var 文件 = itemResponses[f].getResponse();//Logger.log(files.length);if (files.length > 0) {for (var n in files) {var dFile = DriveApp.getFileById(files[n]);dFile.setName("LSS - " + year + " - " + teamName + " - " + "PASSES - " + 今天);teamFolder.addFile(dFile);//將提交的文件移動到該文件夾passFolder.removeFile(dFile);//從提交文件夾中刪除DriveApp.removeFile(dFile);//從驅動器文件夾中刪除}}//重命名名冊} else if (itemResponses[f].getItem().getTitle() == "ROSTER") {var 文件 = itemResponses[f].getResponse();//Logger.log(files.length);if (files.length > 0) {for (var n in files) {var dFile = DriveApp.getFileById(files[n]);dFile.setName("LSS - " + year + " - " + teamName + " - " + "ROSTER - " + 今天);teamFolder.addFile(dFile);}}//重命名團隊信息表} else if (itemResponses[f].getItem().getTitle() == "TEAM INFO SHEET") {var 文件 = itemResponses[f].getResponse();//Logger.log(files.length);if (files.length > 0) {for (var n in files) {var dFile = DriveApp.getFileById(files[n]);dFile.setName("LSS - " + year + " - " + teamName + " - " + "TEAM INFO SHEET - " + 今天);teamFolder.addFile(dFile);}}//重命名旅行許可} else if (itemResponses[f].getItem().getTitle() == "PERMISSION TO TRAVEL") {var 文件 = itemResponses[f].getResponse();//Logger.log(files.length);if (files.length > 0) {for (var n in files) {var dFile = DriveApp.getFileById(files[n]);Logger.log(ownerEmail);dFile.setName("LSS - " + year + " - " + teamName + " - " + "旅行許可 - " + 今天);teamFolder.addFile(dFile);}}}}//END '如果文件上傳'}//結束循環}//結束函數
這個答案怎么樣?
問題:
從谷歌表單上傳的流程如下.
- 在表單中上傳文件時,文件會創建到根文件夾.
- 提交表單時,通過將文件名重命名為表單創建的文件夾來復制根文件夾中的文件.
在上述情況下,根文件夾中的文件與 Google Form 創建的文件夾中的文件不同.這樣,您的SNIPPET"中的 DriveApp.getRootFolder().removeFile(dFile)
不起作用.這就是你的腳本問題的原因.
解決方法:
- 您要刪除保留在根文件夾中的文件.
為了刪除根文件夾中創建的文件,這個解決方法怎么樣?
很遺憾,無法從表單響應中檢索到原始文件名.但是復制到表單創建的文件夾中的文件的文件名格式為 {original filename} - ####.{extension}
.在此解決方法中,從該文件名中檢索原始文件名,并使用檢索到的原始文件名將文件移動到回收站.
示例腳本:
此示例腳本由可安裝的表單提交觸發器運行.因此,當表單提交時,腳本運行并將上傳的文件移動到目標文件夾,并將根文件夾中的原始文件移動到垃圾箱.
在運行腳本之前:
在此示例腳本中,假設該腳本是 Google Form 的容器綁定腳本.請注意這一點.
- 將腳本粘貼到腳本編輯器后,請將目標文件夾ID設置為腳本.
- 請安裝可安裝的表單提交觸發器.如果觸發器已安裝,請將其移除并重新安裝.
- 請使用 Google 表單上傳并提交文件.這樣,腳本就會運行.
腳本:
函數formsubmit(e) {var destFolderId = "###";//目標文件夾 ID如果(e){實用程序.sleep(3000);//這是必需的.var destfolder = DriveApp.getFolderById(destFolderId);var items = e.response.getItemResponses();for (var i = 0; i < items.length; i++) {if (items[i].getItem().getType() == "FILE_UPLOAD") {var files = items[i].getResponse();for (var j = 0; j < files.length; j++) {var file = DriveApp.getFileById(files[j]);var 文件名 = file.getName();//將上傳的文件移動到目標文件夾.var uploadFile = DriveApp.getFileById(files[j]);var sourcefolder = uploadFile.getParents().next();destfolder.addFile(文件);源文件夾.removeFile(文件);//獲取原始文件名.var p1 = 文件名.split(" - ");var extension = p1[p1.length - 1];p1.pop();var name = p1.join(" - ");變種 p2 = "";if (extension.indexOf(".") > -1) {p2 = "."+ extension.split(".")[1];}var orgFilename = 名稱 + p2;//將上傳的文件移動到垃圾箱.var orgFiles = DriveApp.getRootFolder().getFilesByName(orgFilename);if (orgFiles.hasNext()) {var orgFile = orgFiles.next();orgFile.setTrashed(true);}}}}} 別的 {throw new Error("此示例腳本由可安裝的表單提交觸發器運行.");}}
注意:
- 這是一個解釋此解決方法的簡單示例腳本.因此,請根據您的情況進行修改.
- 在我的環境中,發現
Utilities.sleep(3000)
是必需的.上傳文件并復制文件后,將運行可安裝的表單提交觸發器.此時,如果不使用Utilities.sleep(3000)
,則在復制文件完成之前移動文件.由此,發生錯誤.所以我用了它.- 但我不確定 3 秒的等待時間是否最好.所以如果在你的環境中出現錯誤,請修改這個.
- 我認為當上傳大文件時,這個值可能需要很大.或者我認為通過時間驅動的觸發器運行腳本可能會更好.
- 在這個示例腳本中,我使用了可安裝的表單提交觸發器.并且當表單提交時,根文件夾中的原始文件被移動到垃圾箱.
- 但我認為你也可以通過時間驅動的觸發器來運行腳本.在這種情況下,您可以通過打開表單來檢索響應項.關于這一點,請根據您的情況進行選擇.
參考資料:
- 可安裝觸發器
- setTrashed(trashed)
- 睡眠(毫秒)
WORKING CODE HERE: https://jsfiddle.net/nateomardavis/e0317gb6/
ORIGINAL QUESTION BELOW
How do I remove a form-submitted file from Drive itself?
I'm having trouble sorting out why a google form is submitting files to both my drive (not in a folder) but also into an auto-generated submission folder.
I've been able to move the renamed file to a new folder and delete the copy in the auto-generated submission folder. I cannot figure out how to remove the copy that's just listed in "Drive", not in any folder.
THE PROCESS (EDIT)
Let me try to explain the process more. I have a form that collects files. Google automatically makes a folder and sub-folders. I have successfully renamed the submitted files, moved them to a new folder, and deleted them from the Google-generated folder. However, a copy of the original, unchanged file is going to Google Drive, the root folder. Steps 1-3 (below) work as expected. Step 4 is where I'm running into issues.
The original file being uploaded to a form. Note the file name.
The Google-generated folder. The file is submitted this folder.
The renamed file in a new folder. The original file is deleted from the folder above.
The original file is now showing up in Drive, not in a folder but there. The name of this file is the same as the originally uploaded one. The one which went to the "passes" folder and was then deleted from that folder.
SNIPPET
//RENAME PASSES
if (itemResponses[f].getItem().getTitle() == "PASSES") {
var files = itemResponses[f].getResponse();
//Logger.log(files.length);
if (files.length > 0) {
for (var n in files) {
var dFile = DriveApp.getFileById(files[n]);
dFile.setName("LSS - " + year + " - " + teamName + " - " + "PASSES - " + today );
teamFolder.addFile(dFile); //MOVE SUBMITTED DOCUMENTS TO THAT FOLDER
passesFolder.removeFile(dFile); //REMOVE FROM SUBMISSION FOLDER
DriveApp.getRootFolder().removeFile(dFile) // (DOES NOT WORK) REMOVE FROM DRIVE FOLDER
DriveApp.removeFile(dFile) // (DOES NOT WORK) REMOVE FROM DRIVE FOLDER
}
}
FULL CODE
function getLastResponse() {
var form = FormApp.openById('ID');
var today = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "MM/dd/yyyy hh:mm a");
var year = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "YYYY");
Logger.log(today);
var formResponses = form.getResponses();
//Logger.log(formResponses.length);
var formResponse = formResponses[formResponses.length-1];
var respondentEmail = formResponse.getRespondentEmail()
var itemResponses = formResponse.getItemResponses();
Logger.log(itemResponses.length);
var teamName = itemResponses[2].getResponse();
//Logger.log("team name: " + teamName);
//CHECK FOLDERS
var dropbox = "Lititz Summer Showcase Team Check In (File responses)";
var folder, folders = DriveApp.getFoldersByName(dropbox);
var teamBox = teamName;
var teamFolder, teamFolders = DriveApp.getFoldersByName(teamBox);
var passesFolder = DriveApp.getFolderById('ID');
var rosterFolder = DriveApp.getFolderById('ID');
var teamInfoFolder = DriveApp.getFolderById('ID');
var permissionToTravelFolder = DriveApp.getFolderById('ID');
if (folders.hasNext()) { //CHECK IF DRIVE HAS FOLDER FOR FORM
folder = folders.next();
} else { //IF NOT CREATE FOLDER
folder = DriveApp.createFolder(dropbox);
}
if (teamFolders.hasNext()) { //CHECK IF FOLDER FOR TEAM EXISTS
teamFolder = teamFolders.next();
} else { //IF NOT CREATE FOLDER
teamFolder = folder.createFolder(teamBox);
teamFolder.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.COMMENT);
}
for (var f = 0; f < itemResponses.length; f++) {
Logger.log(itemResponses[f].getItem().getType());
Logger.log(itemResponses[f].getItem().getTitle());
if (itemResponses[f].getItem().getType() == "FILE_UPLOAD") {
Logger.log("THERE IS A FILE UPLOAD");
//RENAME PASSES
if (itemResponses[f].getItem().getTitle() == "PASSES") {
var files = itemResponses[f].getResponse();
//Logger.log(files.length);
if (files.length > 0) {
for (var n in files) {
var dFile = DriveApp.getFileById(files[n]);
dFile.setName("LSS - " + year + " - " + teamName + " - " + "PASSES - " + today );
teamFolder.addFile(dFile); //MOVE SUBMITTED DOCUMENTS TO THAT FOLDER
passesFolder.removeFile(dFile); //REMOVE FROM SUBMISSION FOLDER
DriveApp.removeFile(dFile); // REMOVE FROM DRIVE FOLDER
}
}
//RENAME ROSTER
} else if (itemResponses[f].getItem().getTitle() == "ROSTER") {
var files = itemResponses[f].getResponse();
//Logger.log(files.length);
if (files.length > 0) {
for (var n in files) {
var dFile = DriveApp.getFileById(files[n]);
dFile.setName("LSS - " + year + " - " + teamName + " - " + "ROSTER - " + today );
teamFolder.addFile(dFile);
}
}
//RENAME TEAM INFO SHEET
} else if (itemResponses[f].getItem().getTitle() == "TEAM INFO SHEET") {
var files = itemResponses[f].getResponse();
//Logger.log(files.length);
if (files.length > 0) {
for (var n in files) {
var dFile = DriveApp.getFileById(files[n]);
dFile.setName("LSS - " + year + " - " + teamName + " - " + "TEAM INFO SHEET - " + today );
teamFolder.addFile(dFile);
}
}
//RENAME PERMISSION TO TRAVEL
} else if (itemResponses[f].getItem().getTitle() == "PERMISSION TO TRAVEL") {
var files = itemResponses[f].getResponse();
//Logger.log(files.length);
if (files.length > 0) {
for (var n in files) {
var dFile = DriveApp.getFileById(files[n]);
Logger.log(ownerEmail);
dFile.setName("LSS - " + year + " - " + teamName + " - " + "PERMISSION TO TRAVEL - " + today );
teamFolder.addFile(dFile);
}
}
}
}//END 'IF FILE UPLOAD'
}//END FOR LOOP
}//END FUNCTION
How about this answer?
Issue:
The flow of upload from Google Form is as follows.
- When the file is uploaded in the Form, the file is created to root folder.
- When the form is submitted, the file in the root folder is copied by renaming the filename to the folder created by the form.
In above case, the file in root folder is different from the file in the folder created by Google Form. By this, DriveApp.getRootFolder().removeFile(dFile)
in your "SNIPPET" didn't work. This is the reason of your issue of script.
Workaround:
- You want to delete the file remained in the root folder.
In order to delete the file created in the root folder, how about this workaround?
Unfortunately, the original filename cannot be retrieved from the form response. But the file which was copied to the folder created by the form has the filename of the format like {original filename} - ####.{extension}
. In this workaround, the original filename is retrieved from this filename, and move the file to the trash using the retrieved original filename.
Sample script:
This sample script is run by the installable form submit trigger. So when the form was submitted, the script is run and the uploaded file is moved to the destination folder and the original file in the root folder is moved to the trash.
Before run the script:
In this sample script, it supposes that the script is the container-bound script of Google Form. Please be careful this.
- After cope and paste the script to the script editor, please set the destination folder ID to the script.
- please install the installable form submit trigger. If the trigger has already been installed, please remove it and install again.
- Please upload and submit a file using Google Form. By this, the script is run.
Script:
function formsubmit(e) {
var destFolderId = "###"; // Destination folder ID
if (e) {
Utilities.sleep(3000); // This is required.
var destfolder = DriveApp.getFolderById(destFolderId);
var items = e.response.getItemResponses();
for (var i = 0; i < items.length; i++) {
if (items[i].getItem().getType() == "FILE_UPLOAD") {
var files = items[i].getResponse();
for (var j = 0; j < files.length; j++) {
var file = DriveApp.getFileById(files[j]);
var filename = file.getName();
// Move uploaded file to the destination folder.
var uploadedFile = DriveApp.getFileById(files[j]);
var sourcefolder = uploadedFile.getParents().next();
destfolder.addFile(file);
sourcefolder.removeFile(file);
// Retrieve original filename.
var p1 = filename.split(" - ");
var extension = p1[p1.length - 1];
p1.pop();
var name = p1.join(" - ");
var p2 = "";
if (extension.indexOf(".") > -1) {
p2 = "." + extension.split(".")[1];
}
var orgFilename = name + p2;
// Move uploaded file to the trash.
var orgFiles = DriveApp.getRootFolder().getFilesByName(orgFilename);
if (orgFiles.hasNext()) {
var orgFile = orgFiles.next();
orgFile.setTrashed(true);
}
}
}
}
} else {
throw new Error("This sample script is run by the installable form submit trigger.");
}
}
Note:
- This is a simple sample script for explaining this workaround. So please modify this for your situation.
- In my environment, it was found
Utilities.sleep(3000)
was required. When the file is uploaded and the file is copied, the installable form submit trigger is run. At this time, ifUtilities.sleep(3000)
is not used, the file is moved before copying file is completed. By this, an error occurs. So I used it.- But I'm not sure whether the wait time of 3 seconds is the best. So if in your environment, an error occurs, please modify this.
- I think that when a large file is uploaded, this value might be required to be large. Or also I think that running the script by the time-driven trigger might be better.
- In this sample script, I used the installable form submit trigger. And when the form is submitted, the original file in the root folder is moved to the trash.
- But I think that you can also run the script by the time-driven trigger. In this case, you can retrieve the response items by opening the form. About this, please select for your situation.
References:
- Installable Triggers
- setTrashed(trashed)
- sleep(milliseconds)
這篇關于刪除 Google 表單提交的文件的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!