Change Folder Permissions with Google Apps Script

This Google Apps Script will change the access permissions of the specified Google Drive folder from Public to Private at a custom date and time. When you initialize the script, it creates a time-based trigger that is responsible for change the shared permissions.

Google Scripts has a simple file.removeViewer(user) method to remove one or more users from a shared File but it doesn’t seem to work when the file /folder is shared with Public. Thus the workaround, as used in this script, is to create a copy of the shared folder and delete the original one thus expiring the shared links.

// Enter the full URL of the public Google Docs folder
var FOLDER_URL = "https://docs.google.com/folder/d/1234567890/edit";

// Enter the expiry date in YYYY-MM-DD HH:MM format (local time zone)
var EXPIRY_TIME  = "2013-02-15 18:30"; 

function getFolderID() {

  var search  = /docs\.google\.com\/folder\/d\/(.*)\//g;
  var results = search.exec(FOLDER_URL);

  var id = "0";

  if (search.lastIndex) 
    id = results[1];

  return id;  
}

function Start() {

  var ID = getFolderID();

  if (ID == "0") {
    MailApp.sendEmail(Session.getActiveUser(), "Error", 
                      "Check the URL of the shared Google Docs folder : " + FOLDER_URL);
    return;
  }

  var time = EXPIRY_TIME;

  var expireAt = new Date(time.substr(0,4),
                          time.substr(5,2)-1,
                          time.substr(8,2),
                          time.substr(11,2),
                          time.substr(14,2));

  if ( !isNaN ( expireAt.getTime() ) )
    ScriptApp.newTrigger("autoExpire").timeBased().at(expireAt).create();
  else 
    MailApp.sendEmail(Session.getActiveUser(), "Error", 
                      "The auto-expiry date isn't in proper format. Please use YYYY-MM-DD HH:MM");

}

function autoExpire() {
  
  try {
   
    var folder = DocsList.getFolderById(Initialize());
    
    if (folder) {
      
      var name = folder.getName();
      var copy = DocsList.createFolder(name + " (Private)");      
      
      var files = folder.getFiles();
      
      for (var i=0; i<files.length; i++) {
        files[i].removeFromFolder(folder);
        files[i].addToFolder(copy);
      }
      
      folder.setTrashed(true);
      copy.rename(name);
      
      MailApp.sendEmail(Session.getActiveUser(), "Success", 
                        "Your shared files are no longer public and the new (private) URL is :" + copy.getUrl());
    }
  } 
  catch (e) {
    MailApp.sendEmail(Session.getActiveUser(), "Error", 
                      "Could not set the expiry date for your file. " + e.toString());
  }  
}