Martin Prejean
Martin Prejean

Reputation: 23

Google Apps Script - Impossible operation with an element inside a shared drive

I need your help on something.

I did a function which goal is to make a copy of a template file and put it in a folder in a shared drive. The problem is that the program returns :

"Exception: This operation cannot be performed on an item in a shared Drive"

Yet, I have all the permissions in that shared drive so I don't understand.

I did several tweaks and I've founded that removeFile and addFile are parts of the problem. If I don't run them, the folder is created and the copy is made. But I still need the file to be moved.

I hope someone can help me with this.

PS : You can fin my code below.

function makeCopyFile(folderID, fileID, newName) {
  var getFolder = DriveApp.getFolderById(folderID);
  var file = DriveApp.getFileById(fileID);
  var copyFile = file.makeCopy();
  var newFile = copyFile.setName(newName);
  
  // Remove the file from all parent folders
  var parents = newFile.getParents();
  while (parents.hasNext()) {
    var parent = parents.next();
    parent.removeFile(newFile);
  }
  getFolder.addFile(newFile);
};

Upvotes: 2

Views: 335

Answers (1)

ziganotschka
ziganotschka

Reputation: 26806

The problem is that you are trying to delete a file on a shared drive with DriveApp

It will work if you do it instead with the Advanced Drive service where you can specify "supportsAllDrives": true

So, after enabling the Advanced Service: replace

  var parents = newFile.getParents();
  while (parents.hasNext()) {
    var parent = parents.next();
    parent.removeFile(newFile);
  }

through

  var id = copyFile.getId();
  // or alternatively  `var id = newFile.getId();` - because it is the same
  Drive.Files.remove(id,{"supportsAllDrives": true})

As for getFolder.addFile(newFile);

Once you remove a file, you cannot add it back anymore. Also, I do not understand your motivation for it - copyFile.setName(newName); is enough to rename the file - you do not need to delete the file with the old name and insert the one with the new name.

UPDATE

If your goal is to copy a file to a team drive folder, you can do it easily as following with the Drive API:

function  makeCopyFile(folderID, fileID, newName){
  var resource = {
  "parents": [
    {
      "id": folderID
    }
  ],
  "title": newName
}
  Drive.Files.copy(resource, fileID, {"supportsAllDrives": true})
}

Upvotes: 1

Related Questions