Google Apps:使用Google Apps脚本将文件所有权转移到集中式驱动器文件服务器

时间:2015-02-03 00:28:19

标签: google-apps-script google-api google-drive-api google-apps

问题

使用Google Apps的组织没有简单的解决方案来创建中央“文件服务器”,用户可能会在其中添加文件,从而丧失其对存储库的所有权。问题主要在于Google没有为组织提供中央文件存储选项。

当前解决方法

有几种解决方法可以解决这个问题。

  1. this article中所述,组织可以创建“存储”用户并使用它来构建所需的文件夹结构(市场营销,运营等)。只要正确配置了共享设置,这些文件夹就可以与组织内的相应用户共享,并且他们添加到这些文件夹的文件对其他用户可见。此选项的问题是添加到文件服务器的文件仍归用户所有,最终会计入其存储配额。

  2. 作为described here,存在付费的Google云端硬盘附加组件,例如允许组织实现此目的的AODocks。

  3. Several fragments of solutions mentioning the使用Google Apps脚本,Domain-Wide Delegation of Authority和Drive API ,但所有都已过时(参考已弃用的文档列表API)或不完整。几乎没有理解Google Developer工具的新手用户会感到困惑。

  4. 目标

    创建一个简单且免费的解决方案,该解决方案使用“存储”用户的云端硬盘空间作为组织用户的中央文件服务器。

    要件

    • 利用Google Apps脚本和基于时间的触发器来运行必要的脚本,以更改添加到“存储”用户共享的文件夹中的文件和文件夹的所有权。
    • 利用域范围的授权和Drive API来更改这些文件的所有权。
    • 该脚本只需要由域的超级用户实现,而不需要组织中每个用户的手动授权。

    正在进行的解决方案

    我已经开始编写部分Google Apps脚本了。但是,我缺少使用根据Drive API创建的OAuth凭据对this Delegation of Authority post进行身份验证的内容。

    var superUserEmail = "admin@mydomain.com";
    
    var folderId = "TARGET_FOLDER_ID";  // This folder belongs to the superuser and is shared so that other members of the organization can edit its contents
    
    var folderObject = DriveApp.getFolderById(this.folderId);
    
    // List all folders, sub folders and files within the folder
    var listItems = function(folder) {
        var items = []; 
        function _listItemsRecursive(folder) {
                var files = folder.getFiles();
                var subfolders = folder.getFolders();
                while(files.hasNext()) {
                    items.push(files.next());
                }
                while(subfolders.hasNext()) {
                    _listItemsRecursive(subfolders.next());
                }
                items.push(folder);
        }
        _listItemsRecursive(folder); 
        return items;
    }
    
    // Get all the items which don't already belong to the superuser
    var getRestrictedItems = function(items) {
        var restrictedItems = [];
        for(i = 0; i < items.length; i++) {
            var item = items[i];
            var userEmail = item.getOwner().getEmail();
            if(userEmail != superUserEmail) {
                restrictedItems.push(item);
            }
        }
        return restrictedItems;
    }
    
    // Change ownership to superuser
    var changeItemOwner = function(items) {
        for(i = 0; i < items.length; i++) {
            var item = items[i];
    
            item.setOwner(superUserEmail); //This obviously doesn't work
    
        }
    }
    
    function doGet() {
        var items = listItems(folderObject);
        var restrictedItems = getRestrictedItems(items)
        changeItemOwner(restrictedItems);
    }
    

    关于所有权的实际更改,this post提出了解决方案,但使用了弃用的方法。

    function changeOwner(newOwnerEmail, file)
    {
      var fileId = file.getId();
      var oldOwnerEmail = file.getOwner().getEmail();
    
      if (oldOwnerEmail == newOwnerEmail) { return; }
    
      file.removeEditor(newOwnerEmail);  //should this be oldOwnerEmail?
      var base = 'https://docs.google.com/feeds/';
    
      var options = OAuthApp.getAuth('docs');
    
      options.method = 'POST';
      var rawXml = "<entry xmlns='http://www.w3.org/2005/Atom' xmlns:gAcl='http://schemas.google.com/acl/2007'>"
          +"<category scheme='http://schemas.google.com/g/2005#kind' "
          +"term='http://schemas.google.com/acl/2007#accessRule'/>"
          +"<gAcl:role value='owner'/>"
          +"<gAcl:scope type='user' value='"+newOwnerEmail+"'/>"
          +"</entry>";
      options.payload = rawXml;
      options.contentType = 'application/atom+xml';
    
      var API_KEY = getAPIKey();  
      var url = base + oldOwnerEmail+'/private/full/'+fileId+'/acl?v=3&alt=json&key='+API_KEY
    
      try 
      { 
        var result = UrlFetchApp.fetch(url, options);
        docsObject  = Utilities.jsonParse(result.getContentText());
      }
      catch (err) { Logger.log(err.message) }
    
    }//end changeOwner()
    

    问题

    我正在寻找的是有人指导我将changeOwner功能更新为可运行和使用Drive API的功能。我已经实现了一个并且有一个可行的解决方案,我计划编写一个详细的分步教程,帮助其他人试图让这个工作。

0 个答案:

没有答案