2013-01-02 126 views
1

此处新增了StackOverflow和Google Apps脚本。我感谢任何帮助/指导。在Google文档中更改文档所有者的脚本

任务:

我想写一个谷歌Apps脚本,将在指定的文件夹传输的所有文件的所有权转让给一个老板。我是Google Apps专业版帐户的超级用户。但是,我将不是原所有者或新所有者,并且出于安全原因,新所有者不能成为超级管理员(并因此运行脚本)。原始和新的所有者都在同一个域中。

我发现following code,我已经使用和调整了我的目的,但我得到“请求失败,返回代码400.服务器响应:”来自URLFetchApp调用的错误。

我做了什么:

Google Apps Documents List developers guide我改变了 “基地” 变量来冒充新文档所有者:

var base = 'https://docs.google.com/feeds/'; 

var base = encodeURIComponent('https://docs.google.com/feeds/'+newOwnerEmail+'/private/full'); 

我还将消费者密钥和秘密更新为googleOAuth_()方法中的正确值。就这样,在这里是领先并包括向有问题的代码行全部:

file.removeEditor(newOwnerEmail); 
    var base = encodeURIComponent('https://docs.google.com/feeds/'+newOwnerEmail+'/private/full'); 
    var fetchArgs = googleOAuth_('docs', base); 
    fetchArgs.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>"; 
    fetchArgs.payload = rawXml; 
    fetchArgs.contentType = 'application/atom+xml'; 
    var url = base + encodeURIComponent(oldOwnerEmail + '/private/full/'+fileId+'/acl&alt=json'); 

    try { var content = UrlFetchApp.fetch(url, fetchArgs).getContentText(); } 
    catch (err) { Logger.log(err.message) } 

每次应用程序“尝试”来执行UrlFetchApp.fetch()的方法,该应用程序“捕获”的400错误。

问题:

什么可能我会丢失吗? “fetchArgs”以某种方式变形(可能是“fetchArgs”正在馈送的“rawXML”)?有了新的Google Drive SDK,使用这个API是一个更好的选择吗?我很感谢我可能错过的任何指导或资源,以及改进如何提出这些问题的任何提示。提前致谢。

回答

1

解决了这个问题。

我删除了encodeURIComponent()方法,这显然不需要URL。我还使用OAuthApp库(found here)开始构建URLFetchApp.fetch()方法的提取选项。我不确定是否只有一个或两个这些修复程序解决了这个问题,但脚本现在一直运行,所以我是一个快乐的人。

完全更新下面的代码:

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()