web-dev-qa-db-fra.com

Déplacer des fichiers dans Google Drive à l'aide de Google Script

J'essaie de créer des documents en utilisant les informations publiées via les formulaires Google, puis une fois le document créé, je voudrais déplacer le document dans un dossier partagé pour que les gens puissent le voir.

Pour le moment, j'ai le script qui prend toutes les informations de la feuille de calcul liée Google Forms.

En utilisant ces informations, j'utilise le code suivant pour créer le document:

  var targetFolder = DriveApp.getFolderById(TARGET_FOLDER_ID);
  var newDoc = DocumentApp.create(requestID + " - " + requestSummary);

Cela crée le document avec succès dans mon dossier racine Google Drive, mais je n'arrive pas à le déplacer où je veux le déplacer.

J'ai vu beaucoup de messages suggérant d'utiliser des choses comme targetFolder.addFile (newDoc) mais cela ne fonctionne pas, de même j'ai vu des exemples comme newDoc.addToFolder (targetFolder) mais encore une fois cela ne fonctionne pas pour moi.

Il semble que toutes les questions en ligne que les gens ont déjà posées à ce sujet utilisent les versions d'API précédentes qui ne sont plus applicables et ces méthodes ne s'appliquent pas à la nouvelle fonctionnalité DriveApp.

Ce que je voudrais, si possible, est de créer le nouveau document comme ci-dessus afin que je puisse éditer le contenu en utilisant le script, puis pouvoir déplacer ce fichier vers un dossier partagé. (D'après ce que je comprends, il n'y a pas de fonction "déplacer" pour le moment, donc faire une copie et supprimer l'ancienne suffira).

14
S Woodhouse

Si nous faisons une copie du fichier et que nous supprimons l'original, cela changerait l'URL du fichier et les paramètres de partage de fichiers ne seront pas conservés.

Dans Drive, il est possible de ajouter un fichier à plusieurs dossiers avec la méthode .addFolder () du service DriveApp. Vous pouvez ajouter le fichier au dossier cible, puis supprimer le fichier du dossier parent immédiat.

function moveFiles(sourceFileId, targetFolderId) {
  var file = DriveApp.getFileById(sourceFileId);
  file.getParents().next().removeFile(file);
  DriveApp.getFolderById(targetFolderId).addFile(file);
}
20
Amit Agarwal

Ceci est mon premier message posté! Je sais que cela a été répondu plusieurs fois, mais j'ai rencontré cette question en travaillant sur mon projet, et en examinant la documentation Apps Script, j'ai trouvé un moyen concis de le faire. Une variation de la réponse de some1.

var file = DriveApp.getFileById(fileid);
DriveApp.getFolderById(folderid).addFile(file);
DriveApp.getRootFolder().removeFile(file);

J'espère que ça aide!

11
Aaron McKeehan

Il n'y a pas de méthode directe dans les classes File ou Folder pour déplacer des fichiers d'un dossier dans Google Drive vers un autre. Comme vous l'avez mentionné, vous pouvez copier le fichier dans un autre dossier avec la méthode makeCopy () puis le supprimer avec setTrashed () , le code devrait ressembler à ceci:

  var targetFolder = DriveApp.getFolderById(TARGET_FOLDER_ID);
  var newDoc = DocumentApp.create(requestID + " - " + requestSummary); // Creates the Document in the user's Drive root folder

  // Modify the new document here, example:
  // var body = newDoc.getBody();
  // body.appendParagraph("A paragraph.");
  // newDoc.saveAndClose();

  var driveFile = DriveApp.getFileById(newDoc.getId()); // Gets the drive File

  driveFile.makeCopy(newDoc.getName(), targetFolder); // Create a copy of the newDoc in the shared folder
  driveFile.setTrashed(true);  //  sets the file in the trash of the user's Drive

MODIFIER:

Dans un second temps et en tenant compte des commentaires de Ruben. Je conviens qu'il est préférable de mettre en œuvre la réponse d'Amit.

2
ocordova

Une approche un peu plus sûre par rapport aux précédentes:

  1. Si vous supprimez d'abord le lien vers le fichier, vous ne pourrez pas ajouter de fichier.

  2. Si le fichier se trouve déjà dans le dossier cible, l'approche fournie par Amit ( https://stackoverflow.com/a/38810986/11912486 ) ne supprime que le fichier.

Je suggère donc d'utiliser l'approche suivante:

function move_file(file_id, target_folder_id) {
  var source_file = DriveApp.getFileById(file_id);
  var source_folder = source_file.getParents().next();
  if (source_folder.getId() != target_folder_id) {
    DriveApp.getFolderById(target_folder_id).addFile(source_file);
    source_folder.removeFile(source_file);
  }
}

peut être amélioré par:

  • style chameau javascript

  • validation de plusieurs emplacements

1
aadral

Essaye ça:

var file = DriveApp.getFileById(newDoc.getId());
targetFolder.addFile(file);
//DriveApp.getFolderById('root').removeFile(file); // remove from root
0
some1

Cette question a été répondue, mais voici une configuration légèrement différente:

function moveFile(parameterObject) {
  var currentFolderID,file,fileToMoveID,sourceFolder,targetFolder,targetFolderID;

  fileToMoveID = parameterObject.fileToMoveID;
  currentFolderID = parameterObject.currentFolderID;
  targetFolderID = parameterObject.targetFolderID;

  file = DriveApp.getFileById(fileToMoveID);//Get the file to move

  if (!file) {
    functionToHandleThisKindOfThing("there is no file");
    return;
  }

  if (currentFolderID) {//The folder ID holding the current file was passed in
    sourceFolder = DriveApp.getFolderById(currentFolderID);
  } else {//No ID for the current folder
    sourceFolder = file.getParents();
    if (sourceFolder) {
      if (sourceFolder.hasNext()) {
        sourceFolder = sourceFolder.next();
      }
    }
  }

  targetFolder = DriveApp.getFolderById(targetFolderID);

  targetFolder.addFile(file);
  sourceFolder.removeFile(file);
}

function testCode() {
  var o;

  o = {
    'fileToMoveID':"File ID of file to Move",
    "targetFolderID":"ID of folder to Move to"
  }

  moveFile(o);

}
0
Alan Wells