Экспорт таблиц Google Sheets в PDF файл

 

В данной статье я расскажу, как можно экспортировать таблицу Google в PDF файл, в заданном формате, используя Google Script. И еще отправим PDF файл на Google диск и на почту.

UPD 14.03.2021: Скрипт обновлен. Добавлено:

  • указание пути при сохранении в Google Drive. Функция myExportPDFtoGDrive перед сохранением запрашивает путь. Пример пути: "New Folder/Next Folder", папка "New Folder" находится в корне диска
  • скачивание с сохранением на Google диск. При скачивании PDF файла есть сложности с изменением его названия, но при сохранении файла сначала на Google Driva и последующим скачиванием можно задать произвольное имя. Пример функция myExportPDFtoGDrive2
  • прикрепление к письму нескольких файлов. Функция myExportPDFtoEMail2 экспортирует все листы в отдельные PDF файлы и отправляет всё одним письмом
  • добавил определение параметров разрыва страниц. Для работы разрыва страниц в масштабе должна быть установлена шестерка (6 Выровнять по разрывам страниц)

В 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 – скачивание PDF файла
  • myExportPDF – пример использование exportPDF, с использованием разрыва
  • exportPDFtoGDrive – отправка файла в Google Drive c указанием пути сохранения
  • myExportPDFtoGDrive – пример использование exportPDFtoGDrive
  • myExportPDFtoGDrive2 – пример использование exportPDFtoGDrive, с последующим скачиванием файла
  • exportPDFtoEMail – отправка файла на электронную почту
  • myExportPDFtoEMail – пример использование exportPDFtoEMail
  • myExportPDFtoEMail2 – пример использование exportPDFtoEMail, экспортирует все листы в отдельные PDF файлы и отправляет их одним письмом
 
Поделиться:
0
Elena Nikolaevna Gavrilova
31.03.2022 14:22
 
Руслан подскажи а можно как то добавить еще к имени файла, который сохраняется на гугл диск значения из трех ячеек первого листа. Название должно получиться таким: Реестр_31.03.2022_день_4. 31.03.2022 - значение из одной ячейки - текущая дата, день - значение из второй ячейки- смена, может быть день/ ночь, 4 - значение из третей ячейки - номер бригады, может быть 1,2,3,4
Показать полностью
13
Руслан Кандирал
31.03.2022 15:04
Elena Nikolaevna Gavrilova
 
Показать полностью
0
Elena Nikolaevna Gavrilova
31.03.2022 15:20
Руслан Кандирал
 
почти получилось, в названии файла неверно отображается дата
Реестр_Wed Mar 30 2022 17:00:00 GMT-0400 (Восточная Америка, летнее время)_день_бригада_4

и можно ли убрать обозначение часового пояса
Показать полностью
13
Руслан Кандирал
31.03.2022 15:43
Elena Nikolaevna Gavrilova
 
Попробуйте с той ячейкой где дата сделать так
Показать полностью
0
Elena Nikolaevna Gavrilova
31.03.2022 15:49
Руслан Кандирал
 
супер, всё получилось. Вселенское вам спасибо!!!
Показать полностью
0
Elena Nikolaevna Gavrilova
31.03.2022 11:06
 
Здраствуйте, огромное спасибо за скрипт! В сегодняшних условиях очень облегчил и ускорил работу.
Подскажите как можно еще сделать, чтобы с разных вкладок гугл таблицы конвертировать в один файл PDF?
Показать полностью
13
Руслан Кандирал
31.03.2022 12:11
Elena Nikolaevna Gavrilova
 
Здравствуйте!

Как я понял, Вы хотите несколько листов одного документа экспортировать в PDF документ.
Попробуйте так:
Показать полностью
0
Elena Nikolaevna Gavrilova
31.03.2022 13:07
Руслан Кандирал
 
Добавила, но выдает ошибку ReferenceError: sheet is not defined

что я не правильно сделала

Показать полностью
13
Руслан Кандирал
31.03.2022 13:46
Elena Nikolaevna Gavrilova
 
Строка

[ [ sheet.getSheetId().toString() ] ],

нужно изменить на

[ [sheet1.getSheetId().toString()],[sheet2.getSheetId().toString()],[sheet3.getSheetId().toString()] ],

в конце, при сохранении на Google диск
Показать полностью
0
Elena Nikolaevna Gavrilova
31.03.2022 13:56
Руслан Кандирал
 
Руслан, вы мой герой и спаситель!!! Огроменное вам спасибо
Показать полностью
0
Emma Safran
11.03.2022 14:23
 
Thanks for this awesome script, it's really helpful!

Do you know if there is a way to make emojis appear on the PDF?
I have emojis on my spreadsheet, but when I use the myExportPDF function, they do not appear on the PDF.
Показать полностью
13
Руслан Кандирал
11.03.2022 14:48
Emma Safran
 
Most likely you are using the "IMAGE" function to display emojis. Such images are not displayed in the PDF document.

Need to use sheet.insertImage
https://developers.google.com/apps-scrip...

As described here
https://stackoverflow.com/questions/4102...
Показать полностью
0
Emma Safran
13.03.2022 02:45
Руслан Кандирал
 
Hi thanks for your reply!
I confirm that I don't use images.
It's realy emojis in cells.
This one will appear on the PDF : ?
But this one won't : ?? (or ????,?????....)
Показать полностью
0
Emma Safran
13.03.2022 03:02
Emma Safran
 
Показать полностью
13
Руслан Кандирал
13.03.2022 09:04
Emma Safran
 
You use emoticons in text, where each emoticon is a symbol of a certain code table. Due to encoding mismatches in the PDF document, these emoticons are displayed incorrectly or not displayed at all.

This question should be asked to Google support.
An alternative option is to use emoticons as pictures in separate cells
https://webapps.stackexchange.com/questi...

The link above uses the "IMAGE" function, which I wrote about earlier. I also had problems with this function when exporting to a PDF document, but in my case it was large images. I checked that emoticons inserted into cells using the "IMAGE" function are successfully exported to a PDF document.
Показать полностью
0
Emma Safran
13.03.2022 16:13
Руслан Кандирал
 
The image function works perfectly.
Actually I should have used this earlier as it gives a much wider choice than emojis.

Thanks for your help!
Показать полностью
0
Hasanboy Ikromov
08.12.2021 18:09
 
Hello! I just wanted to know how to customize the paper size. I dont need the PDF to be A4 but my own custom sizes: widht: 6cm / height: 13.2 cm. (It is for Thermal Printer)

I have found following but it didnt work out.
https://groups.google.com/g/google-apps-...

I think I have to change the following part but i dont know how.

+ '&size=A4' // paper size
+ '&portrait=true' // orientation, false for landscape
+ '&fitp=true' // fit to width, false for actual size
+ '&sheetnames=true&printtitle=false&pagenumbers=true' //hide optional headers and footers
+ '&gridlines=false' // hide gridlines
+ '&fzr=false';
Показать полностью
13
Руслан Кандирал
08.12.2021 18:37
Hasanboy Ikromov
 
Hello! In my example, You need change the format name to inches. For example, instead of "A4" you can substitute "8.5x13", 8.5 and 13 are the width and height in inches.
Показать полностью
0
Hasanboy Ikromov
08.12.2021 22:55
Руслан Кандирал
 
Cool! I was searching for this script for a long time. Thank you a lot!

Now, I have following issue:
I have a range and only that range should be printed.

Seems like it will be solved in this part:

var as = SpreadsheetApp.getActiveSpreadsheet();
var sheet = as.getActiveSheet();
exportPDF(as.getId(), // Идентификатор таблицы
[ // source
/*
Export full current page
Экспортируем всю текущую страницу
*/
[ sheet.getSheetId().toString() ] //
],

I customized your screen to this:

function encodeDate( yy, mm, dd, hh, ii, ss ){
var days=[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
if(((yy % 4) == 0) && (((yy % 100) != 0) || ((yy % 400) == 0)))days[1]=29;
for(var i=0; i<mm; i++) dd += days[ i ];
yy--;
return ((((yy * 365 + ((yy-(yy % 4)) / 4) - ((yy-(yy % 100)) / 100) + ((yy-(yy % 400)) / 400) + dd - 693594) * 24 + hh) * 60 + ii) * 60 + ss)/86400.0;
}

function openUrl( url ){
//Browser.msgBox( '\\\"' );
var html = HtmlService.createHtmlOutput( '<html><script>' +
'window.close = function(){window.setTimeout(function(){google.script.host.close()},9)};' +
'var a = document.createElement("a"); a.href="' + url + '"; a.target="_blank";' +
'if(document.createEvent){' +
' var event=document.createEvent("MouseEvents");' +
' if(navigator.userAgent.toLowerCase().indexOf("firefox")>-1){window.document.body.append(a)}' +
' event.initEvent("click",true,true); a.dispatchEvent(event);' +
'}else{ a.click() }' +
'close();' +
'</script>' +
'<body style="word-break:break-word;font-family:sans-serif;">Failed to open automatically. <a href="' + url + '" target="_blank" onclick="window.close()">Click here to proceed</a>.</body>' +
'<script>google.script.host.setHeight(40);google.script.host.setWidth(410)</script>' +
'</html>').setWidth( 90 ).setHeight( 1 );
SpreadsheetApp.getUi().showModalDialog( html, "Opening ..." );
}

function getESID(){
return ( Math.round( Math.random() * 10000000 ) );
}

function exportPDF( ssID, source, options, format, breaks){
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, breaks, 0 ];
openUrl( "https://docs.google.com/spreadsheets/d/&...; + ssID + "/pdf?" +
"esid=" + getESID() + "&" +
"id=" + ssID + "&" +
"a=true&" +
"pc=" + encodeURIComponent( JSON.stringify( pc ) ) + "&" +
"gf=[]&" +
"lds=[]" );
}

//************************** */

function onOpen(e) {
var ui = SpreadsheetApp.getUi();
var menu = ui.createMenu('Payment');
menu.addItem('Tolovni saqlash', 'paying')
menu.addSeparator()

submenu = ui.createMenu('Qarzdorlik va Haqdorlik');
menu.addToUi();
}

function paying() {

//declare variable and set the reference of active google sheets

var myGoogleSheet=SpreadsheetApp.getActiveSpreadsheet();

var shUserForm=myGoogleSheet.getSheetByName("Payment");

var payrange = [[
shUserForm.getRange("A22").getValue(), // Vaqt Va sana
shUserForm.getRange("B3").getValue(), // ID
shUserForm.getRange("B4").getValue(), // Ism
shUserForm.getRange("B5").getValue(), // Familya
shUserForm.getRange("B6").getValue(), // O'qituvchi
shUserForm.getRange("B7").getValue(), // Fan
shUserForm.getRange("B8").getValue(), // Kun-Vaqt
shUserForm.getRange("B9").getValue(), // Fillial
shUserForm.getRange("B10").getValue(), // Xona
shUserForm.getRange("B11").getValue(), // Chegirma
shUserForm.getRange("B12").getValue(), // Status
shUserForm.getRange("B13").getValue(), // System
shUserForm.getRange("B14").getValue(), // To'lashi kerak
shUserForm.getRange("A16").getValue(), // To'lamoqda
shUserForm.getRange("B17").getValue(), // Qoldiq
shUserForm.getRange("B19").getValue(), // Kassir
shUserForm.getRange("B20").getValue(), // Check ID
shUserForm.getRange("B23").getValue() // To'lov turi
]]

var datasheet=myGoogleSheet.getSheetByName("Database");
var datasheet2=myGoogleSheet.getSheetByName("protecteddatabase");

//to create the instance of the user interface environment to use the alert features

var ui=SpreadsheetApp.getUi();

var response=ui.alert("Saqlashni tasdiqlash", "Malumotlar saqlansinmi?", ui.ButtonSet.YES_NO);

//checking the user response

if(response==ui.Button.NO){

return; //to exit from this function

}

// not protecteddatabase
var ss = datasheet;
for (var i = 0; i < payrange.length; i++) {
ss.appendRow(payrange); }

// protecteddatabase

var ss2 = datasheet2;
for (var i = 0; i < payrange.length; i++) {
ss2.app
Показать полностью
0
Alex Bergeron
19.11.2021 06:17
 
Привет, очень полезно. Я использую эту функцию для отправки в PDF по электронной почте с использованием указанной ячейки. Вы знаете, как я могу совместить это с вашим хаком для вставки разрывов страниц? Спасибо

Показать полностью
13
Руслан Кандирал
19.11.2021 15:16
Alex Bergeron
 
Здравствуйте!
Вы используете совершенно иной метод экспорта таблицы в PDF. Я видел похожие примеры, но так и не использовал их так как там недостаточно параметров для форматирования итогового PDF документа.
Если вам нужен разрыв, то как мне кажется, будет проще использовать тот пример, который описан в этой статье. Если вы более подробно опишите, что конкретно вам нужно сделать, то я могу помочь сделать скрипт с разрывами.
Показать полностью
0
Alex Bergeron
22.11.2021 03:49
Руслан Кандирал
 
Я хотел бы знать, как добавить разрывы страниц в функцию exportPDFtoEMail. Спасибо
Показать полностью
13
Руслан Кандирал
22.11.2021 11:07
Alex Bergeron
 
В функции exportPDFtoEMail, последний параметр breaks отвечает за разрывы.
А вот описание того, что должен представлять из себя этот параметр
Показать полностью
0
Parlamentvlad Vlad
07.11.2021 22:17
 
Добрый День! Рабочий скрипт подстановки в форму данных из Google таблици.
Как созданный файл отправить на адрес электронной почты который находится в Google таблице в ячейке А28

Показать полностью
0
Алексей Зубко
13.10.2021 15:29
 
Добрый день, подскажите, возможно ли экспортировать в pdf страницу, которая скрыта, пишет, что страница не найдена
Показать полностью
13
Руслан Кандирал
13.10.2021 22:05
Алексей Зубко
 
Здравствуйте, Алексей!

Нет нельзя. Но можно лист открыть, перед экспортом
Показать полностью
0
Георгий Мезенцев
02.08.2021 16:43
 
Добрый день! А как добавить в скрипт выгрузки PDF на компьютер, всплывающее окно с выбором страниц для выгрузки?
Показать полностью
13
Руслан Кандирал
02.08.2021 20:00
Георгий Мезенцев
 
Здравствуйте, Георгий!

Извините, немного напутал и сделал для загрузки на Google диск. Но суть та же. Основная функция showDialog создает диалоговое окно со списком страниц текущего документа. После нажатия OK в диалоге, вызовется функция myExportPDFtoGDrive3, в которую будет передан индекс выбранной страницы.

Показать полностью
0
Георгий Мезенцев
02.08.2021 20:22
Руслан Кандирал
 
Руслан, извините меня, я далёк от программирования, но вчера меня эта тема затянула и я до 8 утра увлёкся этим процессом))) Я правильно понимаю, что эту функцию я вставляю в любое место скрипта и она заработает? Или у скрипта есть алгоритм последовательности действий?
Показать полностью
13
Руслан Кандирал
02.08.2021 20:32
Георгий Мезенцев
 
Да, можно вставить в любом месте. Но вам нужно вызвать функцию showDialog() для того чтобы диалог отобразился.
Показать полностью
0
Георгий Мезенцев
02.08.2021 20:50
Руслан Кандирал
 
Класс! Получилось, Спасибо:))) А как выбирать несколько страниц для выгрузки?
Показать полностью
13
Руслан Кандирал
02.08.2021 20:58
Георгий Мезенцев
 
Тогда лучше для выбора страниц вместо select использовать checkbox
Показать полностью
0
Георгий Мезенцев
02.08.2021 21:06
Руслан Кандирал
 
Заменил и получилось, что выбор пропал, а чек-боксы не появились :(
Показать полностью
13
Руслан Кандирал
02.08.2021 21:23
Георгий Мезенцев
 
Показать полностью
0
Георгий Мезенцев
02.08.2021 21:32
Руслан Кандирал
 
Я наверное Вас замучал, но последний вопрос задам: А можно ли сделать так, чтобы после диалогового окна и выбора страниц, файл скачивался на компьютер?
Показать полностью
13
Руслан Кандирал
02.08.2021 21:53
Георгий Мезенцев
 
Показать полностью
0
Георгий Мезенцев
02.08.2021 21:59
Руслан Кандирал
 
Не скачивается(
Показать полностью
13
Руслан Кандирал
02.08.2021 22:41
Георгий Мезенцев
 
Проверил
Показать полностью
0
Кутькин Антон Алексеевич
24.11.2022 08:56
Руслан Кандирал
 
Руслан, очень конечно крутой скрипт! Спасибо! Разобрался, перебрал его под свои нужды! А мне всего лишь нужно было сохранять файл Гугл Таблицы в ПДФ, чтоб затем распечатывать в нескольких экземплярах (сохранение в ПДФ скорее хотелось бы оставить, чтоб хранились данные других месяцев). Но вот задача: некоторые листы имеют другую ориентацию, можно ли как то для определенных листов задавать свой набор опций для печати в ПДФ? Спасибо за ответ!
Показать полностью
0
Георгий Мезенцев
02.08.2021 23:44
Руслан Кандирал
 
Очень круто, спасибо огромное :)))))))
Показать полностью
0
Денис Синкевич
27.07.2021 16:11
 
Здравствуйте, Руслан!
Как сделать, чтобы таблица автоматически ежедневно в назначенное время сохранялась на гугл-диске или отправлялась на почту?
Показать полностью
13
Руслан Кандирал
27.07.2021 19:14
Денис Синкевич
 
Здравствуйте!
Я такого никогда не делал, но вам скорее всего нужно копать в сторону Time-driven triggers
https://developers.google.com/apps-scrip...
Показать полностью
0
Денис Синкевич
28.07.2021 16:49
Руслан Кандирал
 
Еще вопрос (ибо гуманитарий): как сделать чтобы сохранялся на гугл-диск без вывода запроса "Set Google Drive Path"?
Показать полностью
13
Руслан Кандирал
29.07.2021 08:22
Денис Синкевич
 
Вместо запроса

нужно указать путь к папке на Google Drive

Показать полностью
0
Роман Тибилов
23.07.2021 22:51
 
Здравствуйте!
Как сделать чтобы отправлялось на предопределенный в скрипте емейл, без вызова меню Input E-mail address?
Показать полностью
13
Руслан Кандирал
23.07.2021 23:30
Роман Тибилов
 
Здравствуйте!

Вместо кода:
вставить такой код:
Показать полностью
0
Роман Тибилов
24.07.2021 08:40
Руслан Кандирал
 
Спасибо!
Показать полностью
0
Роман Вернигора
12.07.2021 16:26
 
Добрый день. Как сделать тоже самое, но в exel? Сохранить в exel на локальный диск-получилось. Надо еще сохранить этот файл с переименованием(добавлением текущей даты) именно на локальном и гугл диске. Потом отправить этот файл по емейл.
Показать полностью
13
Руслан Кандирал
18.07.2021 14:27
Роман Вернигора
 
Статья по экспорту таблиц Google Sheets в файл MS Excel
https://kandiral.ru/googlescript/eksport...
Показать полностью
0
Yuri Evseenkov
25.05.2021 09:50
 
Здравствуйте Руслан! Отличная работа! Скажите пожалуйста, как сделать чтобы пдф сохранялся на диске в папке в которой другой владелец. Сохранять в папке гдя я владелец у меня отлично получается, а там где я редактор выдает ошибку пути.
Показать полностью
13
Руслан Кандирал
25.05.2021 13:51
Yuri Evseenkov
 
Здравствуйте! Я такого не делал, по этому точно сказать не могу.
В моём примере идет жесткая привязка к текущему диску в функции getFolder
А вам нужно с помощью DriveApp.getFolderById получить доступ к папке на другом диске.
То есть, функции exportPDFtoGDrive все равно куда сохранять файл, она его сохраняет туда, куда указывает параметр folder. А вот как получить указатель на папку другого владельца, это уже нужно копать в сторону DriveApp.getFolderById
https://developers.google.com/apps-scrip...
Показать полностью
0
Yuri Evseenkov
25.05.2021 15:24
Руслан Кандирал
 
Спасибо огромное! Дай Бог здоровья! Да , чтобы отправить пдф в папку где ты не являешься владельцем, я заменил в функции myExportPDFtoGDrive() строку
var folder = getFolder(folderPath);
на
var folder = DriveApp.getFolderById(ID нужной папки); и сработало.
Показать полностью
0
Andrey Tolstunov
29.03.2021 09:46
 
Здравствуйте Руслан!
Спасибо что поделились наработками, много времени сэкономит.
Подскажите пожалуйста, как сделать так, чтобы письма, автоматически отправляемые по расписанию (раз в неделю) на почте шли одной веткой, а не по отдельности. Пробовал указывать в теме письма "Re: ", но это не работает.

Ну и чтобы поддержать сообщество прикладываю решение для конвертации документа одновременно в пдф и excel и отправка двух файлов одним письмом по расписанию. Название файлов берётся в соответствии с содержимым ячейки.

Показать полностью
13
Руслан Кандирал
29.03.2021 11:18
Andrey Tolstunov
 
Здравствуйте, Андрей

Цепочка писем формируется на стороне клиента. И уже от самого клиента зависит будет ли он объединять письма в одну ветвь(цепочку) или нет. Если, конечно, я вас правильно понял.

Вот правила по которым GMail формирует цепочки писем:
https://support.google.com/mail/answer/5...
Показать полностью
0
Andrey Tolstunov
29.03.2021 13:30
Руслан Кандирал
 
Как оказалось не только от клиента зависит. Для ссылки на другое письмо используется его Message-ID, который надо указывать в заголовке In-Reply-To...
Я не силён в программировании, но так понимаю что метод sendEmail не позволяет менять In-Reply-To.
Понятно что конкретно Gmail может такое объединять корректно а я у себя могу создать правило распределения письма, но отправка сообщений в моём случае происходит в основном пользователям яндекс-почты (где это не работает так легко и китайцам у которых вообще всё работает через жопу).
Показать полностью
13
Руслан Кандирал
29.03.2021 16:09
Andrey Tolstunov
 
В функции exportPDFtoEMail можно добавить заголовки
Показать полностью
0
YO LO
16.03.2021 01:05
 
Здравствуйте.
Скопировал Ваш скрипт. запустил myExportPDFtoGDrive, при выполнения функции myExportPDFtoGDrive всплывает ошибка "TypeError: Cannot read property 'createFile' of null" Помогите разобраться.
Показать полностью
13
Руслан Кандирал
16.03.2021 06:03
YO LO
 
Здравствуйте.
Некорректно введен путь.
Показать полностью
0
YO LO
16.03.2021 21:52
Руслан Кандирал
 
Подскажите как указать верный путь. Пытался по разному, но так и не получается.
Показать полностью
13
Руслан Кандирал
17.03.2021 20:33
YO LO
 
Для отправки файла на Google Drive вам нужно в функцию exportPDFtoGDrive, первым параметром передать объект типа Folder
https://developers.google.com/apps-scrip...

Для получения объекта Folder из строкового представления пути у меня в скрипте есть функция getFolder. Путь должен быть представлен в виде последовательных названий папок, разделенных обратным слешем /. Пример:
Folder1/Folder2/Folder3
Слеш вначале и в конце не обязательны, но если они будут, то это не будет ошибкой

Если функция getFolder не находит нужный путь, то она возвратит null, а null переданный в функцию exportPDFtoGDrive вызывает ошибку про которую вы писали в первом комментарии.

Возможно функция getFolder не правильно обрабатывает название какой-то из ваших папок. Напишите путь который вы прописываете, я попробую проверить у себя.
Показать полностью
0
YO LO
17.03.2021 22:55
Руслан Кандирал
 
Показать полностью
13
Руслан Кандирал
18.03.2021 00:07
YO LO
 
Я имел ввиду путь, а не ссылку. Что-то типа
\Папка1\Папка2
Показать полностью
0
Pavel L
03.03.2021 01:49
 
Подскажите, пожалуйста, какие параметры отвечают за положение разрывов страниц. я так понимаю, что скорее всего это послдняя пара после format

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];

Нужно задать несколько десятков разрывов, что довольно муторно делать вручную. Как их задать ? Если можно пример кода. (сам ковырялся, но так и не заработало)
Показать полностью
0
Евгений Залепухин
16.01.2021 19:51
 
Здравствуйте, скопировал Ваш скрипт. запустил myExportPDFtoGDrive, файл сохранился, но там какой-то html. Что это может быть?
Показать полностью
13
Руслан Кандирал
16.01.2021 20:37
Евгений Залепухин
 
Здравствуйте!

Скопируйте ещё раз. Я исправил. Там в запросе добавилась переменная "esid", в других функциях я её добавил, а в экспорт на Google Drive нет.
Показать полностью
0
Сергей З.
03.12.2020 16:38
 
Здравствуйте! Очень нужная вещь. Но не могу понять почему отправляется только первая страница документа, а также не понимаю как убрать столбец с кнопками макросов. Вот что у меня.
Показать полностью
13
Руслан Кандирал
03.12.2020 22:16
Сергей З.
 
Здравствуйте, Сергей

По количеству страниц вы сделали правильно. Я проверил такой код:
У меня в PDF уходит два листа. Смотрите возможно ошибка в имени листа.
Что-бы кнопки не попадали в PDF, нужно указать границы экспорта для каждого листа

[sheet.getSheetId().toString(), // ID листа в виде строки
0, // начальная граница по вертикали (с первой строки)
160, // конечная граница по вертикали (по 160-ую строку включительно)
0, // начальная граница по горизонтали (с ячейки A)
8 // конечная граница по горизонтали (по ячейку H включительно)
]
Показать полностью
0
Тёма Ларионов
18.11.2020 09:21
 
Добрый день. Спасибо за очень функциональный код. Пользовался форматированием при отправке по почте , т.к. стандартная отправка не позволяет это делать. Все отлично работало до сегодняшнего дня. Похоже что то поменялось внутри гугла. Обнаружил, что в списке параметров a, pc, gf добавился еще один - lds. Добавил его в 'payload' но проблему это не решило. На почту по прежнему приходит html файл с именем filename.pdf внутри следующий текст: "Произошла ошибка. Попробуйте перезагрузить страницу или повторите попытку через несколько минут. Чтобы узнать больше о редакторах Google Документов, посетите наш Справочный центр Приносим извинения за доставленные неудобства. Команда Google Документов." Надеюсь что вы сможете мне помочь.
Показать полностью
13
Руслан Кандирал
18.11.2020 13:52
Тёма Ларионов
 
Здравствуйте!

Да, Вы правы, без этой переменной скрипт не срабатывает. Я так и не разобрался, что это за параметр, но как я понял это 64 битное значение в хексе, которое при каждой перезагрузке страницы меняется. Как показали тесты особо не важно какое значение в этой переменной, главное что-бы оно было. Я сделал так

/spreadsheets/d/"+ssID+"/pdf?esid="+(Math.round(Math.random()*10000000))+"&id="+ssID

То есть, подставляю произвольное значение и скрипт работает.
Показать полностью
0
Тёма Ларионов
18.11.2020 17:22
Руслан Кандирал
 
Я вбил статическое значение в эту переменную esid и тоже пока все работает. Тестировал под разными пользователями.
Показать полностью
0
Alexander Shevyakov
18.11.2020 17:28
Тёма Ларионов
 
Да, тоже заработало, спасибо!
Показать полностью
Комментарий удален
13
Руслан Кандирал
18.11.2020 16:16
Alexander Shevyakov
 
Обновил код в статье
Показать полностью
13
Руслан Кандирал
18.11.2020 15:37
Alexander Shevyakov
 
А какая разница, они же в списке переменных. Я тестировал и со скачиванием и с отправкой на почту.
Я обновлю код в статье, но позже. Сейчас какие-то проблемы на сервере. Может вечером или уже завтра утром.
Показать полностью
0
Тёма Ларионов
18.11.2020 11:25
Тёма Ларионов
 
Проблема обнаружилась в Request URL. Там добавился параметр esid. Теперь урл выглядит так:
doсs.google.com/spreadsheets/d/{tableID}/pdf?id={tableID}&esid={esid}
От чего зависит этот параметр пока не понимаю.
Показать полностью
0
Alexander Shevyakov
18.11.2020 12:47
Тёма Ларионов
 
Добрый день, у Вас получилось вренуть PDF? Я подставил esid - все равно приходит Html. Так же поигрался с классикой - getBlob() заменил на getAs("application/pdf") - тщетно
Показать полностью
0
Тёма Ларионов
18.11.2020 13:42
Alexander Shevyakov
 
Да, у меня все заработало после добавления esid в урл и параметра lds в payload. Но я работаю только с отправкой почтой.
Показать полностью
0
Alexander Shevyakov
18.11.2020 13:51
Тёма Ларионов
 
Что то типа такого:
const theBlob = UrlFetchApp.fetch("https://docs.google.com/spreadsheets/d/&...;, options).getBlob();
Показать полностью
0
Gianmarco Nizama Garc?a
16.10.2020 04:21
 
Привет! Спасибо, что поделились этим решением. У меня проблема. Это работает только при добавлении меню из самой таблицы расчетов. Если у меня есть веб-форма, я добавляю к ней кнопку и хочу экспортировать ее в pdf с помощью кнопки, появится сообщение:
Исключение: нельзя использовать SpreadsheetApp.getUi () из этого контекста. Я надеюсь, что вы можете мне помочь.
Показать полностью
13
Руслан Кандирал
16.10.2020 04:55
Gianmarco Nizama Garc?a
 
Здравствуйте!

Я не могу ответить на ваш вопрос, так как вы не предоставили достаточной информации о том как именно вызывается скрипт.

Проблема, скорее всего возникла при выполнении этого кода

Исключение вам говорит о том, что у вас нет доступа к пользовательскому интерфейсу электронных таблиц.
Доступ к пользовательскому интерфейсу нужен для запуска Javascript кода

Всё, что делает Javascript, это передаёт браузеру ссылку

Если у вас нет доступа к пользовательскому интерфейсу Google Sheets, то вам нужно найти другой способ как передать браузеру эту ссылку
Показать полностью
0
Gianmarco Nizama Garc?a
16.10.2020 05:45
Руслан Кандирал
 
На самом деле ошибка там, где она указывается. Опция правильно работает с той же таблицей, создав выпадающее меню. Но то, что я хочу сделать, - это кнопка в отдельном скрипте приложения, которая показывает веб-форму, и когда я нажимаю кнопку, я хочу, чтобы она экспортировала файл pdf уже определенной электронной таблицы.
https://script.google.com/macros/s/AKfyc...
Показать полностью
13
Руслан Кандирал
16.10.2020 06:05
Gianmarco Nizama Garc?a
 
Вым нужно сформировать ссылку экспорта таблицы в PDF
И передать эту ссылку веб-браузеру. Но не с помощью SpreadsheetApp.getUi().showModalDialog , а теми возможностями которые есть в вашей веб-форме.
Показать полностью
0
Gianmarco Nizama Garc?a
16.10.2020 07:16
Руслан Кандирал
 
Указанное я уже разместил, но, к сожалению, он ничего не экспортирует.



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 'https://docs.google.com/spreadsheets/d/&...+"&gf=[]';
}
Показать полностью
13
Руслан Кандирал
16.10.2020 13:11
Gianmarco Nizama Garc?a
 
exportLink возвращает ссылку для экспорта. То есть эта функция не осуществляет экспорт, а только формирует ссылку для экспорта.

Я не видел вашего кода, я не знаю как и где вы хотите выполнить экспорт. По этому я не могу вам написать правильный код.

Если вы используете Google Forms, то скорее всего вам будет достаточно в функции exportPDF заменить SpreadsheetApp на FormApp
Показать полностью
0
Gianmarco Nizama Garc?a
17.10.2020 02:13
Руслан Кандирал
 
Большое спасибо. После нескольких попыток, исправлений и модификаций я наконец смог добиться того, чего хотел. Ваша информация и эта часть кода очень помогли мне, и я буду использовать ее в своем проекте. Еще раз спасибо за ваши прекрасные знания и вклад.
Показать полностью
0
Александр Александров
13.05.2020 14:56
 
Добрый день, Руслан.
Подскажите, пожалуйста, как конвертировать Google Sheets в Excel?
Спасибо.
Показать полностью
13
Руслан Кандирал
13.05.2020 16:53
Александр Александров
 
Здравствуйте, Александр!

Если в самом редактора, то меню "Файл"->"Скачать"->"Microsoft Excel"

Если через скрипт, то

[/code]
Показать полностью
0
Александр Александров
13.05.2020 17:09
Руслан Кандирал
 
Спасибо. Очень интересное решение!
Показать полностью
0
Евгения Токарева
05.04.2020 09:51
 
Добрый день, Руслан. Спасибо большое за код и инструкции! Есть вопрос: Как присвоить экспортированному файлу имя при простом скачивании PDF (functionName:"myExportPDF")? При экспорте на Drive и отправке по email я разобралась, как изменить имя (мне нужны были в имени файла дополнительно текущая дата и имя заказчика из определенной ячейки таблицы). А вот с myExportPDF не получилось.
Спасибо за Ваш труд!
Показать полностью
13
Руслан Кандирал
05.04.2020 10:32
Евгения Токарева
 
Здравствуйте, Евгения!

При экспорте в файл, имя формируется автоматически. Если экспортируется содержимое одного листа, то имя будет следующего вида
Имя книги - Имя листа.pdf
А если экспортируется содержимое из нескольких листов, то имя будет следующего вида
Имя книги.pdf
Если вы экспортируете данные из одно листа, то можно изменить имя этого листа и, соответственно, изменится название файла. Пример:
Показать полностью
0
Дмитрий Маркевич
23.03.2020 13:11
 
Добрый день.

Подскажите как сделать в одном PDF фале, что бы выгружались первые 10 строчек, потом пропустить 10 строчек, и остальные строчки.

Спасибо большое
Показать полностью
13
Руслан Кандирал
23.03.2020 14:28
Дмитрий Маркевич
 
Здравствуйте, Дмитрий

Брать отдельные выборки с одного листа не получится. Вы можете скрывать ненужные строки. Пример:
Но сразу же отобразить эти строки не получится. То есть код ниже отправит в PDF весь диапазон вместе со скрытыми строками
Показать полностью
0
Дмитрий Маркевич
23.03.2020 17:37
Руслан Кандирал
 
спасибо большое
Показать полностью

Новости сайта

18.07.2021 14:30
Новая статья по экспорту Google Sheet в MS Excel
Экспорт таблиц Google Sheets в файл MS Excel с помощью Google Script, а также сохранение на Google Drive и отправка на e-mail
30.03.2021 14:53
Обновлен набор компонентов для Delphi
Пакет компонентов для Delphi обновлен до версии от 30.03.2021 г.
14.03.2021 04:54
Обновлен скрипт экспорта Google таблиц в PDF
Добавлены новые возможности при экспорте Google таблиц в PDF файл
22.01.2021 11:45
Обновлен пакет компонентов для Delphi
В пакет компонентов для Delphi было внесено большое количество изменений, касающиеся протокола Modbus и мультиязычности

Популярные статьи

Экспорт таблиц Google Sheets в PDF файл, на email и на Google диск
Экспорт таблиц Google Sheets в PDF файл с помощью Google Script с последующим скачиванием или сохранением на Google Drive или отправкой на почту
Modbus Slave на Arduino
Реализация клиентской части протокола Modbus RTU и Modbus ASCII для контроллеров Arduino
Инструкция по установке компонентов на Delphi
Подробная инструкция по установке компонентов на Delphi с видео обзором
Пример передачи данных по протоколу Modbus на Delphi
Пример передачи данных с контроллера ОВЕН ПЛК100 в программу на Delphi по протоколу Modbus