Google Apps Script предоставляет мощные инструменты для автоматизации задач, связанных с Google Drive. Одной из распространенных задач является копирование папок, что может быть полезно для создания резервных копий, развертывания шаблонов проектов или переноса данных между разными аккаунтами. В этом руководстве мы подробно рассмотрим, как скопировать папку с помощью Google Apps Script, предоставляя конкретные примеры кода и объяснения.
Зачем копировать папки в Google Apps Script?
Копирование папок может быть необходимо в различных сценариях:
- Резервное копирование данных: Создание копий важных папок для защиты от потери данных.
- Развертывание шаблонов проектов: Копирование папки с шаблоном проекта для быстрого начала новых проектов, например, при создании рекламных кампаний.
- Обмен данными между аккаунтами: Перенос папок между разными аккаунтами Google Drive.
- Создание тестовых сред: Копирование продуктивной папки для создания тестовой среды.
- Архивирование старых проектов: Создание копий завершенных проектов для архивирования.
Необходимые условия: что вам понадобится
Прежде чем начать, убедитесь, что у вас есть:
- Аккаунт Google: Вам понадобится аккаунт Google для доступа к Google Apps Script и Google Drive.
- Базовые знания JavaScript: Google Apps Script основан на JavaScript, поэтому базовые знания языка будут полезны.
- Доступ к 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()): Создает подпапку.
Как запустить скрипт
- Откройте Google Sheets, Docs или Slides.
- Выберите «Инструменты» > «Редактор скриптов».
- Скопируйте код в редактор скриптов.
- Замените `
Да, у меня случается путаница при подготовке кода к публикации. Логика в целом рабочая, надо просто типы убрать. Я поправил в примерах.
Я не могу сохранить данный скрипт в редакторе GAS, даже с подключенным сервисом Drive API
Это не запускается, так есть элементы TypeScript.