Что такое Google Apps Script и его возможности
Google Apps Script (GAS) — это облачная платформа для разработки скриптов, основанная на JavaScript, которая позволяет автоматизировать задачи и расширять функциональность сервисов Google Workspace (Docs, Sheets, Drive, Gmail и др.). Она предоставляет удобный способ взаимодействия с API Google, позволяя создавать пользовательские решения без необходимости развертывания сложной инфраструктуры.
Возможности GAS включают автоматизацию рутинных операций, создание пользовательских меню и диалоговых окон, интеграцию различных сервисов Google, а также взаимодействие с внешними API. Это мощный инструмент для повышения производительности и кастомизации рабочего процесса в экосистеме Google.
Обзор сервиса Drive API для работы с файлами
Для взаимодействия с файлами на Google Диске в Apps Script используется сервис DriveApp. Он предоставляет набор методов для создания, поиска, перемещения, копирования и управления файлами и папками. Важной частью работы с файлами является определение их типа, что необходимо для дальнейшей логики обработки.
Сервис DriveApp позволяет получить доступ к метаданным файла, включая его имя, ID, размер, дату создания и, что ключевое для нашей задачи, MIME-тип. MIME-тип (Multipurpose Internet Mail Extensions) — это стандартный способ идентификации типа содержимого файла в интернете.
Предварительная настройка: включение Drive API в проекте Apps Script
Хотя основной сервис DriveApp доступен по умолчанию, для использования расширенных функций, таких как поиск файлов или работа с разрешениями через Advanced Google services, может потребоваться явное включение Google Drive API.
Для этого:
Откройте редактор скриптов.
В левом меню выберите "Сервисы".
Найдите "Drive API" в списке и нажмите "Добавить".
Для большинства стандартных операций, включая получение MIME-типа файла с помощью DriveApp, явное включение Advanced Drive API не требуется.
Получение типа файла с использованием Drive API
Основным и наиболее надежным способом определения типа файла на Google Диске является получение его MIME-типа.
Метод `getFileById()`: получение файла по ID
Чтобы работать с конкретным файлом, его необходимо сначала получить. Самый распространенный способ — использовать уникальный идентификатор файла (File ID). Метод DriveApp.getFileById(id) возвращает объект File, представляющий собой файл на Диске.
/**
* Получает объект файла Google Drive по его идентификатору.
*
* @param {string} fileId Уникальный идентификатор файла.
* @returns {GoogleAppsScript.Drive.File | null} Объект файла или null, если файл не найден.
*/
function getFileObjectById(fileId: string): GoogleAppsScript.Drive.File | null {
try {
const file = DriveApp.getFileById(fileId);
return file;
} catch (e) {
console.error(`Ошибка при получении файла с ID ${fileId}: ${e}`);
return null;
}
}Свойство `mimeType`: определение типа файла
Объект File, полученный на предыдущем шаге, имеет метод getMimeType(). Этот метод возвращает строку, содержащую MIME-тип файла, например, application/vnd.google-apps.document для Google Документа, image/jpeg для JPEG-изображения или application/pdf для PDF-файла.
Пример кода: получение типа файла по его ID
Объединим шаги для получения MIME-типа файла по его ID:
/**
* Получает MIME-тип файла Google Drive по его идентификатору.
*
* @param {string} fileId Уникальный идентификатор файла.
* @returns {string | null} Строка с MIME-типом файла или null в случае ошибки.
*/
function getFileMimeTypeById(fileId: string): string | null {
try {
// Получаем объект файла
const file: GoogleAppsScript.Drive.File = DriveApp.getFileById(fileId);
// Получаем MIME-тип
const mimeType: string = file.getMimeType();
console.log(`MIME-тип файла ${file.getName()} (${fileId}): ${mimeType}`);
return mimeType;
} catch (e) {
// Обработка возможной ошибки (например, файл не найден или нет доступа)
console.error(`Не удалось получить MIME-тип для файла с ID ${fileId}. Ошибка: ${e}`);
return null;
}
}
// Пример использования:
const targetFileId = 'YOUR_FILE_ID_HERE'; // Замените на реальный ID файла
const fileType = getFileMimeTypeById(targetFileId);
if (fileType) {
// Логика обработки в зависимости от типа файла
if (fileType === MimeType.GOOGLE_SHEETS) {
console.log('Это Google Таблица.');
} else if (fileType.startsWith('image/')) {
console.log('Это изображение.');
}
}Примечание: MimeType — это встроенный перечислитель (enum) в Apps Script, содержащий константы для распространенных MIME-типов Google Workspace.
Альтернативные способы определения типа файла
Хотя getMimeType() является предпочтительным методом для файлов на Диске, существуют и другие сценарии.
Использование `getContentType()` для файлов, полученных из других источников
Если вы работаете с файлом, представленным как объект Blob (например, вложение из Gmail или файл, загруженный по URL с помощью UrlFetchApp), вы можете использовать метод getContentType().
/**
* Получает MIME-тип из объекта Blob.
*
* @param {GoogleAppsScript.Base.Blob} blob Объект Blob (например, вложение Gmail).
* @returns {string | null} MIME-тип или null, если определить не удалось.
*/
function getBlobContentType(blob: GoogleAppsScript.Base.Blob): string | null {
try {
const contentType = blob.getContentType();
console.log(`Тип содержимого Blob (${blob.getName()}): ${contentType}`);
return contentType;
} catch (e) {
console.error(`Ошибка при получении типа содержимого Blob: ${e}`);
return null;
}
}
// Пример: получение типа вложения из первого письма в цепочке
/*
const thread = GmailApp.getInboxThreads(0, 1)[0];
if (thread) {
const message = thread.getMessages()[0];
const attachments = message.getAttachments();
if (attachments.length > 0) {
getBlobContentType(attachments[0]);
}
}
*/Определение типа файла на основе расширения (не рекомендуется, но возможно)
Можно попытаться определить тип файла по его расширению, полученному из имени файла (file.getName()). Однако этот метод крайне ненадежен: расширение может отсутствовать, быть неверным или не соответствовать фактическому содержимому файла. Использование MIME-типа всегда предпочтительнее.
/**
* Пытается определить тип файла по расширению (НЕ РЕКОМЕНДУЕТСЯ).
*
* @param {string} fileName Имя файла.
* @returns {string | null} Предполагаемое расширение или null.
*/
function getExtensionFromName(fileName: string): string | null {
const lastDot = fileName.lastIndexOf('.');
if (lastDot === -1 || lastDot === fileName.length - 1) {
return null; // Нет расширения
}
return fileName.substring(lastDot + 1).toLowerCase();
}
// Пример:
// const fileName = 'отчет_продаж.xlsx';
// const extension = getExtensionFromName(fileName); // 'xlsx'
// const fileId = '...';
// const file = DriveApp.getFileById(fileId);
// const unreliableExtension = getExtensionFromName(file.getName());Этот подход следует использовать только в крайних случаях и с пониманием его ограничений.
Обработка различных типов файлов и ошибок
При работе с файлами важно корректно обрабатывать как различные типы данных, так и возможные ошибки.
Работа с различными MIME-типами (изображения, документы, таблицы и т.д.)
Используя полученный mimeType, можно реализовать условную логику. Удобно использовать конструкцию switch или if-else if.
/**
* Обрабатывает файл в зависимости от его MIME-типа.
*
* @param {string} fileId Идентификатор файла.
*/
function processFileByType(fileId: string): void {
const mimeType = getFileMimeTypeById(fileId);
if (!mimeType) {
console.warn(`Не удалось определить тип файла ${fileId}, обработка прервана.`);
return;
}
switch (mimeType) {
case MimeType.GOOGLE_SHEETS:
console.log(`Обработка Google Таблицы: ${fileId}`);
// Логика для таблиц (например, чтение данных)
// const sheetData = SpreadsheetApp.openById(fileId).getActiveSheet().getDataRange().getValues();
break;
case MimeType.GOOGLE_DOCS:
console.log(`Обработка Google Документа: ${fileId}`);
// Логика для документов (например, извлечение текста)
// const docText = DocumentApp.openById(fileId).getBody().getText();
break;
case MimeType.PDF:
console.log(`Обработка PDF-файла: ${fileId}`);
// С PDF напрямую работать сложнее, возможно, потребуется извлечение текста (если он есть)
break;
case MimeType.JPEG:
case MimeType.PNG:
case MimeType.GIF:
console.log(`Обработка изображения (${mimeType}): ${fileId}`);
// Логика для изображений
break;
default:
if (mimeType.startsWith('image/')) {
console.log(`Обработка другого типа изображения (${mimeType}): ${fileId}`);
} else if (mimeType.startsWith('video/')) {
console.log(`Обработка видео (${mimeType}): ${fileId}`);
} else {
console.warn(`Неизвестный или неподдерживаемый MIME-тип: ${mimeType} для файла ${fileId}`);
// Общая логика или логирование
}
break;
}
}Обработка ошибок при получении информации о файле (файл не найден, нет доступа и т.д.)
При вызове DriveApp.getFileById() или методов объекта File могут возникать исключения. Основные причины:
Файл не найден: Указанный ID не существует.
Отсутствие прав доступа: Скрипт или пользователь, от имени которого он выполняется, не имеет разрешения на чтение файла.
Использование блока try...catch, как показано в предыдущих примерах, является обязательным для надежной работы скрипта.
Примеры обработки неизвестных или неподдерживаемых типов файлов
Важно предусмотреть ветку default в switch или финальный else в if-else if для обработки случаев, когда mimeType не соответствует ожидаемым значениям. В этой ветке можно:
Логировать информацию о файле и его типе для последующего анализа.
Перемещать такие файлы в отдельную папку "Необработанные".
Отправлять уведомление администратору.
Просто пропускать файл, если его обработка не требуется.
Практическое применение: примеры использования полученного типа файла
Определение типа файла открывает множество возможностей для автоматизации.
Автоматическая обработка файлов определенного типа
Анализ данных: Запускать скрипт анализа при добавлении новой Google Таблицы (MimeType.GOOGLE_SHEETS) в определенную папку.
Конвертация: Автоматически конвертировать загруженные .docx (MimeType.MICROSOFT_WORD) в Google Docs (MimeType.GOOGLE_DOCS).
Распознавание текста: При появлении PDF (MimeType.PDF) или изображений (image/*) запускать процесс OCR (оптического распознавания символов), если это возможно.
Фильтрация файлов по типу
Поиск: Искать на Диске все изображения (mimeType contains 'image/') или все таблицы (mimeType = '${MimeType.GOOGLE_SHEETS}') с использованием метода DriveApp.searchFiles().
Отчеты: Создавать отчеты, включающие только файлы определенных типов (например, только документы и презентации).
Отображение иконки файла в зависимости от его типа
Веб-приложения: В пользовательских интерфейсах, созданных с помощью HTML Service или Card Service, отображать иконку, соответствующую типу файла (mimeType), для улучшения визуального представления списка файлов.
Знание MIME-типа файла является фундаментальным аспектом при работе с файлами в Google Apps Script, позволяя создавать более гибкие, надежные и функциональные скрипты для автоматизации задач на Google Диске.