Dateien aus Google Formulare in Google Drive hochladen

Programmierstufe: Anfänger
Dauer: 10 Minuten
Projekttyp: Automatisierung mit einem ereignisgesteuerten Trigger

Zielsetzungen

  • Verstehen Sie, was die Lösung leisten kann.
  • Was die Apps Script-Dienste innerhalb der Lösung leisten
  • Richten Sie das Skript ein.
  • Führen Sie das Skript aus.

Informationen zu dieser Lösung

Mit Google Formulare können Sie Dateien gleichzeitig in Google Drive hochladen und organisieren. Das Formular enthält Eingaben für die hochzuladenden Dateien und für die Organisation der Dateien.

Screenshot des Formulars zum Hochladen von Dateien

Funktionsweise

Eine Einrichtungsfunktion erstellt einen Ordner zum Speichern aller hochgeladenen Dateien und einen Trigger, der jedes Mal ausgelöst wird, wenn ein Nutzer das Formular sendet. Wenn ein Nutzer das Formular ausfüllt, wählt er die hochzuladenden Dateien und einen Unterordner aus, in dem die Dateien gespeichert werden sollen. Sobald der Nutzer das Formular gesendet hat, leitet das Skript die Dateien an den entsprechenden Unterordner weiter. Wenn der Ordner noch nicht vorhanden ist, wird er vom Skript erstellt.

Apps Script-Dienste

Diese Lösung verwendet die folgenden Dienste:

  • Skriptdienst: Erstellt den Trigger, der jedes Mal ausgelöst wird, wenn ein Nutzer das Formular sendet.
  • Attribute-Dienst: Speichert die ID des Triggers, den das Skript während der Einrichtung erstellt, um doppelte Trigger zu vermeiden.
  • Drive-Dienst: Ruft während der Einrichtung den Speicherort des Formulars in Drive ab und erstellt am selben Speicherort einen Ordner. Wenn ein Nutzer das Formular sendet, leitet der Drive-Dienst die Dateien an diesen Ordner und, falls ausgewählt, an einen bestimmten Unterordner weiter. Wenn der Unterordner noch nicht vorhanden ist, wird er vom Skript erstellt.
  • Google Formulare-Dienst: Ruft die Dateien und den Ordnernamen ab, die der Nutzer nach dem Senden des Formulars ausgewählt hat, und sendet es an den Drive-Dienst.

Voraussetzungen

Sie benötigen die folgenden Voraussetzungen, um dieses Beispiel verwenden zu können:

  • Ein Google-Konto (Google Workspace-Konten erfordern möglicherweise die Administratorgenehmigung).
  • Ein Webbrowser mit Zugang zum Internet.

Skript einrichten

Formular erstellen

  1. Rufen Sie forms.google.com auf und klicken Sie auf „Leer“ .
  2. Klicken Sie auf Unbenanntes Formular und benennen Sie das Formular in Dateien in Google Drive hochladen um.
  3. Klicken Sie auf Unbenannte Frage und benennen Sie die Frage in Unterordner um.
  4. Klicken Sie bei der Frage zum Unterordner auf das Dreipunkt-Menü > Beschreibung.
  5. Geben Sie unter Beschreibung Folgendes ein: Wählen Sie den Unterordner aus, in dem Ihre Dateien gespeichert werden sollen. Wenn Sie <None> auswählen, werden die Dateien im Ordner „Hochgeladene Dateien“ gespeichert.
  6. Fügen Sie der Frage Unterordner die folgenden Optionen hinzu:
    • <keine>
    • Projekt A
    • Projekt B
    • Projekt C
  7. Wenn Sie die Frage als Pflichtfeld festlegen möchten, klicken Sie auf Erforderlich.
  8. Klicken Sie auf „Frage hinzufügen“ .
  9. Klicken Sie auf Multiple-Choice-Frage und wählen Sie Datei hochladen aus.
  10. Klicken Sie auf Weiter.
  11. Geben Sie unter Question (Frage) Files to Upload (Dateien zum Hochladen) ein. Sie können die Dateitypen und die maximale Anzahl von Dateien auswählen.
  12. Wenn Sie die Frage als Pflichtfeld festlegen möchten, klicken Sie auf Erforderlich.

Apps Script-Projekt erstellen

  1. Klicken Sie im Formular auf das Dreipunkt-Menü > Skripteditor.
  2. Klicken Sie auf Unbenanntes Projekt und benennen Sie das Projekt in Dateien in Drive hochladen um.
  3. Wenn Sie eine weitere Skriptdatei erstellen möchten, klicken Sie auf „Datei hinzufügen“ > Skript. Nennen Sie die Datei Setup.
  4. Ersetzen Sie den Inhalt beider Skriptdateien durch den folgenden Inhalt:

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

Skript ausführen

  1. Wechseln Sie im Apps Script-Editor zur Datei Setup.gs.
  2. Wählen Sie im Drop-down-Menü der Funktion setUp aus.
  3. Klicken Sie auf Ausführen.
  4. Autorisieren Sie das Skript, wenn Sie dazu aufgefordert werden. Wenn auf dem OAuth-Zustimmungsbildschirm die Warnung Diese Anwendung wurde nicht überprüft angezeigt wird, wählen Sie Erweitert > Zu {Projektname} (unsicher) aus.

  5. Kehren Sie zum Formular zurück und klicken Sie auf „Vorschau“ Vorschausymbol.

  6. Wählen Sie im Formular einen Unterordner aus und laden Sie eine Datei hoch.

  7. Klicke auf Senden.

  8. Gehen Sie zu Google Drive und öffnen Sie den Ordner Dateien in Drive hochladen (Dateiantworten). Die hochgeladenen Dateien befinden sich in dem Unterordner, den Sie im Formular ausgewählt haben.

Beitragende

Dieses Beispiel wird von Google mit Unterstützung von Google Developers-Experten verwaltet.

Nächste Schritte