2013-01-02 127 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()