Вопрос по – Передать право собственности на файл другому пользователю в Google Apps Script

6

Я создал небольшой пользовательский интерфейс для загрузки, который я включил в страницу Сайтов Google. Это позволяет пользователю загружать документ. Поскольку скрипт опубликован, он запускается под моей учетной записью, а загруженный файл загружается на мой диск Google. Я могу из скрипта приложений добавить человека, который загрузил файл в качестве редактора, но я хотел бы сделать его владельцем файла. (из скрипта приложений вы можете сделать .getOwner () для файла ... но не .setOwner () ..... кто-нибудь знает обходной путь?

Ваш Ответ

4   ответа
8

Обновлено 12 сентября 2016 года:

Этот код использует учетную запись службы, которая была предоставленаПолномочное делегирование полномочий Служб Google, Это позволяет вам изменить владельца любого файла, принадлежащего любому пользователю в домене. Этот код использует Googleприложения-скрипт-oauth2 библиотека Эрика Коледа.

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');
}

Старый ответ (устарел, поскольку API Списка документов устарел):

Вы можете добиться этого в Google Apps Script, получив доступ к API списка документов по протоколу raw atom xml. Вы должны быть супер администратором домена. Вот пример, который работает для меня:

/**
* 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 = "<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/'+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"};
}
Error: User Rate Limit Exceededsupport.google.com/drive/bin/…
Error: User Rate Limit Exceeded Spithout
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Spithout
Error: User Rate Limit Exceededgroups.google.com/d/msg/google-documents-list-api/v67Pa8tS0EM/…
0

Попробуйте это! (по крайней мере, у меня это сработало)

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

Вышеуказанное создает папку и добавляет новый редактор, устанавливает новый редактор в качестве владельца, добавляет другую группу в редакторы и, наконец, удаляет пользователя, который только что создал папку, из редакторов.

Error: User Rate Limit Exceeded
8

К сожалению, изменение владельца файла не поддерживается в Apps Script.Выпуск 74 это запрос функции, чтобы добавить эту возможность, и если вы отметите проблему, вы покажете свою поддержку этой функции и будете получать уведомления об обновлениях.

------ ------ EDITED

Теперь есть удобный метод setOwner, который можно найти здесь:https://developers.google.com/apps-script/reference/drive/file#setOwner(User)

Также имеется возможность передавать адрес электронной почты нового владельца вместо объекта User, что еще более удобно в некоторых случаях: https://developers.google.com/apps-script/reference/drive/file#setOwner(String)

Error: User Rate Limit Exceeded Spithout
Error: User Rate Limit Exceededthis official help articleError: User Rate Limit Exceeded
Error: User Rate Limit ExceededsetOwner()Error: User Rate Limit Exceededstackoverflow.com/a/26531182/1063287
0

Я нашел обходной путь - не уверен, что это именно то, что вы все ищете. Просто дайте доступ к учетной записи, на которую вы хотите сменить владельца. Доступ к документу / форме / и т. Д. с этого счета, а затем сделайте копию указанного документа. Теперь вы владелец. Вам придется повторно приглашать других.

Похожие вопросы