Экспорт таблиц Google Sheets в PDF файл
В данной статье я расскажу, как можно экспортировать таблицу Google в PDF файл, в заданном формате, используя Google Script. И еще отправим PDF файл на Google диск и на почту.
В Google таблицах есть возможность экспорта в PDF формате. Для это нужно зайти в меню Файл->Скачать->Документ PDF. Чтобы понять, как Google делает экспорт, воспользуемся браузерными инструментами разработчика. Откроем нужную нам таблицу и нажмем сочетание клавиш Ctrl+Shift+I(браузер Оперы или Google Chrome), и перейдем на вкладку Ethernet как на картинке ниже

Теперь сделаем экспорт в PDF через меню Google таблиц и найдем ссылку, которая отвечает за это действие

Нажмем на ссылку и посмотрим параметры, которые передаются на сервер

На сервер передается идентификатор таблицы и три параметра: a, pc, gf. Для чего нужны a и gf я не знаю, а вот параметр pc – это все настройки выборки и форматирования для экспорта Google таблицы в PDF файл
Немного пришлось по ломать голову над значением 43745.64856909722, но так как я давно работаю с Delphi ответ пришел сам собой. Опытным путем я определил все необходимые настройки и вот что получилось:
На основе полученных данных можно сделать скрипт для экспорта содержимого Google таблиц в нужном нам формате. Для запуска скрипта сделаем дополнительный пункт меню в триггере onOpen.
Итого мы имеем три функции экспорта:
- exportPDF – загрузка файла
- exportPDFtoGDrive – отправка файла в Google диск, в ту же папку, где находится таблица
- exportPDFtoEMail – отправка файла на электронную почту
И три функции myExportPDF, myExportPDFtoGDrive, myExportPDFtoEMail для примера использования.
Для указания данных и настройки форматирования передаются три параметра source, options и format. Эти параметры это части переменной pc, о которой я писал выше.
Скопируйте ещё раз. Я исправил. Там в запросе добавилась переменная "esid", в других функциях я её добавил, а в экспорт на Google Drive нет.
По количеству страниц вы сделали правильно. Я проверил такой код:
У меня в PDF уходит два листа. Смотрите возможно ошибка в имени листа.
Что-бы кнопки не попадали в PDF, нужно указать границы экспорта для каждого листа
[sheet.getSheetId().toString(), // ID листа в виде строки
0, // начальная граница по вертикали (с первой строки)
160, // конечная граница по вертикали (по 160-ую строку включительно)
0, // начальная граница по горизонтали (с ячейки A)
8 // конечная граница по горизонтали (по ячейку H включительно)
]
Да, Вы правы, без этой переменной скрипт не срабатывает. Я так и не разобрался, что это за параметр, но как я понял это 64 битное значение в хексе, которое при каждой перезагрузке страницы меняется. Как показали тесты особо не важно какое значение в этой переменной, главное что-бы оно было. Я сделал так
/spreadsheets/d/"+ssID+"/pdf?esid="+(Math.round(Math.random()*10000000))+"&id="+ssID
То есть, подставляю произвольное значение и скрипт работает.
Я обновлю код в статье, но позже. Сейчас какие-то проблемы на сервере. Может вечером или уже завтра утром.
doсs.google.com/spreadsheets/d/{tableID}/pdf?id={tableID}&esid={esid}
От чего зависит этот параметр пока не понимаю.
const theBlob = UrlFetchApp.fetch("
Исключение: нельзя использовать SpreadsheetApp.getUi () из этого контекста. Я надеюсь, что вы можете мне помочь.
Я не могу ответить на ваш вопрос, так как вы не предоставили достаточной информации о том как именно вызывается скрипт.
Проблема, скорее всего возникла при выполнении этого кода
Исключение вам говорит о том, что у вас нет доступа к пользовательскому интерфейсу электронных таблиц.
Доступ к пользовательскому интерфейсу нужен для запуска Javascript кода
Всё, что делает Javascript, это передаёт браузеру ссылку
Если у вас нет доступа к пользовательскому интерфейсу Google Sheets, то вам нужно найти другой способ как передать браузеру эту ссылку
И передать эту ссылку веб-браузеру. Но не с помощью SpreadsheetApp.getUi().showModalDialog , а теми возможностями которые есть в вашей веб-форме.
function myExportLink(){
var as = SpreadsheetApp.openById("1Y0cmIY2mUSzzGP01kjPDZoH-TQwr1FzAsmUOznNeBWY");
var sheet = as.getSheetByName('GRAFICOS');
exportLink(as.getId(), // Id de Tabla
[
[sheet.getSheetId().toString(), // ID de Hoja como cadena
0, // Borde vertical inicial (desde la primera l?nea)
160, // Borde vertical final (hasta la l?nea 160 inclusive)
0, // Borde horizontal inicial (desde la celda A)
8 // Borde del extremo horizontal (celda H incluida)
]
],
[
0, // Не показывать заметки
null,
1, // Показывать линии сетки
0, // Не показывать номера страниц
0, // Не показывать название книги
0, // Не показывать название листа
0, // Не показывать текущую дату
0, // Не показывать текущее время
1, // Повторять закрепленные строки
1, // Повторять закрепленные столбцы
1, // Порядок страниц вниз, затем вверх
1,
null,
null,
1, // Горизонтальное выравниване по левому краю
1 // Вертикальное выравнивание по верхнему краю
],
[
"A4", // Фрмат листа A4
1, // Ориентация страницы вертикальная
2, // Выровнять по высоте
1,
[
0.75, // Отступ сверху 0.75 дюймов
0.75, // Отступ снизу 0.75 дюймов
0.7, // Отступ слева 0.7 дюйма
0.7 // Отступ справа 0.7 дюйма
]
]
);
}
function exportLink(ssID,source,options,format){
var dt=new Date();
var d=encodeDate(dt.getFullYear(),dt.getMonth(),dt.getDate(),dt.getHours(),dt.getMinutes(),dt.getSeconds());
var pc=[null,null,null,null,null,null,null,null,null,0,
source,
10000000,null,null,null,null,null,null,null,null,null,null,null,null,null,null,
d,
null,null,
options,
format,
null,0,null,0];
return '
}
Я не видел вашего кода, я не знаю как и где вы хотите выполнить экспорт. По этому я не могу вам написать правильный код.
Если вы используете Google Forms, то скорее всего вам будет достаточно в функции exportPDF заменить SpreadsheetApp на FormApp
Подскажите, пожалуйста, как конвертировать Google Sheets в Excel?
Спасибо.
Если в самом редактора, то меню "Файл"->"Скачать"->"Microsoft Excel"
Если через скрипт, то
[/code]
Спасибо за Ваш труд!
При экспорте в файл, имя формируется автоматически. Если экспортируется содержимое одного листа, то имя будет следующего вида
Имя книги - Имя листа.pdf
А если экспортируется содержимое из нескольких листов, то имя будет следующего вида
Имя книги.pdf
Если вы экспортируете данные из одно листа, то можно изменить имя этого листа и, соответственно, изменится название файла. Пример:
Подскажите как сделать в одном PDF фале, что бы выгружались первые 10 строчек, потом пропустить 10 строчек, и остальные строчки.
Спасибо большое
Брать отдельные выборки с одного листа не получится. Вы можете скрывать ненужные строки. Пример:
Но сразу же отобразить эти строки не получится. То есть код ниже отправит в PDF весь диапазон вместе со скрытыми строками
В примере ниже источником будет выступать содержимое двух листов с именами "MySheetName" и "MySheetName2"
Такой вопрос. Как сделать так, чтобы 4 листа документа экспортировать (по email) в вертикальной ориентации (как в примере), а 1 в горизонтальной. У меня получилось допилить скрипт под разбивку на два файла в одном сообщении, но я не могу применить форматирование, таким образом у меня приходят 2 одинаковых файла с разным неймингом.
я думаю, что нужно видоизменить функцию function exportPDFtoEMail, я там немного переделал, но на данный момент все испортил. Переменны theBlob не могу переделать так, чтобы брали избранные листы документа.
Заранее благодарю за подсказку!
Третье значение указывает на метод масштабирования:
1) 100%
2) Выровнять по ширине
3) Выровнять по высоте
4) Выровнять по размеру страницы
5) Пользовательский масштаб
Четвертое значение необходимо если в предыдущем значении указано пользовательское масштабирование. Тут мы указываем коэффициент масштабирования с точностью до двух знаков после точки. Например: 50%->0.5, 25%->0.25, 200%->2
В примере ниже устанавливается масштаб по ширине листа
В примере ниже устанавливается масштаб 50%
Не совсем понятно А4 - 100% или я не туда смотрю?
Раньше писали:
[
"A4", // Фрмат листа A4
1, // Ориентация страницы вертикальная
2, // Выровнять по высоте
1,
[
0.75, // Отступ сверху 0.75 дюймов
0.75, // Отступ снизу 0.75 дюймов
0.7, // Отступ слева 0.7 дюйма
0.7 // Отступ справа 0.7 дюйма
]
]
Или в Этом параметре ["A4",1,2,1,[0.75,0.75,0.7,0.7]] нужно 2 заменить на 4 и это будет Выровнять по размеру страницы?
Просто слово ВЫРОВНЯТЬ не совсем понятно в контексте МАСШТАБА...
Если это масштабирование то тогда УМЕСТИТЬ или ВПИСАТЬ или ПОДОГНАТЬ в ширину страницы... По этому я и запутался...
var sheet=as.getActiveSheet();
на
var sheet=as.getSheetByName("MySheetName");
Где MySheetName - название нужного листа