Обзор Google Apps Script и работы с файлами
Google Apps Script (GAS) предоставляет мощные возможности для автоматизации задач в экосистеме Google Workspace, включая взаимодействие с файлами на Google Drive, а также с документами, таблицами и презентациями. Центральным элементом работы с файлами является возможность их идентификации, и получение имени файла — одна из базовых, но ключевых операций.
Важность получения имени файла: примеры использования
Получение имени файла необходимо во множестве сценариев:
Логирование и отчетность: Запись имен обрабатываемых файлов для аудита или отслеживания процессов.
Динамическая обработка: Выполнение различных действий в зависимости от имени файла (например, применение разных шаблонов к документам с определенными префиксами в названии).
Генерация отчетов: Включение имен исходных файлов данных в генерируемые отчеты или сводки.
Пользовательский интерфейс: Отображение имен файлов пользователю в веб-приложениях или боковых панелях.
Организация файлов: Автоматическое перемещение или переименование файлов на основе их текущих имен.
Например, в скрипте для анализа данных из CSV-файлов, хранящихся на Диске, получение имени файла может использоваться для маркировки обработанных данных или для создания отчетов, специфичных для каждого источника данных.
Получение имени файла из Google Drive
Использование DriveApp для доступа к файлам
Сервис DriveApp является основным инструментом в GAS для взаимодействия с файлами и папками на Google Drive. Он позволяет получать файлы по их идентификатору (ID), имени, искать файлы по различным критериям и управлять ими.
Метод `getName()`: основной способ получения имени файла
Независимо от того, как вы получили объект File, представляющий файл на Диске, для получения его имени используется метод getName(). Этот метод возвращает строку с текущим именем файла.
Примеры кода: получение имени файла по ID и по имени
/**
* Получает имя файла Google Drive по его идентификатору.
*
* @param {string} fileId Идентификатор файла.
* @return {string | null} Имя файла или null, если файл не найден или произошла ошибка.
*/
function getFileNameById_(fileId: string): string | null {
try {
const file: GoogleAppsScript.Drive.File = DriveApp.getFileById(fileId);
return file.getName();
} catch (e: unknown) {
// Обработка случая, если ID недействителен или нет доступа
Logger.log(`Ошибка получения файла по ID '${fileId}': ${(e as Error).message}`);
return null;
}
}
/**
* Получает имена всех файлов с заданным именем в корневой папке Диска.
*
* @param {string} fileName Имя файла для поиска.
* @return {string[]} Массив имен найденных файлов.
*/
function getFileNamesByName_(fileName: string): string[] {
const fileIterator: GoogleAppsScript.Drive.FileIterator = DriveApp.getFilesByName(fileName);
const names: string[] = [];
while (fileIterator.hasNext()) {
const file: GoogleAppsScript.Drive.File = fileIterator.next();
names.push(file.getName());
}
return names;
}
// Пример использования:
function logFileNames(): void {
const fileId: string = 'YOUR_FILE_ID'; // Замените на реальный ID файла
const nameById: string | null = getFileNameById_(fileId);
if (nameById) {
Logger.log(`Имя файла по ID ${fileId}: ${nameById}`);
} else {
Logger.log(`Файл с ID ${fileId} не найден.`);
}
const searchName: string = 'Отчет за квартал';
const namesByName: string[] = getFileNamesByName_(searchName);
Logger.log(`Файлы с именем '${searchName}': ${namesByName.join(', ')}`);
}Получение имени файла из Google Sheets, Docs и Slides
getSheetByName(), getDocumentById() и другие методы доступа
При работе с файлами Google Workspace (Таблицы, Документы, Презентации) часто используется не DriveApp, а специализированные сервисы: SpreadsheetApp, DocumentApp и SlidesApp. Эти сервисы предоставляют методы для получения текущего активного файла (getActiveSpreadsheet(), getActiveDocument(), getActivePresentation()) или открытия файла по его ID (openById()).
Использование `getName()` для Spreadsheet, Document и Presentation
После получения объекта, представляющего конкретный файл (например, Spreadsheet, Document или Presentation), вы также можете использовать метод getName(), чтобы получить его имя. Этот метод работает аналогично методу getName() для объекта File из DriveApp.
Примеры кода для Sheets, Docs и Slides
/**
* Получает имя активной Google Таблицы.
*
* @return {string} Имя активной таблицы.
*/
function getActiveSheetName(): string {
const spreadsheet: GoogleAppsScript.Spreadsheet.Spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
return spreadsheet.getName();
}
/**
* Получает имя Google Документа по его ID.
*
* @param {string} documentId Идентификатор документа.
* @return {string | null} Имя документа или null при ошибке.
*/
function getDocumentNameById_(documentId: string): string | null {
try {
const doc: GoogleAppsScript.Document.Document = DocumentApp.openById(documentId);
return doc.getName();
} catch (e: unknown) {
Logger.log(`Ошибка открытия документа по ID '${documentId}': ${(e as Error).message}`);
return null;
}
}
/**
* Получает имя Google Презентации по ее ID.
*
* @param {string} presentationId Идентификатор презентации.
* @return {string | null} Имя презентации или null при ошибке.
*/
function getPresentationNameById_(presentationId: string): string | null {
try {
// Убедитесь, что API Slides включен в проекте Apps Script
const presentation: GoogleAppsScript.Slides.Presentation = SlidesApp.openById(presentationId);
return presentation.getName();
} catch (e: unknown) {
Logger.log(`Ошибка открытия презентации по ID '${presentationId}': ${(e as Error).message}`);
return null;
}
}
// Пример использования:
function logWorkspaceFileNames(): void {
Logger.log(`Имя текущей таблицы: ${getActiveSheetName()}`);
const docId: string = 'YOUR_DOC_ID'; // Замените на ID Документа
const docName: string | null = getDocumentNameById_(docId);
if (docName) {
Logger.log(`Имя документа по ID ${docId}: ${docName}`);
}
const presId: string = 'YOUR_PRESENTATION_ID'; // Замените на ID Презентации
const presName: string | null = getPresentationNameById_(presId);
if (presName) {
Logger.log(`Имя презентации по ID ${presId}: ${presName}`);
}
}Обработка ошибок и особые случаи
Обработка ситуаций, когда файл не найден
При попытке получить файл по ID или имени, он может отсутствовать, быть удален, или у скрипта может не быть прав доступа. В таких случаях методы getFileById(), openById() и другие вызовут исключение. Крайне важно оборачивать вызовы этих методов в блок try...catch для корректной обработки ошибок и предотвращения аварийного завершения скрипта.
function safeGetFileNameById_(fileId: string): string | null {
try {
const file: GoogleAppsScript.Drive.File = DriveApp.getFileById(fileId);
return file.getName();
} catch (e) {
Logger.log(`Файл с ID ${fileId} не найден или доступ запрещен.`);
return null;
}
}Работа с файлами без имени (редкие случаи)
Хотя крайне редко, теоретически возможно столкнуться с файлом, у которого нет имени (например, в результате программной ошибки при создании). Метод getName() в таких случаях вернет пустую строку (''). Ваш код должен быть готов к обработке таких ситуаций, если они потенциально возможны в вашем рабочем процессе.
Практические примеры и советы
Пример: Автоматическое переименование файлов
Скрипт может находить файлы по определенному критерию (например, по части имени) и переименовывать их, добавляя дату обработки.
/**
* Находит файлы, содержащие 'Draft' в имени, и добавляет текущую дату.
*
* @param {string} folderId ID папки для поиска.
*/
function renameDraftFiles_(folderId: string): void {
const folder: GoogleAppsScript.Drive.Folder = DriveApp.getFolderById(folderId);
const files: GoogleAppsScript.Drive.FileIterator = folder.searchFiles('title contains "Draft"');
const today: string = new Date().toLocaleDateString('ru-RU'); // Формат ДД.ММ.ГГГГ
while (files.hasNext()) {
const file: GoogleAppsScript.Drive.File = files.next();
const currentName: string = file.getName();
const newName: string = `${currentName.replace('Draft', 'Processed')} - ${today}`;
try {
file.setName(newName);
Logger.log(`Файл '${currentName}' переименован в '${newName}'`);
} catch (e: unknown) {
Logger.log(`Не удалось переименовать файл '${currentName}': ${(e as Error).message}`);
}
}
}Пример: Создание списка файлов с их именами в Google Sheets
Этот скрипт собирает имена и ID файлов из указанной папки и записывает их в активную Google Таблицу.
/**
* Записывает список файлов из папки в активный лист Google Таблицы.
*
* @param {string} folderId ID папки на Google Drive.
*/
function listFilesInSheet_(folderId: string): void {
try {
const folder: GoogleAppsScript.Drive.Folder = DriveApp.getFolderById(folderId);
const files: GoogleAppsScript.Drive.FileIterator = folder.getFiles();
const sheet: GoogleAppsScript.Spreadsheet.Sheet = SpreadsheetApp.getActiveSheet();
// Очистка листа (опционально) и добавление заголовков
sheet.clearContents();
sheet.appendRow(['File Name', 'File ID']);
const fileData: string[][] = [];
while (files.hasNext()) {
const file: GoogleAppsScript.Drive.File = files.next();
fileData.push([file.getName(), file.getId()]);
}
if (fileData.length > 0) {
// Запись данных одним пакетом для производительности
sheet.getRange(sheet.getLastRow() + 1, 1, fileData.length, 2).setValues(fileData);
Logger.log(`Добавлено ${fileData.length} файлов из папки '${folder.getName()}' в таблицу.`);
} else {
Logger.log(`Папка '${folder.getName()}' пуста.`);
}
} catch (e: unknown) {
Logger.log(`Ошибка при листинге файлов из папки ${folderId}: ${(e as Error).message}`);
}
}Рекомендации по оптимизации кода и повышению производительности
Минимизируйте вызовы API: Избегайте получения имени файла внутри циклов, если это возможно. Получите объект файла один раз и используйте его свойства многократно.
Пакетная обработка: При работе с множеством файлов (как в примере с листингом в Sheets), собирайте данные в массив и записывайте их одним вызовом (setValues), вместо многократных appendRow.
Используйте searchFiles: Для поиска файлов по критериям DriveApp.searchFiles() часто эффективнее, чем получение всех файлов папки и последующая фильтрация в скрипте.
Кэширование: Если имя файла требуется многократно в течение выполнения скрипта, сохраните его в переменную после первого вызова getName().
Четкая обработка ошибок: Используйте try...catch для предвидения проблем с доступом или существованием файлов.