فایل‌ها را از Google Forms در Google Drive آپلود کنید

سطح کدنویسی : مبتدی
مدت زمان : 10 دقیقه
نوع پروژه : اتوماسیون با یک ماشه رویداد محور

اهداف

  • درک کنید که راه حل چه کاری انجام می دهد.
  • آنچه را که سرویس های Apps Script در راه حل انجام می دهند، بدانید.
  • اسکریپت را تنظیم کنید
  • اسکریپت را اجرا کنید.

در مورد این راه حل

همزمان با استفاده از Google Forms فایل ها را در Google Drive آپلود و سازماندهی کنید. این فرم شامل ورودی هایی برای آپلود فایل ها و نحوه سازماندهی فایل ها می باشد.

اسکرین شات فرم برای آپلود فایل ها

چگونه کار می کند

یک تابع راه‌اندازی یک پوشه برای ذخیره همه فایل‌های آپلود شده ایجاد می‌کند و یک ماشه که هر بار که شخصی فرم را ارسال می‌کند فعال می‌شود. هنگامی که کاربر فرم را پر می کند، فایل ها را برای آپلود و یک زیرپوشه را برای ذخیره فایل ها انتخاب می کند. هنگامی که کاربر فرم را ارسال کرد، اسکریپت فایل ها را به زیرپوشه مربوطه هدایت می کند. اگر پوشه هنوز وجود نداشته باشد، اسکریپت آن را ایجاد می کند.

خدمات اسکریپت برنامه ها

این راه حل از خدمات زیر استفاده می کند:

  • سرویس اسکریپت – ماشه ای را ایجاد می کند که هر بار که شخصی فرم را ارسال می کند فعال می شود.
  • سرویس Properties - شناسه تریگر را که اسکریپت در حین راه اندازی ایجاد می کند ذخیره می کند تا از تریگرهای تکراری جلوگیری کند.
  • سرویس Drive - در حین راه اندازی، مکان فرم را در Drive دریافت می کند و یک پوشه در همان مکان ایجاد می کند. هنگامی که کاربر فرم را ارسال می کند، سرویس Drive فایل ها را به آن پوشه و در صورت انتخاب، یک زیرپوشه تعیین شده را هدایت می کند. اگر زیرپوشه هنوز وجود نداشته باشد، اسکریپت آن را ایجاد می کند.
  • سرویس فرم ها – فایل ها و نام پوشه ای را که کاربر پس از ارسال فرم انتخاب کرده و به سرویس Drive ارسال می کند، دریافت می کند.

پیش نیازها

برای استفاده از این نمونه به پیش نیازهای زیر نیاز دارید:

  • یک حساب Google (حساب‌های Google Workspace ممکن است به تأیید سرپرست نیاز داشته باشند).
  • یک مرورگر وب با دسترسی به اینترنت.

اسکریپت را تنظیم کنید

فرم را ایجاد کنید

  1. به forms.google.com بروید و روی Blank کلیک کنید.
  2. روی فرم بدون عنوان کلیک کنید و نام فرم را به آپلود فایل‌ها در Drive تغییر دهید.
  3. روی سوال بدون عنوان کلیک کنید و نام آن را به زیرپوشه تغییر دهید.
  4. در سؤال زیرپوشه ، روی More > توضیحات کلیک کنید.
  5. برای توضیحات ، پوشه فرعی را برای ذخیره فایل‌هایتان انتخاب کنید. اگر <هیچ‌کدام> را انتخاب کنید، فایل‌ها در پوشه فایل‌های آپلود شده ذخیره می‌شوند.
  6. گزینه های زیر را به سوال زیر پوشه اضافه کنید:
    • <هیچ>
    • پروژه A
    • پروژه B
    • پروژه سی
  7. برای ایجاد سوال مورد نیاز، روی Required کلیک کنید.
  8. روی افزودن سوال کلیک کنید.
  9. روی گزینه Multiple کلیک کنید و بارگذاری فایل را انتخاب کنید.
  10. روی Continue کلیک کنید.
  11. برای سوال ، فایل ها را برای آپلود وارد کنید. می‌توانید انواع فایل‌ها و حداکثر تعداد فایل‌هایی را که می‌خواهید به افراد اجازه آپلود را بدهید، انتخاب کنید.
  12. برای ایجاد سوال مورد نیاز، روی Required کلیک کنید.

پروژه Apps Script را ایجاد کنید

  1. از فرم، روی More > ویرایشگر اسکریپت کلیک کنید.
  2. پروژه Untitled را کلیک کنید و نام پروژه را به آپلود فایل در Drive تغییر دهید.
  3. برای ایجاد یک فایل اسکریپت دیگر، روی Add a file > Script کلیک کنید. نام فایل را Setup .
  4. محتوای هر دو فایل اسکریپت را با محتوای زیر جایگزین کنید:

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

اسکریپت را اجرا کنید

  1. در ویرایشگر Apps Script، به فایل Setup.gs بروید.
  2. در منوی تابع، setUp انتخاب کنید.
  3. روی Run کلیک کنید.
  4. وقتی از شما خواسته شد، اسکریپت را مجاز کنید. اگر صفحه رضایت OAuth اخطار را نشان می‌دهد، این برنامه تأیید نشده است ، با انتخاب پیشرفته > رفتن به {Project Name} (ناامن) ادامه دهید.

  5. به فرم برگردید و روی Preview کلیک کنید نماد پیش نمایش .

  6. در فرم، یک زیرپوشه را انتخاب کنید و یک فایل را آپلود کنید.

  7. روی ارسال کلیک کنید.

  8. به Drive بروید و پوشه Upload files to Drive (File Responses) را باز کنید. فایل های آپلود شده شما در زیر پوشه ای که در فرم انتخاب کرده اید قرار دارند.

مشارکت کنندگان

این نمونه توسط گوگل با کمک کارشناسان توسعه دهنده گوگل نگهداری می شود.

مراحل بعدی