Importer des fichiers dans Google Drive à partir de Google Forms

Niveau de codage: Débutant
Durée: 10 minutes
Type de projet: Automatisation avec un déclencheur basé sur les événements

Objectifs

  • Comprendre ce que la solution fait
  • Comprendre ce que font les services Apps Script dans la solution.
  • Configurez le script.
  • Exécutez le script.

À propos de cette solution

importer et organiser simultanément des fichiers dans Google Drive à l'aide de Google Forms ; Le formulaire inclut des entrées pour les fichiers à importer et pour la façon dont ils doivent être organisés.

Capture d'écran du formulaire permettant d'importer des fichiers

Fonctionnement

Une fonction de configuration crée un dossier pour stocker tous les fichiers importés, ainsi qu'un déclencheur qui s'active chaque fois qu'un utilisateur envoie le formulaire. Lorsqu'un utilisateur remplit le formulaire, il choisit les fichiers à importer et un sous-dossier dans lequel les stocker. Une fois que l'utilisateur envoie le formulaire, le script achemine les fichiers vers le sous-dossier correspondant. Si le dossier n'existe pas encore, le script le crée.

Services Apps Script

Cette solution utilise les services suivants:

  • Service de script : crée le déclencheur qui se déclenche chaque fois qu'un utilisateur envoie le formulaire.
  • Service des propriétés : stocke l'ID du déclencheur créé par le script lors de la configuration pour éviter les déclencheurs en double.
  • Service Drive : lors de la configuration, récupère l'emplacement du formulaire dans Drive et crée un dossier au même emplacement. Lorsqu'un utilisateur envoie le formulaire, le service Drive achemine les fichiers vers ce dossier et, si l'option est sélectionnée, vers un sous-dossier désigné. Si le sous-dossier n'existe pas encore, le script le crée.
  • Service Forms : récupère les fichiers et le nom du dossier que l'utilisateur a choisis après l'envoi du formulaire, puis les envoie au service Drive.

Prérequis

Pour utiliser cet exemple, vous devez remplir les conditions préalables suivantes:

  • Un compte Google (l'approbation de l'administrateur peut être nécessaire pour les comptes Google Workspace).
  • Un navigateur Web avec accès à Internet

Configurer le script

Créer le formulaire

  1. Accédez à forms.google.com, puis cliquez sur Vide.
  2. Cliquez sur Formulaire sans titre, puis renommez le formulaire Importer des fichiers dans Drive.
  3. Cliquez sur Question sans titre, puis renommez la question Sous-dossier.
  4. Pour la question Sous-dossier, cliquez sur Plus  > Description.
  5. Dans Description, saisissez Sélectionnez le sous-dossier dans lequel stocker vos fichiers. Si vous sélectionnez <Aucun>, les fichiers sont stockés dans le dossier "Fichiers importés".
  6. Ajoutez les options suivantes à la question Sous-dossier :
    • <none>
    • Projet A
    • Projet B
    • Projet C
  7. Pour rendre la question obligatoire, cliquez sur Obligatoire.
  8. Cliquez sur Ajouter une question .
  9. Cliquez sur Choix multiples, puis sélectionnez Importer un fichier.
  10. Cliquez sur Continuer.
  11. Dans Question, saisissez Fichiers à importer. Vous pouvez choisir les types de fichiers et le nombre maximal de fichiers que les utilisateurs peuvent importer.
  12. Pour rendre la question obligatoire, cliquez sur Obligatoire.

Créer le projet Apps Script

  1. Dans le formulaire, cliquez sur Plus  > Éditeur de script.
  2. Cliquez sur Projet sans titre, puis renommez le projet Importer des fichiers dans Drive.
  3. Pour créer un autre fichier de script, cliquez sur Ajouter un fichier  > Script (Ajouter un fichier  > Script). Attribuez le nom suivant au fichier : Setup.
  4. Remplacez le contenu des deux fichiers de script par le contenu suivant:

    Code.gs

    solutions/automations/upload-files/Code.js
    // TODO Before you start using this sample, you must run the setUp() 
    // function in the Setup.gs file.
    
    // Application constants
    const APP_TITLE = "Upload files to Drive from Forms";
    const APP_FOLDER_NAME = "Upload files to Drive (File responses)";
    
    // Identifies the subfolder form item
    const APP_SUBFOLDER_ITEM = "Subfolder";
    const APP_SUBFOLDER_NONE = "<None>";
    
    
    /**
     * Gets the file uploads from a form response and moves files to the corresponding subfolder.
     *  
     * @param {object} event - Form submit.
     */
    function onFormSubmit(e) {
      try {
        // Gets the application root folder.
        var destFolder = getFolder_(APP_FOLDER_NAME);
    
        // Gets all form responses.
        let itemResponses = e.response.getItemResponses();
    
        // Determines the subfolder to route the file to, if any.
        var subFolderName;
        let dest = itemResponses.filter((itemResponse) =>
          itemResponse.getItem().getTitle().toString() === APP_SUBFOLDER_ITEM);
    
        // Gets the destination subfolder name, but ignores if APP_SUBFOLDER_NONE was selected;
        if (dest.length > 0) {
          if (dest[0].getResponse() != APP_SUBFOLDER_NONE) {
            subFolderName = dest[0].getResponse();
          }
        }
        // Gets the subfolder or creates it if it doesn't exist.
        if (subFolderName != undefined) {
          destFolder = getSubFolder_(destFolder, subFolderName)
        }
        console.log(`Destination folder to use:
        Name: ${destFolder.getName()}
        ID: ${destFolder.getId()}
        URL: ${destFolder.getUrl()}`)
    
        // Gets the file upload response as an array to allow for multiple files.
        let fileUploads = itemResponses.filter((itemResponse) => itemResponse.getItem().getType().toString() === "FILE_UPLOAD")
          .map((itemResponse) => itemResponse.getResponse())
          .reduce((a, b) => [...a, ...b], []);
    
        // Moves the files to the destination folder.
        if (fileUploads.length > 0) {
          fileUploads.forEach((fileId) => {
            DriveApp.getFileById(fileId).moveTo(destFolder);
            console.log(`File Copied: ${fileId}`)
          });
        }
      }
      catch (err) {
        console.log(err);
      }
    }
    
    
    /**
     * Returns a Drive folder under the passed in objParentFolder parent
     * folder. Checks if folder of same name exists before creating, returning 
     * the existing folder or the newly created one if not found.
     *
     * @param {object} objParentFolder - Drive folder as an object.
     * @param {string} subFolderName - Name of subfolder to create/return.
     * @return {object} Drive folder
     */
    function getSubFolder_(objParentFolder, subFolderName) {
    
      // Iterates subfolders of parent folder to check if folder already exists.
      const subFolders = objParentFolder.getFolders();
      while (subFolders.hasNext()) {
        let folder = subFolders.next();
    
        // Returns the existing folder if found.
        if (folder.getName() === subFolderName) {
          return folder;
        }
      }
      // Creates a new folder if one doesn't already exist.
      return objParentFolder.createFolder(subFolderName)
        .setDescription(`Created by ${APP_TITLE} application to store uploaded Forms files.`);
    }

    Setup.gs

    solutions/automations/upload-files/Setup.js
    // TODO You must run the setUp() function before you start using this sample.
    
    /** 
     * The setUp() function performs the following:
     *  - Creates a Google Drive folder named by the APP_FOLDER_NAME
     *    variable in the Code.gs file.
     *  - Creates a trigger to handle onFormSubmit events.
     */
    function setUp() {
      // Ensures the root destination folder exists.
      const appFolder = getFolder_(APP_FOLDER_NAME);
      if (appFolder !== null) {
        console.log(`Application folder setup.
        Name: ${appFolder.getName()}
        ID: ${appFolder.getId()}
        URL: ${appFolder.getUrl()}`)
      }
      else {
        console.log(`Could not setup application folder.`)
      }
      // Calls the function that creates the Forms onSubmit trigger.
      installTrigger_();
    }
    
    /** 
     * Returns a folder to store uploaded files in the same location
     * in Drive where the form is located. First, it checks if the folder
     * already exists, and creates it if it doesn't.
     *
     * @param {string} folderName - Name of the Drive folder. 
     * @return {object} Google Drive Folder
     */
    function getFolder_(folderName) {
    
      // Gets the Drive folder where the form is located.
      const ssId = FormApp.getActiveForm().getId();
      const parentFolder = DriveApp.getFileById(ssId).getParents().next();
    
      // Iterates through the subfolders to check if folder already exists.
      // The script checks for the folder name specified in the APP_FOLDER_NAME variable.
      const subFolders = parentFolder.getFolders();
      while (subFolders.hasNext()) {
        let folder = subFolders.next();
    
        // Returns the existing folder if found.
        if (folder.getName() === folderName) {
          return folder;
        }
      }
      // Creates a new folder if one doesn't already exist.
      return parentFolder.createFolder(folderName)
        .setDescription(`Created by ${APP_TITLE} application to store uploaded files.`);
    }
    
    /**
     * Installs trigger to capture onFormSubmit event when a form is submitted.
     * Ensures that the trigger is only installed once.
     * Called by setup().
     */
    function installTrigger_() {
      // Ensures existing trigger doesn't already exist.
      let propTriggerId = PropertiesService.getScriptProperties().getProperty('triggerUniqueId')
      if (propTriggerId !== null) {
        const triggers = ScriptApp.getProjectTriggers();
        for (let t in triggers) {
          if (triggers[t].getUniqueId() === propTriggerId) {
            console.log(`Trigger with the following unique ID already exists: ${propTriggerId}`);
            return;
          }
        }
      }
      // Creates the trigger if one doesn't exist.
      let triggerUniqueId = ScriptApp.newTrigger('onFormSubmit')
        .forForm(FormApp.getActiveForm())
        .onFormSubmit()
        .create()
        .getUniqueId();
      PropertiesService.getScriptProperties().setProperty('triggerUniqueId', triggerUniqueId);
      console.log(`Trigger with the following unique ID was created: ${triggerUniqueId}`);
    }
    
    /**
     * Removes all script properties and triggers for the project.
     * Use primarily to test setup routines.
     */
    function removeTriggersAndScriptProperties() {
      PropertiesService.getScriptProperties().deleteAllProperties();
      // Removes all triggers associated with project.
      const triggers = ScriptApp.getProjectTriggers();
      for (let t in triggers) {
        ScriptApp.deleteTrigger(triggers[t]);
      }
    }
    
    /**
     * Removes all form responses to reset the form.
     */
    function deleteAllResponses() {
      FormApp.getActiveForm().deleteAllResponses();
    }

Exécuter le script

  1. Dans l'éditeur Apps Script, passez au fichier Setup.gs.
  2. Dans le menu déroulant des fonctions, sélectionnez setUp.
  3. Cliquez sur Exécuter.
  4. Lorsque vous y êtes invité, autorisez le script. Si l'écran d'autorisation OAuth affiche l'avertissement Cette application n'est pas validée, sélectionnez Avancé > Accéder à {Nom du projet} (non sécurisé).

  5. Revenez au formulaire et cliquez sur Aperçu Icône Aperçu.

  6. Dans le formulaire, sélectionnez un sous-dossier et importez un fichier.

  7. Cliquez sur Envoyer.

  8. Accédez à Drive et ouvrez le dossier Importer des fichiers dans Drive (réponses par fichier). Les fichiers que vous avez importés se trouvent dans le sous-dossier que vous avez sélectionné dans le formulaire.

Contributeurs

Cet exemple est géré par Google avec l'aide des experts Google pour les développeurs.

Étapes suivantes