Что такое Google Apps Script и его возможности
Google Apps Script (GAS) — это облачная платформа скриптов на основе JavaScript для автоматизации задач в продуктах Google Workspace. Она позволяет расширять функциональность Google Docs, Sheets, Slides, Drive, Gmail и других сервисов, создавая пользовательские функции, меню, триггеры и веб-приложения.
GAS предоставляет удобные API для взаимодействия с различными сервисами Google, включая Google Drive, что открывает широкие возможности для программной работы с файлами, в том числе с изображениями.
Обзор сервисов Google для работы с файлами (Drive API)
Ключевым сервисом для работы с файлами в GAS является DriveApp. Он предоставляет методы для поиска, создания, чтения, изменения и управления файлами и папками на Google Диске пользователя или общем диске. Для работы с изображениями мы будем использовать DriveApp для получения файла изображения по его ID.
Полученный файл будет представлен в виде объекта File, который содержит метаданные и методы для доступа к содержимому файла, чаще всего в виде Blob (Binary Large Object).
Предварительные требования: настройка скрипта и авторизация
Для выполнения скриптов, взаимодействующих с Google Диском и Документами/Таблицами/Презентациями, необходимо:
Создать скрипт: Откройте редактор скриптов из соответствующего приложения (Docs, Sheets, Slides) через меню "Инструменты" -> "Редактор скриптов" или создайте автономный скрипт на script.google.com.
Авторизация: При первом запуске скрипта, использующего DriveApp или сервисы документов (DocumentApp, SpreadsheetApp, SlidesApp), Google запросит у пользователя разрешение на доступ к соответствующим данным. Необходимо предоставить эти разрешения. Убедитесь, что манифест проекта (appsscript.json) содержит необходимые области видимости (scopes), хотя GAS часто добавляет их автоматически при использовании соответствующих сервисов.
// Пример манифеста appsscript.json (обычно генерируется автоматически)
{
"timeZone": "Europe/Moscow",
"dependencies": {},
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8",
"oauthScopes": [
"https://www.googleapis.com/auth/script.container.ui",
"https://www.googleapis.com/auth/documents",
"https://www.googleapis.com/auth/drive.readonly", // Достаточно для чтения файла
"https://www.googleapis.com/auth/spreadsheets",
"https://www.googleapis.com/auth/presentations"
]
}Вставка изображения из Google Диска в Google Docs
Получение ID файла изображения из Google Диска
ID файла — это уникальный идентификатор, который можно найти в URL файла на Google Диске. Например, в ссылке https://docs.google.com/document/d/12345abcdefghijklmnopqrstuvwxyz/edit ID — это 12345abcdefghijklmnopqrstuvwxyz.
Использование Drive API для получения файла изображения
Для получения объекта файла используется метод DriveApp.getFileById(id). Результатом является объект File.
/**
* Получает объект файла изображения с Google Диска по его ID.
* @param {string} imageId Уникальный идентификатор файла изображения.
* @returns {GoogleAppsScript.Drive.File | null} Объект файла или null, если файл не найден.
*/
function getImageFileFromDrive_(imageId: string): GoogleAppsScript.Drive.File | null {
try {
const file = DriveApp.getFileById(imageId);
return file;
} catch (e) {
console.error('Ошибка получения файла %s: %s', imageId, e);
return null;
}
}Вставка изображения в документ Google Docs с помощью Apps Script
Получив объект File, мы можем извлечь его содержимое как Blob с помощью метода getBlob() и вставить в документ, используя appendImage() или insertImage() у объекта Body или Paragraph.
/**
* Вставляет изображение из Google Диска в активный Google Документ.
* @param {string} imageId ID файла изображения на Google Диске.
*/
function insertImageIntoDoc(imageId: string): void {
const doc = DocumentApp.getActiveDocument();
const body = doc.getBody();
const imageFile = getImageFileFromDrive_(imageId);
if (imageFile) {
try {
const imageBlob = imageFile.getBlob();
// Вставляем изображение в конец документа
const insertedImage = body.appendImage(imageBlob);
console.log('Изображение успешно вставлено. ID:', imageId);
// Дополнительная настройка размера и положения
// configureImageInDoc_(insertedImage, 200, 150);
} catch (e) {
console.error('Ошибка вставки изображения %s в документ: %s', imageId, e);
DocumentApp.getUi().alert('Не удалось вставить изображение.');
}
} else {
DocumentApp.getUi().alert('Файл изображения не найден на Диске.');
}
}Настройка размера и положения изображения
Объект InlineImage, возвращаемый методами вставки, позволяет настроить размер.
/**
* Настраивает размер вставленного изображения в Google Docs.
* @param {GoogleAppsScript.Document.InlineImage} image Объект вставленного изображения.
* @param {number} width Желаемая ширина в пунктах.
* @param {number} height Желаемая высота в пунктах.
*/
function configureImageInDoc_(image: GoogleAppsScript.Document.InlineImage, width: number, height: number): void {
// Получаем исходные размеры для сохранения пропорций (опционально)
// const originalWidth = image.getWidth();
// const originalHeight = image.getHeight();
// const aspectRatio = originalWidth / originalHeight;
// image.setWidth(width);
// image.setHeight(width / aspectRatio);
image.setWidth(width);
image.setHeight(height);
}
// Пример вызова:
// insertImageIntoDoc('YOUR_IMAGE_FILE_ID');Вставка изображения из Google Диска в Google Sheets
Получение ID файла изображения из Google Диска
Процесс получения ID файла аналогичен описанному для Google Docs.
Использование Drive API для получения файла изображения
Используется та же функция getImageFileFromDrive_(imageId), что и для Google Docs.
Вставка изображения в таблицу Google Sheets с помощью Apps Script
В Google Sheets изображение вставляется в конкретную ячейку с помощью метода insertImage(blob, column, row). Также есть метод insertImage(url, column, row) для вставки по URL.
/**
* Вставляет изображение из Google Диска в указанную ячейку активного листа Google Таблицы.
* @param {string} imageId ID файла изображения на Google Диске.
* @param {string} cellNotation Нотация ячейки (например, 'A1', 'B5').
* @param {number} [offsetX=0] Смещение по X внутри ячейки (в пикселях).
* @param {number} [offsetY=0] Смещение по Y внутри ячейки (в пикселях).
*/
function insertImageIntoSheet(imageId: string, cellNotation: string, offsetX: number = 0, offsetY: number = 0): void {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
const range = sheet.getRange(cellNotation);
const imageFile = getImageFileFromDrive_(imageId);
if (imageFile) {
try {
const imageBlob = imageFile.getBlob();
// Вставляем изображение в левый верхний угол указанной ячейки
const insertedImage = sheet.insertImage(imageBlob, range.getColumn(), range.getRow(), offsetX, offsetY);
console.log('Изображение успешно вставлено в ячейку %s. ID:', cellNotation, imageId);
// Дополнительная настройка
// configureImageInSheet_(insertedImage, 100, 75);
} catch (e) {
console.error('Ошибка вставки изображения %s в таблицу: %s', imageId, e);
SpreadsheetApp.getUi().alert('Не удалось вставить изображение.');
}
} else {
SpreadsheetApp.getUi().alert('Файл изображения не найден на Диске.');
}
}Настройка размера и положения изображения в ячейке
Метод insertImage возвращает объект OverGridImage, который позволяет настроить размер и точное положение.
/**
* Настраивает размер вставленного изображения в Google Sheets.
* Примечание: Изменение размера может быть ограничено возможностями API.
* @param {GoogleAppsScript.Spreadsheet.OverGridImage} image Объект вставленного изображения.
* @param {number} width Желаемая ширина в пикселях.
* @param {number} height Желаемая высота в пикселях.
*/
function configureImageInSheet_(image: GoogleAppsScript.Spreadsheet.OverGridImage, width: number, height: number): void {
// API OverGridImage может не предоставлять прямых методов setWidth/setHeight,
// но можно попробовать установить якорь или использовать другие доступные методы.
// На момент написания статьи, прямое изменение размера после вставки ограничено.
// Размер обычно определяется при вставке или автоматически.
// Можно пере-вставить с другими параметрами или использовать альтернативы.
// Пример установки альтернативного текста:
image.setAltTextTitle('Динамическое изображение');
image.setAltTextDescription(`Вставлено из файла ${image.getBlob()?.getName() || 'неизвестно'}`);
}
// Пример вызова:
// insertImageIntoSheet('YOUR_IMAGE_FILE_ID', 'C3');Вставка изображения из Google Диска в Google Slides
Получение ID файла изображения из Google Диска
Процесс получения ID файла аналогичен предыдущим разделам.
Использование Drive API для получения файла изображения
Используется та же функция getImageFileFromDrive_(imageId).
Вставка изображения в слайд Google Slides с помощью Apps Script
Изображения вставляются на конкретный слайд с помощью метода insertImage(imageBlob) объекта Slide.
/**
* Вставляет изображение из Google Диска на указанный слайд активной презентации.
* @param {string} imageId ID файла изображения на Google Диске.
* @param {number} slideIndex Индекс слайда (начиная с 0).
*/
function insertImageIntoSlide(imageId: string, slideIndex: number): void {
const presentation = SlidesApp.getActivePresentation();
const slides = presentation.getSlides();
if (slideIndex = slides.length) {
console.error('Неверный индекс слайда: %s. Всего слайдов: %s', slideIndex, slides.length);
SlidesApp.getUi().alert('Указан неверный номер слайда.');
return;
}
const slide = slides[slideIndex];
const imageFile = getImageFileFromDrive_(imageId);
if (imageFile) {
try {
const imageBlob = imageFile.getBlob();
// Вставляем изображение на слайд
const insertedImage = slide.insertImage(imageBlob);
console.log('Изображение успешно вставлено на слайд %s. ID:', slideIndex, imageId);
// Настройка положения и размера
// configureImageInSlide_(insertedImage, 50, 50, 300, 200);
} catch (e) {
console.error('Ошибка вставки изображения %s на слайд %s: %s', imageId, slideIndex, e);
SlidesApp.getUi().alert('Не удалось вставить изображение.');
}
} else {
SlidesApp.getUi().alert('Файл изображения не найден на Диске.');
}
}Настройка размера и положения изображения на слайде
Объект Image, возвращаемый методом insertImage, предоставляет методы для точной настройки положения (setLeft, setTop) и размера (setWidth, setHeight или scaleWidth, scaleHeight).
/**
* Настраивает положение и размер изображения на слайде Google Slides.
* @param {GoogleAppsScript.Slides.Image} image Объект вставленного изображения.
* @param {number} left Отступ слева от края слайда (в пунктах).
* @param {number} top Отступ сверху от края слайда (в пунктах).
* @param {number} width Ширина изображения (в пунктах).
* @param {number} height Высота изображения (в пунктах).
*/
function configureImageInSlide_(image: GoogleAppsScript.Slides.Image, left: number, top: number, width: number, height: number): void {
image.setLeft(left);
image.setTop(top);
image.setWidth(width);
image.setHeight(height);
// Или масштабирование:
// image.scaleWidth(0.5); // Уменьшить ширину в 2 раза
// image.scaleHeight(0.5); // Уменьшить высоту в 2 раза
}
// Пример вызова:
// insertImageIntoSlide('YOUR_IMAGE_FILE_ID', 0); // Вставить на первый слайдАльтернативные методы и продвинутые техники
Использование сервиса Blob для работы с бинарными данными изображений
Объект Blob (полученный через file.getBlob()) является центральным элементом при работе с файлами. Он представляет собой необработанные бинарные данные. С Blob можно выполнять различные операции:
Получение типа MIME: blob.getContentType()
Получение имени (если доступно): blob.getName()
Преобразование в байтовый массив: blob.getBytes()
Создание Blob из байтового массива: Utilities.newBlob(bytes, contentType, name)
Это полезно для манипуляций с изображениями перед вставкой или при передаче данных между сервисами.
Вставка изображений из общедоступных ссылок Google Диска
В некоторых случаях (например, в Google Sheets с insertImage(url, ...) или при формировании HTML для HtmlService) можно использовать прямые ссылки на изображения. Однако стандартная ссылка на просмотр файла Google Диска не является прямой ссылкой на изображение.
Для получения прямой ссылки на файл, доступный для просмотра всем в интернете, можно использовать формат:
https://drive.google.com/uc?export=view&id=FILE_ID
Важно: Этот метод требует, чтобы файл был доступен по ссылке. Использование DriveApp предпочтительнее, так как он работает с правами авторизованного пользователя и не требует изменения настроек доступа к файлу.
Обработка ошибок и отладка скрипта
Всегда оборачивайте вызовы API, которые могут завершиться неудачей (доступ к файлу, вставка), в блоки try...catch. Используйте console.log(), console.error() и встроенный отладчик Apps Script для диагностики проблем.
Проверяйте наличие файла перед использованием (if (imageFile)).
Логируйте ID файлов и этапы выполнения.
Используйте Ui.alert() для информирования пользователя о критических ошибках.
Советы по оптимизации кода и повышению производительности
Минимизируйте вызовы API: Получайте все необходимые данные за минимальное количество обращений. Например, если нужно вставить несколько изображений, получите их ID списком и обработайте в цикле, но старайтесь избегать вызовов DriveApp или DocumentApp внутри цикла, если это возможно.
Кэширование: Если одни и те же изображения используются часто, можно кэшировать их Blob или ID с помощью CacheService для ускорения повторных операций.
Пакетная обработка: Если нужно вставить много изображений в документ, соберите все Blob и вставляйте их последовательно, минимизируя операции с документом.
Асинхронность (где применимо): Для сложных интерфейсов (в HtmlService) можно использовать асинхронные вызовы google.script.run.