Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save justinTM/ccc93c3db240ce61b0c39a02c84e3a1b to your computer and use it in GitHub Desktop.
Save justinTM/ccc93c3db240ce61b0c39a02c84e3a1b to your computer and use it in GitHub Desktop.
Write a CSV to Google Drive folder (by id) for filenames and download URLs of all files within a Shared Drive folder (by Drive id and folder id)
/**
* Writes a CSV file to a Drive folder (by id) containing filenames and Google Drive download urls (File.webContentLink)
* for all files in a specified folder (by id) of a Shared Drive (by id).
*/
function ExportFilesFromSharedDriveToCSV() {
// id of Shared Drive (go to Shared Drive, copy-paste id from browser URL)
var sharedDriveId = "0AFR1j1Oo3fnlUk9PVA";
// id of folder in Shared Drive to search (go to folder, copy-paste if from browser URL)
var folderIdToSearch = "1Ua6mIE8kL4Q1r-LEEVmAlo-oyrsY2gg9";
// id of folder to save the CSV file
var folderIdToSave = "1HOE7yqsk4bQDC6d7CwNoR7wAbeIN5Csi"
// list of File objects from a folder. See:
// https://developers.google.com/drive/api/v3/reference/files#resource
// https://developers.google.com/drive/api/v3/search-files
var fileItems = GetFilesFromSharedDrive(sharedDriveId, folderIdToSearch);
// join filename and download url into csv, save to a Drive folder
var csvText = MakeCSVFromFileItems(fileItems);
// write multi-line comma-separated string variable to specified folder (by id) with specified name
var file = WriteVariableToFile(csvText, folderIdToSave, 'output.csv');
}
/**
* Creates a multi-line string of CSV text from list of Files.
*
* @param {Files resource} fileItems collection of File objects. See: https://developers.google.com/drive/api/v3/reference/files#resource
*
* @return {String} csvText The multi-line string to write to a CSV file.
*/
function MakeCSVFromFileItems(fileItems) {
// make header row of CSV
var list = ['title, downloadUrl'];
// format list of files into list of comma-separated strings, for filename and url
for (var i = 0; i < fileItems.length; i++) {
// ignore files without a webContentLink (download url)
if (!fileItems[i].webContentLink) {continue;}
// many other File attributes are available. using `title` (filename) and `webContentLink` (download url)
list.push(Utilities.formatString('%s,%s', fileItems[i].title, fileItems[i].webContentLink));
}
// return a multi-line string from list of values, using newline characters
return list.join('\n')
}
/**
* Searches for files in a Shared Drive (by id) whose parent folder matches `folderIdToSearch`.
*
* @param {String} sharedDriveId Id of Shared Drive (navigate to root in Drive, copy id from URL in browser).
* @param {String} folderIdToSearch Id of folder in Shared Drive to search (navigate to folder in Drive, copy id from URL in browser).
*
* @return {Array} fileItems List of File resources each with attributes like filename and download url.
*/
function GetFilesFromSharedDrive(sharedDriveId, folderIdToSearch) {
// search a folder within a Shared Drive and get all files within it
var folderId = folderIdToSearch || "1Ua6mIE8kL4Q1r-LEEVmAlo-oyrsY2gg9";
var sharedDriveId = sharedDriveId || "0AFR1j1Oo3fnlUk9PVA";
var result = Drive.Files.list({
"corpora": "teamDrive",
"includeTeamDriveItems": true,
"orderBy": "folder",
"q": Utilities.formatString('\'%s\' in parents',folderId), // must wrap value with ' '
"supportsTeamDrives": true,
"driveId": sharedDriveId
});
// return the data as object (JSON parse string into object)
return JSON.parse(result).items;
}
/**
* Saves an Apps Script variable to a file (by name) in a specified folder (by id).
*
* @param {Object} variable Any variable allowed, but String used for this case.
* @param {String} folderId Id of folder in Google Drive to save the new file.
* @param {String} filename String name of the new file to save.
*
* @return {File} file The resulting newly-created file.
*/
function WriteVariableToFile(variable, folderId, filename) {
var folderId = folderId || "1HOE7yqsk4bQDC6d7CwNoR7wAbeIN5Csi";
var folder = DriveApp.getFolderById(folderId);
var files = folder.getFilesByName(filename);
// guarantees there is only one file with that name in the folder.
while (files.hasNext()) {
files.next().setTrashed(true);
}
return folder.createFile(filename, variable);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment