Loovülesanne

В данной работе рассмотрим, как с помощью скрипта автоматически создавать PDF-файлы из Google Таблиц, а затем отправлять их по email или сохранять в Google Диске.

🔗Ссылку на источник: Как настроить автоматическое создание PDF из Google Таблиц

✏️ Разбор кода и добавление комментариев

Вот пример скрипта, который конвертирует Google Таблицу в PDF (добавленные комментарии поясняют строки кода):

function exportToPDF() {
   // Получаем активную электронную таблицу Google Sheets
   const sheet = SpreadsheetApp.getActiveSpreadsheet();
   
   // Получаем идентификатор активного листа
   const sheetId = sheet.getSheetId();
   
   // Формируем URL для экспорта в PDF
   const pdfUrl = `${sheet.getUrl()}/export?format=pdf&gid=${sheetId}`;
   
   // Настройки для HTTP-запроса
   const options = {
      headers: { 'Authorization': 'Bearer ' + ScriptApp.getOAuthToken() }, // Добавляем токен авторизации
      muteHttpExceptions: true // Отключаем исключения HTTP, чтобы обработать возможные ошибки вручную
   };
   
   // Выполняем запрос для получения PDF-файла
   const response = UrlFetchApp.fetch(pdfUrl, options);
   
   // Получаем данные в формате Blob (файл)
   const blob = response.getBlob().setName('Report.pdf');
   
   // Сохраняем файл в Google Диск
   DriveApp.createFile(blob);
}

🔹 Что делает код?

  • Получает текущую Google Таблицу и её ID.
  • Формирует URL для экспорта в формате PDF.
  • Использует UrlFetchApp.fetch для получения PDF-файла.

📍Проверяем, что создался файл Report.pdf:

✏️ Улучшаем и дорабатываем код

Предварительно создана таблица на листе «Товары» для демонстрации работы кода:

📍Улучшенный код (с комментариями)

// Функция onOpen добавляет новое меню "PDF" в Google Таблицы
function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu("PDF")
    .addItem("Сохранить на диск в PDF", "savePDFToDrive") // Добавляем опцию сохранения в Google Диск
    .addItem("Отправить PDF на email", "exportAndSendPDF") // Добавляем опцию отправки на email
    .addToUi();
}

// Функция для сохранения PDF в Google Диск (только лист "Товары")
function savePDFToDrive() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Товары");
  
  // Проверяем, существует ли лист "Товары"
  if (!sheet) {
    SpreadsheetApp.getUi().alert("Ошибка: Лист 'Товары' не найден.");
    return;
  }

  // Генерируем PDF-файл
  var pdfBlob = generatePDF(sheet);
  if (!pdfBlob) return;

  // ID папки в Google Диске, куда будет сохранён файл
  var folderId = "1SRzYbiBC73e432uo5WKec46_kxU1PxgH"; 
  var folder = DriveApp.getFolderById(folderId);
  var file = folder.createFile(pdfBlob); // Создаём файл в указанной папке

  // Выводим сообщение пользователю и логируем ссылку на файл
  SpreadsheetApp.getUi().alert("PDF с листом 'Товары' сохранён в Google Диск.\nСсылка: " + file.getUrl());
  Logger.log("PDF сохранён: " + file.getUrl());
}

// Функция для экспорта PDF и отправки на email
function exportAndSendPDF() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Товары");

  // Проверяем, существует ли лист "Товары"
  if (!sheet) {
    SpreadsheetApp.getUi().alert("Ошибка: Лист 'Товары' не найден.");
    return;
  }

  // Генерируем PDF-файл
  var pdfBlob = generatePDF(sheet);
  if (!pdfBlob) return;

  // Запрашиваем у пользователя email
  var ui = SpreadsheetApp.getUi();
  var response = ui.prompt("Введите email", "Введите один или несколько адресов через запятую", ui.ButtonSet.OK_CANCEL);

  // Проверяем, нажал ли пользователь кнопку "ОК"
  if (response.getSelectedButton() == ui.Button.OK) {
    var recipient = response.getResponseText().trim();

    // Если email введён, обрабатываем его
    if (recipient) {
      var emails = recipient.split(",").map(email => email.trim()).filter(email => email); // Разделяем адреса по запятой

      // Настраиваем письмо
      var subject = "Отчёт в PDF – Данные из Google Таблицы";
      var body = "Здравствуйте!\n\n" +
                 "Во вложении находится автоматически сгенерированный PDF-файл с актуальными данными из Google Таблицы.\n\n" +
                 "Если у вас есть вопросы или пожелания, не стесняйтесь обращаться.\n\n" +
                 "С уважением,\nРазработчик ПО";

      // Отправляем письмо с вложением
      MailApp.sendEmail({
        to: emails.join(","), // Отправляем сразу нескольким адресатам
        subject: subject,
        body: body,
        attachments: [pdfBlob],
        name: "Разработчик ПО" // Указываем имя отправителя
      });

      // Сообщаем пользователю, что письмо отправлено
      ui.alert("PDF отправлен на email(ы): " + emails.join(", "));
      Logger.log("PDF отправлен на email(ы): " + emails.join(", "));
    } else {
      ui.alert("Вы не ввели email. Отправка отменена.");
    }
  } else {
    ui.alert("Отправка PDF отменена.");
  }
}

// Функция для генерации PDF-файла с листа "Товары"
function generatePDF(sheet) {
  try {
    var sheetId = sheet.getSheetId();
    var spreadsheetId = SpreadsheetApp.getActiveSpreadsheet().getId();

    // Формируем URL для экспорта листа в PDF
    var url = "https://docs.google.com/spreadsheets/d/" + spreadsheetId +
              "/export?exportFormat=pdf&format=pdf" +
              "&gid=" + sheetId + // Экспортируем только конкретный лист
              "&portrait=true&size=A4" + // Ориентация и размер страницы
              "&top_margin=0.5&bottom_margin=0.5&left_margin=0.5&right_margin=0.5" + // Устанавливаем отступы
              "&gridlines=false&printtitle=false"; // Отключаем сетку и заголовок

    // Делаем запрос к URL для получения PDF
    var response = UrlFetchApp.fetch(url, {
      headers: { 'Authorization': 'Bearer ' + ScriptApp.getOAuthToken() }
    });

    // Возвращаем PDF-файл в виде Blob
    return response.getBlob().setName(sheet.getName() + ".pdf");

  } catch (e) {
    // Если произошла ошибка, уведомляем пользователя и логируем её
    SpreadsheetApp.getUi().alert("Ошибка при экспорте PDF: " + e.toString());
    Logger.log("Ошибка при экспорте PDF: " + e.toString());
    return null;
  }
}

Что улучшено в коде?

Добавлено меню в Google Таблицы.
Экспорт PDF и сохранение на Google Диск.
Отправка PDF нескольким email одновременно.
Добавлен формат письма (тема, тело, вложение).
Добавлены уведомления и логирование.

Этот код на Google Apps Script выполняет следующие задачи:

1. Добавление меню PDF в Google Таблицы:

В меню есть два пункта:

  • «Сохранить на диск в PDF» – экспортирует лист «Товары» в PDF и сохраняет в Google Диск.
  • «Отправить PDF на email» – экспортирует лист «Товары» в PDF и отправляет его на email.

2. Экспорт листа «Товары» в PDF и сохранение на Google Диск (💾 «Сохранить на диск в PDF»):

Проверяю на своём Google Диске, что файл сохранён:

3. Экспорт листа «Товары» в PDF и отправка на email (📩«Отправить PDF на email»):

В коде прописана возможность отправлять письмо с вложением нескольким пользователям одновременно. Тестируем:

Использую две свои почты, ввести их нужно через запятую (указано в самой форме):

📬 Проверяю свои «электронные ящики»:

В коде я замаскировала свою почту (почту отправителя) под имя «Разработчик ПО» и письмо выглядит вот таким образом:

Вот так выглядит содержание письма на одном email:

И на втором email: