Как в Google Apps Script скопировать папку: полное руководство

Google Apps Script предоставляет мощные инструменты для автоматизации задач, связанных с Google Drive. Одной из распространенных задач является копирование папок, что может быть полезно для создания резервных копий, развертывания шаблонов проектов или переноса данных между разными аккаунтами. В этом руководстве мы подробно рассмотрим, как скопировать папку с помощью Google Apps Script, предоставляя конкретные примеры кода и объяснения.

Зачем копировать папки в Google Apps Script?

Копирование папок может быть необходимо в различных сценариях:

  • Резервное копирование данных: Создание копий важных папок для защиты от потери данных.
  • Развертывание шаблонов проектов: Копирование папки с шаблоном проекта для быстрого начала новых проектов, например, при создании рекламных кампаний.
  • Обмен данными между аккаунтами: Перенос папок между разными аккаунтами Google Drive.
  • Создание тестовых сред: Копирование продуктивной папки для создания тестовой среды.
  • Архивирование старых проектов: Создание копий завершенных проектов для архивирования.

Необходимые условия: что вам понадобится

Прежде чем начать, убедитесь, что у вас есть:

  1. Аккаунт Google: Вам понадобится аккаунт Google для доступа к Google Apps Script и Google Drive.
  2. Базовые знания JavaScript: Google Apps Script основан на JavaScript, поэтому базовые знания языка будут полезны.
  3. Доступ к Google Drive API: Убедитесь, что API Google Drive включен в вашем проекте Apps Script. (Обычно включен по умолчанию).

Основы Google Apps Script для работы с папками

Прежде чем перейти к копированию папок, необходимо понимать основные концепции работы с папками в Google Apps Script.

Получение доступа к папкам: Folder и FolderIterator

Для работы с папками в Google Apps Script используются объекты Folder и FolderIterator.

  • Folder: Представляет собой отдельную папку.
  • FolderIterator: Позволяет перебирать папки внутри другой папки.

Пример получения доступа к папке по ID:

/**
 * Получает папку по её ID.
 *
 * @param {string} folderId ID папки.
 * @return {Folder} Объект Folder, если папка найдена, иначе null.
 */
function getFolderById(folderId) {
  try {
    const folder = DriveApp.getFolderById(folderId);
    return folder;
  } catch (e) {
    Logger.log("Папка с ID " + folderId + " не найдена: " + e);
    return null;
  }
}

const myFolder = getFolderById("your_folder_id");
if (myFolder) {
  Logger.log("Найдена папка: " + myFolder.getName());
}

Создание новой папки: DriveApp.createFolder()

Для создания новой папки используется метод DriveApp.createFolder():

/**
 * Создает новую папку.
 *
 * @param {string} folderName Имя новой папки.
 * @return {Folder} Объект Folder созданной папки.
 */
function createNewFolder(folderName) {
  const newFolder = DriveApp.createFolder(folderName);
  Logger.log("Создана папка: " + newFolder.getName());
  return newFolder;
}

const newFolder = createNewFolder("Новая папка");

Работа с файлами внутри папки

Для работы с файлами внутри папки используются методы getFiles() и getFilesByName() объекта Folder. FileIterator используется для итерации по файлам.

/**
 * Логирует имена файлов в папке.
 *
 * @param {Folder} folder Объект Folder.
 */
function logFileNames(folder) {
  const files = folder.getFiles();
  while (files.hasNext()) {
    const file = files.next();
    Logger.log(file.getName());
  }
}

if (myFolder) {
  logFileNames(myFolder);
}

Пошаговая инструкция: Копирование папки

Теперь, когда мы рассмотрели основы, перейдем к пошаговой инструкции по копированию папки.

Шаг 1: Получение исходной папки

Первым шагом является получение доступа к исходной папке, которую необходимо скопировать. Используем функцию getFolderById() представленную выше.

Реклама
const sourceFolderId = "исходный_folder_id";
const sourceFolder = getFolderById(sourceFolderId);

if (!sourceFolder) {
  Logger.log("Исходная папка не найдена.");
  // return; // Этот return вызовет ошибку, если код не находится внутри функции.
}

Шаг 2: Создание новой папки-копии

Затем необходимо создать новую папку, в которую будут скопированы файлы и подпапки. Используем функцию createNewFolder() или можем указать родительскую папку.

const destinationFolderName = sourceFolder.getName() + " (копия)";
const destinationFolder = DriveApp.createFolder(destinationFolderName);

Шаг 3: Копирование файлов и подпапок

Теперь необходимо скопировать все файлы и подпапки из исходной папки в новую папку. Для копирования файлов используется метод DriveApp.createFile(file.getBlob()).setName(file.getName()).

Шаг 4: Рекурсивное копирование подпапок (функция copyFolder)

Для копирования подпапок необходимо использовать рекурсивную функцию. Эта функция будет вызывать сама себя для каждой подпапки, обеспечивая копирование всей структуры папок.

/**
 * Рекурсивно копирует папку со всем содержимым.
 *
 * @param {Folder} sourceFolder Исходная папка.
 * @param {Folder} destinationFolder Папка назначения.
 */
function copyFolder(sourceFolder, destinationFolder) {
  // Копирование файлов
  const files = sourceFolder.getFiles();
  while (files.hasNext()) {
    const file = files.next();
    file.makeCopy(file.getName(), destinationFolder); // Улучшенный способ копирования
  }

  // Копирование подпапок
  const subfolders = sourceFolder.getFolders();
  while (subfolders.hasNext()) {
    const subfolder = subfolders.next();
    const newSubfolder = destinationFolder.createFolder(subfolder.getName());
    copyFolder(subfolder, newSubfolder);
  }
}

Пример кода: Полный скрипт для копирования папки

/**
 * Копирует папку со всем содержимым в новое место.
 */
function copyFolderWithContent() {
  const sourceFolderId = "исходный_folder_id";
  const destinationFolderId = "папка_назначения_id"; // Папка, куда копировать

  const sourceFolder = getFolderById(sourceFolderId);
  if (!sourceFolder) {
    Logger.log("Исходная папка не найдена.");
    return;
  }

  let destinationFolder;
  if (destinationFolderId) {
    const potentialDestinationFolder = getFolderById(destinationFolderId);
    if (!potentialDestinationFolder) {
      Logger.log("Папка назначения не найдена, будет создана в корне диска.");
      destinationFolder = DriveApp.createFolder(sourceFolder.getName() + " (копия)");
    } else {
      destinationFolder = potentialDestinationFolder;
      const newFolderName = sourceFolder.getName() + " (копия)";
      destinationFolder = destinationFolder.createFolder(newFolderName);
    }
  } else {
    destinationFolder = DriveApp.createFolder(sourceFolder.getName() + " (копия)");
  }

  copyFolder(sourceFolder, destinationFolder);

  Logger.log("Папка успешно скопирована.");
}

/**
 * Получает папку по её ID.
 */
function getFolderById(folderId) {
  try {
    const folder = DriveApp.getFolderById(folderId);
    return folder;
  } catch (e) {
    Logger.log("Папка с ID " + folderId + " не найдена: " + e);
    return null;
  }
}

/**
 * Рекурсивно копирует папку со всем содержимым.
 */
function copyFolder(sourceFolder, destinationFolder) {
  // Копирование файлов
  const files = sourceFolder.getFiles();
  while (files.hasNext()) {
    const file = files.next();
    // Используем правильный метод для копирования файла
    file.makeCopy(file.getName(), destinationFolder);
  }

  // Копирование подпапок
  const subfolders = sourceFolder.getFolders();
  while (subfolders.hasNext()) {
    const subfolder = subfolders.next();
    const newSubfolder = destinationFolder.createFolder(subfolder.getName());
    copyFolder(subfolder, newSubfolder);
  }
}

Объяснение кода: ключевые моменты

  • copyFolderWithContent(): Основная функция, которая запускает процесс копирования.
  • getFolderById(folderId): Получает папку по ID.
  • copyFolder(sourceFolder, destinationFolder): Рекурсивная функция для копирования файлов и подпапок.
  • DriveApp.createFile(file.getBlob()).setName(file.getName()): Копирует файл.
  • destinationFolder.createFolder(subfolder.getName()): Создает подпапку.

Как запустить скрипт

  1. Откройте Google Sheets, Docs или Slides.
  2. Выберите «Инструменты» > «Редактор скриптов».
  3. Скопируйте код в редактор скриптов.
  4. Замените `

3 комментария to “Как в Google Apps Script скопировать папку: полное руководство”

  1. Да, у меня случается путаница при подготовке кода к публикации. Логика в целом рабочая, надо просто типы убрать. Я поправил в примерах.

  2. Александр

    Я не могу сохранить данный скрипт в редакторе GAS, даже с подключенным сервисом Drive API

  3. Александр

    Это не запускается, так есть элементы TypeScript.


Добавить комментарий