Trasferisci la proprietà di un file a un altro utente in Google Apps Script

Ho creato una piccola interfaccia utente di caricamento che includo in una pagina di Google Sites. Permette all’utente di caricare un documento. Poiché lo script è pubblicato, viene eseguito sotto il mio account e il file caricato viene caricato nella mia unità di google. Posso dallo script app aggiungere la persona che ha caricato il file come editor, ma quello che vorrei fare è renderli proprietari di un file. (dallo script app puoi fare un .getOwner () su un file … ma non un .setOwner () ….. qualcuno sa una soluzione?

Purtroppo la modifica del proprietario di un file non è supportata in Apps Script. Il problema 74 è una richiesta di funzionalità per aggiungere questa capacità e, se il problema è stato risolto, mostrerai il tuo supporto per la funzione e riceverai una notifica degli aggiornamenti.

——MODIFICATO——

Ora c’è un pratico metodo chiamato setOwner, che può essere trovato qui: https://developers.google.com/apps-script/reference/drive/file#setOwner(User)

C’è anche la possibilità di passare l’indirizzo email del nuovo proprietario invece dell’object User, che è ancora più utile in alcuni casi: https://developers.google.com/apps-script/reference/drive/file#setOwner(String)

Aggiornato il 12 settembre 2016:

Questo codice utilizza un account di servizio a cui è stata assegnata la Delega di autorità a livello di dominio di Google Apps . Ciò ti consente di cambiare il proprietario di qualsiasi file di proprietà di qualsiasi utente sul dominio. Questo codice utilizza la libreria Google apps-script-oauth2 di Eric Koleda.

 var PRIVATE_KEY = PropertiesService.getScriptProperties().getProperty('PRIVATE_KEY'); var CLIENT_EMAIL = PropertiesService.getScriptProperties().getProperty('CLIENT_EMAIL'); /** * Transfers ownership of a file or folder to another account on the domain. * * @param {String} fileId The id of the file or folder * @param {String} ownerEmail The email address of the new owner. */ function transferOwnership(fileId, ownerEmail) { var file = DriveApp.getFileById(fileId); var currentOwnerEmail = file.getOwner().getEmail(); //the user that we need to impersonate var service = getService(currentOwnerEmail); if (service.hasAccess()) { var url = 'https://www.googleapis.com/drive/v2/files/' + fileId + '/permissions'; var payload = {value: ownerEmail, type: 'user', role: 'owner'}; var options = {method: "post", contentType: "application/json", headers : { Authorization: 'Bearer ' + service.getAccessToken() }, payload: JSON.stringify(payload)//, ,muteHttpExceptions: true }; //debugger; //throw 'test my errors'; var response = UrlFetchApp.fetch(url, options); if (response.getResponseCode() === 200 || (response.getResponseCode() === 400 && response.getContentText().indexOf('were successfully shared')) ) { return response.getContentText(); } if (response.getResponseCode() === 401 && response.getContentText().indexOf('Invalid Credentials')) { throw 'Unable to transfer ownership from owner ' + currentOwnerEmail + ' ... ' + 'Please make sure the file\'s owner has a Google Apps license (and not a Google Apps Vault - Former Employee license) and try again.'; } throw response.getContentText(); } else { throw service.getLastError(); } } /** * Reset the authorization state, so that it can be re-tested. */ function reset() { var service = getService(); service.reset(); } /** * Configures the service. */ function getService(userEmail) { return OAuth2.createService('GoogleDrive:' + userEmail) // Set the endpoint URL. .setTokenUrl('https://accounts.google.com/o/oauth2/token') // Set the private key and issuer. .setPrivateKey(PRIVATE_KEY) .setIssuer(CLIENT_EMAIL) // Set the name of the user to impersonate. This will only work for // Google Apps for Work/EDU accounts whose admin has setup domain-wide // delegation: // https://developers.google.com/identity/protocols/OAuth2ServiceAccount#delegatingauthority .setSubject(userEmail) // Set the property store where authorized tokens should be persisted. .setPropertyStore(PropertiesService.getScriptProperties()) // Set the scope. This must match one of the scopes configured during the // setup of domain-wide delegation. .setScope('https://www.googleapis.com/auth/drive'); } 

Vecchia risposta (obsoleta ora che l’API dell’elenco documenti è obsoleta):

Puoi ottenerlo nello script di Google Apps accedendo all’API dell’elenco documenti utilizzando il protocollo xml di atom raw. Devi essere un super amministratore del dominio. Ecco un esempio che funziona per me:

 /** * Change Owner of a file or folder * Run this as admin and authorise first in the script editor. */ function changeOwner(newOwnerEmail, fileOrFolderId){ var file = DocsList.getFileById(fileOrFolderId); var oldOwnerEmail = file.getOwner().getEmail(); if (oldOwnerEmail === newOwnerEmail) { return; } file.removeEditor(newOwnerEmail); var base = 'https://docs.google.com/feeds/'; var fetchArgs = googleOAuth_('docs', base); fetchArgs.method = 'POST'; var rawXml = "" +"" +"" +"" +""; fetchArgs.payload = rawXml; fetchArgs.contentType = 'application/atom+xml'; var url = base + encodeURIComponent(oldOwnerEmail) + '/private/full/'+fileOrFolderId+'/acl?v=3&alt=json'; var content = UrlFetchApp.fetch(url, fetchArgs).getContentText(); } //Google oAuth function googleOAuth_(name,scope) { var oAuthConfig = UrlFetchApp.addOAuthService(name); oAuthConfig.setRequestTokenUrl("https://www.google.com/accounts/OAuthGetRequestToken?scope="+scope); oAuthConfig.setAuthorizationUrl("https://www.google.com/accounts/OAuthAuthorizeToken"); oAuthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken"); oAuthConfig.setConsumerKey("anonymous"); oAuthConfig.setConsumerSecret("anonymous"); return {oAuthServiceName:name, oAuthUseToken:"always"}; } 

Prova questo! (Almeno ha funzionato per me)

 var newFolder = DriveApp.createFolder(folderName).addEditor(ownerEmail).setOwner(ownerEmail).addEditor(group.getEmail()).removeEditor(Session.getActiveUser().getEmail()); 

Quanto sopra crea una cartella e aggiunge un nuovo editor, imposta il nuovo editor come proprietario, aggiunge un altro gruppo agli editor e infine rimuove l’utente che ha appena creato la cartella dagli editor.

Ho capito un work-around – non sono sicuro se sia esattamente quello che stai cercando. Basta dare l’accesso all’account a cui desideri trasferire la proprietà. Accedi al documento / modulo / ecc. da tale account e quindi fare una copia di detto documento. Ora sei il proprietario. Dovrai invitare di nuovo gli altri.