2017-02-21 73 views
0

我想从有权访问文件和文件夹的人员列表中删除某人。如何快速从所有文件中删除查看器或编辑器

我可以做到这一点使用下面的代码,但由于我有很多文件需要很长时间,我不得不多次重新启动过程并手动更改变量(var count = 5600)几次以获得任务完成。

这不可能是正确的解决方案,所以我想知道:
a)是否可以通过一次调用从所有文件(和文件夹)中删除用户?
b)如何快速(er)从一堆文件/文件夹中删除查看器?

我知道我可以使用continuationtoken来避免在重启之间更改代码,但我没有尝试过。

function removeUser() 
{ 
    var userName = 'John Doe'; 
    removeUserFromViewersAndEditors_(userName); 
}; 

function removeUserFromViewersAndEditors_(userName) 
{ // Remove a user from viewers and editors 
    // Currently maximum runtime will be exceeded. Using a continuationtoken and automatically starting batches it is possible 
    // to make it run a sequence of batches and perform its task. 
    // As this script will not be run often, a manual approach is preferred for now. 
    // Start with              count = 0 and phase = 0 
    // After the program finishes change            phase = 1 and start again 
    // The program will stop on execution time limit reached change  count = ??    based on the log and start again 

    var count = 5600; // Update if maximum runtime exceeded 
    var phase = 1; // Update if maximum runtime exceeded 

    var user    = findUser_(userName, phase, count); 
    var totalRemovedFolders = 0; 
    var totalRemovedFiles = 0; 
    if (user != null) 
    { 
    if (phase == 0) 
    { 
     var countFolders = 0; 
     var folders = DriveApp.getFolders(); 
     while(folders.hasNext()) 
     { 
      if (removeUserFromFolderOrFile_(folders.next(), user) == true) totalRemovedFolders++; 
      countFolders++; 
     } 
     Logger.log('testRemoveUser Folders : count= ' + countFolders + ' totalRemovedFolders= ' + totalRemovedFolders); 
    } 
    else if (phase == 1) 
    { 
     var countFiles = count; 
     var files = DriveApp.getFiles(); 
     while(count--) files.next(); // Skip a number of files 

     while(files.hasNext()) 
     { 
      if (removeUserFromFolderOrFile_(files.next(), user) == true) totalRemovedFiles++; 
      countFiles++; 
      if ((100 * ((countFiles/100) | 0)) == countFiles) 
      { 
       Logger.log('phase= ' + phase + ' count= ' + countFiles + ' user= ' + userName + ((user == null) ? '' : ' found totalRemovedFiles= ' + totalRemovedFiles)); 
      } 
     } 
     Logger.log('testRemoveUser Files : count= ' + countFiles + ' totalRemoved= ' + totalRemovedFiles); 
    } 
    } 

    Logger.log('totalRemoved= ' + (totalRemovedFolders + totalRemovedFiles)); 


//////////////////// Internal functions removeUserFromViewersAndEditors_ 
    function removeUserFromEvents_(userName) 
    { // Must be executed BEFORE the user will be removed from memberNames (so : delete user from contacts AFTERWARDS !!) 
     var removed = 0; 
     var dateFrom = new Date(); 
     var future = Date.now() + 2 * 365 * 24 * 60 * 60 * 1000 ; // 2 years from now (milliseconds) 
     var dateUntil = new Date(future) 
     var fileName = OPA_Agenda; 
     var cal  = CalendarApp.getCalendarsByName(OPA_Calendar)[0]; 
     var events = cal.getEvents(dateFrom, dateUntil);   // All events within the timeframe 
     var numEvents = events.length; 

     var memberNames = getMemberNames_(); 
     var memberEmails = getMemberEmails_(); 
     var numMembers = memberNames.length; 
     for (var i=0; i<numMembers; i++) 
     { 
     if (userName == memberNames[i]) 
     { // found 
      var email = memberEmails[i]; 

      for (var j=0; j<numEvents; j++) 
      { 
       var event  = events[j]; 
       var guests = event.getGuestList(); 
       var numGuests = guests.length; 
       for (var k=0; k<numGuests; k++) 
       { 
        if (email == guests[k].getEmail()) 
        { 
        event.removeGuest(email); // Removed from this event 
        Logger.log(userName + ' removed from event : ' + event.getTitle() + ' at ' + event.getStartTime()); 
        removed++; 
        break; 
        } 
       } 

      } 
      break; 
     } 
     } 

     Logger.log(userName + ' removed from ' + removed + ' events'); 
     return removed; 
    } 

    function removeUserFromFolderOrFile_(fileOrFolder, user) 
    { // Remove <user> as editor or viewer from a file or a folder 
     var removed = false; 
     var array = []; 
     var userName = user.getName(); 
     for (var i=0; i<2; i++) 
     { 
     if (i == 0)  array = fileOrFolder.getEditors(); 
     else if (i == 1) array = fileOrFolder.getViewers(); 
     var size = array.length; 
     while(size--) 
     { 
      if (userName == array[size].getName()) 
      { 
       if (i == 0)  fileOrFolder.removeEditor(array[size]); 
       else if (i == 1) fileOrFolder.removeViewer(array[size]); 
    Logger.log('User ' + userName + ' removed from ' + fileOrFolder.getName());   
       removed = true; 
       break; 
      } 
     } 
     } 

     return removed; 
    } 

    function findUser_(name, phase, count) 
    { 
     var iterator = null; 
     var user = null; 
     for (var i=0; i<2; i++) 
     { 
     Logger.log('findUser phase ' + i); 
     if (i == 0) 
     { 
      iterator = DriveApp.getFolders(); 
      if (phase == 0) 
      { // Skip <count> folders 
       for (var j=0; j<count; j++) var object = iterator.next(); 
      } 
      else iterator = null; 
     } 
     else if (i == 1) 
     { 
      iterator = DriveApp.getFiles(); 
      if (phase == 1) 
      { // Skip <count> files 
       for (var j=0; j<count; j++) var object = iterator.next(); 
      } 
      else 
      { // Just finished checking folders 
       count = 0; 
       phase = 1; 
      } 
     } 

     if (iterator != null) 
     { 
      while (iterator.hasNext() && (user == null)) 
      { 
       var object = iterator.next(); 
       var array = []; 
       for (var j=0; j<2; j++) 
       { 
        if (j == 0)  array = object.getEditors(); 
        else if (j == 1) array = object.getViewers(); 
        var size = array.length; 
        while(size--) 
        { 
        if ((name == array[size].getName()) || (name == array[size].getEmail())) 
        { // Found 
         user = array[size]; 
         break; 
        } 
        } 
       } 

       count++; 
       if ((100 * ((count/100) | 0)) == count) 
       { 
        Logger.log('phase= ' + phase + ' count= ' + count + ' user= ' + name + ((user == null) ? '' : ' found')); 
       } 
      } 
     } 
     } 

     Logger.log('findUser(' + name + ') ' + ((user == null) ? 'failed' : 'succeeded')); 
     return user; 
    } 
//////// End internal functions removeUserFromViewersAndEditors_ 
} 

回答

0

我没有看到您的用例的任何示例。你可能会喜欢这个related product forum但使用GAM命​​令参考:

gam all users show filelist query "'[email protected]' in writers or '[email protected]' in readers" id | gam csv - gam user ~Owner delete drivefileacl ~id [email protected] 

的第一个命令将产生与供应商的电子邮件地址共享的所有文件的CSV列表为域内的所有用户(读或写访问) 。如果您的域中有很多用户,则需要一段时间才能生成此列表。 |之后的第二个命令管道读取此CSV列表并对与供应商共享的每个文件执行删除ACL操作。

您也可以检查这个thread

相关问题