Update December 2015 - for enhancements such as automatically sharing folders with recipients and a link directly to the folder view rather than the 'open in drive' view, please see responses to comments below this post
Google forms are really useful, but a limitation is that it is not possible to attach a document to a record (as you can do with a SharePoint list for example)
This script aims to give a workaround for that - when a user submits a form, the form entry is assigned a unique reference, a Drive folder is created with that reference, and they receive an email containing a link to that folder to upload related documentation. Using an Awesome table, the link to the folder as well as the details in the form can be displayed together to make it easy to match documents to form items.
To being with, I created a Google form, and a Google sheet to collect the information.
To create a unique reference I used the following formula in the first row of the first empty column (where a username is in column B) The formula puts the title "Reference" in the first row, in the second row it puts "NoFilter" (for use in the Awesome Table) and for any subsequent lines, it takes the first letter of the users first name, two letters from the surname, and the row number to make the unique reference
=ArrayFormula(IF(ROW(A:A)=1,"Reference",IF(ROW(A:A)=2,"NoFilter",((LEFT(B1:B)&MID(B1:B,FIND("#",SUBSTITUTE(B1:B&" "," ","#",1))+1,2)&MID(B1:B,FIND("#",SUBSTITUTE(B1:B&" "," ","#",2))+1,1)&ROW( A:A ))))))
Scripts are here:
var formURL = 'https://docs.google.com/a/nihr.ac.uk/forms/d/0123456789abcdsefghijklmnop/edit'; // enter the edit url for the form var sheetName = 'Form responses 1'; // enter the name of the sheet var columnIndex = 8; //the number here is a count with A = 1, it indicates where the link should go // script to get the edit link function getEditResponseUrls(){ var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName); var data = sheet.getDataRange().getValues(); var form = FormApp.openByUrl(formURL); for(var i = 2; i < data.length; i++) { if(data[i][0] != '' && (data[i][columnIndex-1] == '' || !data[i][columnIndex-1])) { var timestamp = data[i][0]; var formSubmitted = form.getResponses(timestamp); if(formSubmitted.length < 1) continue; var editResponseUrl = formSubmitted[0].getEditResponseUrl(); sheet.getRange(i+1, columnIndex).setValue(editResponseUrl); } } } // script to create a folder for document uploads function createFolder () { var FOLDER_CREATED = "FOLDER_CREATED"; // Get current spreadsheet var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName("Form responses 1"); var data = ss.getDataRange() // Get all non-blank cells .getValues() // Get array of values .splice(2); // Remove header lines // Define column number unique reference. Array starts at 0. var CLASS = 6; //column G // Get the ID of the root folder, where the sub folders will be created var DriveFolder = DriveApp.getFolderById("0123456789101112131415161718abcdefghijklmnop"); // For each email address (row in a spreadsheet), create a folder, // name it with the data from the Class for (var i=0; i<data.length; i++){ var startRow = 3; // First row of data to process var row = data[i]; var class = data[i][CLASS]; var folderName = class; var supplier = row[3]; //column D var folderstatus = row[9]; // column J if (folderstatus != FOLDER_CREATED) { //create the folder var folderpath = DriveFolder.createFolder(folderName).getUrl(); //send an email var emailAddress = row[2]; // Column C) var message = 'Thank you for submitting a purchase order requisition for supplier: '+ supplier +' - please upload the purchase order(s) relating to this to the following folder ' +folderpath ; var subject = "Please upload related documentation"; MailApp.sendEmail(emailAddress, subject, message, { // cc: 'sample@email.com' // optional cc }); //set the flag to avoid duplicates sheet.getRange(startRow + i, 10).setValue(FOLDER_CREATED); sheet.getRange(startRow + i, 11).setValue(folderpath); // Make sure the cell is updated right away SpreadsheetApp.flush(); } } }Both scripts should be set to trigger when the form submits.
When a user enters information in the form, the scripts will generate an edit link to the item, and create a Drive sub folder with the unqiue ID. They then will get an email which contains a link to the newly created folder...
The Awesome Table setup used is below:
One quick note, as the unique ID is generated from the row number, deleting a row in the sheet would cause a mismatch between the references and any already created folders...
In my example above in the 'Advanced parameters', the Awesome Table is set to only show rows where A is not blank, so the method for removing any unwanted records from displaying in the Awesome table should just be a matter of deleting the timestamp for the unwanted row in the sheet.
Hope this is of interest. A copy of the demo sheet, including scripts can be found here