// TODO Before you start using this sample, you must run the setUp() // function in the Setup.gs file. // Application constants const APP_TITLE = "Upload files to Drive from Forms"; const APP_FOLDER_NAME = "Upload files to Drive (File responses)"; // Identifies the subfolder form item const APP_SUBFOLDER_ITEM = "Subfolder"; const APP_SUBFOLDER_NONE = ""; /** * Gets the file uploads from a form response and moves files to the corresponding subfolder. * * @param {object} event - Form submit. */ function onFormSubmit(e) { try { // Gets the application root folder. var destFolder = getFolder_(APP_FOLDER_NAME); // Gets all form responses. let itemResponses = e.response.getItemResponses(); // Determines the subfolder to route the file to, if any. var subFolderName; let dest = itemResponses.filter((itemResponse) => itemResponse.getItem().getTitle().toString() === APP_SUBFOLDER_ITEM); // Gets the destination subfolder name, but ignores if APP_SUBFOLDER_NONE was selected; if (dest.length > 0) { if (dest[0].getResponse() != APP_SUBFOLDER_NONE) { subFolderName = dest[0].getResponse(); } } // Gets the subfolder or creates it if it doesn't exist. if (subFolderName != undefined) { destFolder = getSubFolder_(destFolder, subFolderName) } console.log(`Destination folder to use: Name: ${destFolder.getName()} ID: ${destFolder.getId()} URL: ${destFolder.getUrl()}`) // Gets the file upload response as an array to allow for multiple files. let fileUploads = itemResponses.filter((itemResponse) => itemResponse.getItem().getType().toString() === "FILE_UPLOAD") .map((itemResponse) => itemResponse.getResponse()) .reduce((a, b) => [...a, ...b], []); // Moves the files to the destination folder. if (fileUploads.length > 0) { fileUploads.forEach((fileId) => { DriveApp.getFileById(fileId).moveTo(destFolder); console.log(`File Copied: ${fileId}`) }); } } catch (err) { console.log(err); } } /** * Returns a Drive folder under the passed in objParentFolder parent * folder. Checks if folder of same name exists before creating, returning * the existing folder or the newly created one if not found. * * @param {object} objParentFolder - Drive folder as an object. * @param {string} subFolderName - Name of subfolder to create/return. * @return {object} Drive folder */ function getSubFolder_(objParentFolder, subFolderName) { // Iterates subfolders of parent folder to check if folder already exists. const subFolders = objParentFolder.getFolders(); while (subFolders.hasNext()) { let folder = subFolders.next(); // Returns the existing folder if found. if (folder.getName() === subFolderName) { return folder; } } // Creates a new folder if one doesn't already exist. return objParentFolder.createFolder(subFolderName) .setDescription(`Created by ${APP_TITLE} application to store uploaded Forms files.`); }

Comments