如何快速从ALL文件中删除查看器或编辑器

时间:2017-02-21 09:19:07

标签: google-apps-script

我想从有权访问文件和文件夹的人员列表中删除某人。

我可以使用下面的代码来做到这一点,但因为我有很多文件需要很长时间,我必须多次重启过程并手动更改变量(var count = 5600)几次以获得工作完成。

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

我知道我可以使用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_
}

1 个答案:

答案 0 :(得分:0)

我没有看到您的用例的任何示例。您可以使用此related product forum来引用,但使用GAM命​​令,如:

gam all users show filelist query "'exte...@vendor.com' in writers or 'exte...@vendor.com' in readers" id | gam csv - gam user ~Owner delete drivefileacl ~id exte...@vendor.com
     

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

您还可以查看thread