问题
使用Google Apps的组织没有简单的解决方案来创建中央“文件服务器”,用户可能会在其中添加文件,从而丧失其对存储库的所有权。问题主要在于Google没有为组织提供中央文件存储选项。
当前解决方法
有几种解决方法可以解决这个问题。
如this article中所述,组织可以创建“存储”用户并使用它来构建所需的文件夹结构(市场营销,运营等)。只要正确配置了共享设置,这些文件夹就可以与组织内的相应用户共享,并且他们添加到这些文件夹的文件对其他用户可见。此选项的问题是添加到文件服务器的文件仍归用户所有,最终会计入其存储配额。
作为described here,存在付费的Google云端硬盘附加组件,例如允许组织实现此目的的AODocks。
Several fragments of solutions mentioning the使用Google Apps脚本,Domain-Wide Delegation of Authority和Drive API ,但所有都已过时(参考已弃用的文档列表API)或不完整。几乎没有理解Google Developer工具的新手用户会感到困惑。
目标
创建一个简单且免费的解决方案,该解决方案使用“存储”用户的云端硬盘空间作为组织用户的中央文件服务器。
要件
正在进行的解决方案
我已经开始编写部分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的功能。我已经实现了一个并且有一个可行的解决方案,我计划编写一个详细的分步教程,帮助其他人试图让这个工作。