Есть ли способ преобразовать все рабочие листы в электронной таблице листов Google в отдельные PDF-файлы?Python

Программы на Python
Ответить
Anonymous
 Есть ли способ преобразовать все рабочие листы в электронной таблице листов Google в отдельные PDF-файлы?

Сообщение Anonymous »

В настоящее время у меня есть электронная таблица Google Sheets для проекта, над которым я работаю, со множеством листов. Я ищу способ преобразовать каждый рабочий лист в PDF-файл, где имя PDF-файла является именем рабочего листа. Мне также нужно сохранить формат. Мой текущий метод — преобразовать каждый отдельный лист в PDF-файл с помощью метода File->Download->.pdf.
Я пробовал решения на Apps Script и Python.
Это был код appscript, который я пробовал

Код: Выделить всё

function downloadasPDF() {
// Get start time of execution
var startTime = new Date();

// Get user properties
var scriptProperties = PropertiesService.getScriptProperties();
var currentSheetIndex = Number(scriptProperties.getProperty('currentSheetIndex')) || 0;
// Delete existing trigger

// Defining variables
var spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
var sheets = spreadSheet.getSheets();
var mainSheet = spreadSheet.getActiveSheet();

// Get or create folder
var parentFolder = DriveApp.getFolderById("MY FOLDER TO SAVE TO");

var options = {
method: 'GET',
headers: {
Authorization: 'Bearer ' + ScriptApp.getOAuthToken()
},
muteHttpExceptions: true,
};
Logger.log(sheets.length)
var fileId = spreadSheet.getId();
// Loop through the sheets
for (var i=currentSheetIndex ; i < sheets.length; i++) {
Logger.log(i)
// Get current time and check if it exceeds 5 mins
var currentTime = new Date().getTime();
if (currentTime - startTime >= 4.75 * 60 * 1000) { // If reaching 4 minutes 45 seconds
ScriptApp.newTrigger('downloadasPDF')
.timeBased()
.after(1000) // Start the next execution after 1 second
.create();
break;
}

var url = "https://docs.google.com/spreadsheets/d/SS_ID/export?".replace("SS_ID", fileId);
var sheetName = sheets[i].getName();

var url_ext = 'exportFormat=pdf&format=pdf'
+ '&size=A4'
+ '&portrait=true'
+ '&fitp=true&source=labnol'
+ '&sheetnames=false&printtitle=false'
+ '&pagenumbers=false&gridlines=false'
+ '&gid=';
// Export as PDF
do var response = UrlFetchApp.fetch(url + url_ext + sheets[i].getSheetId(), options); while (response.getResponseCode() != 200);
var file = response.getBlob();
file.setName(sheetName + ".pdf");
parentFolder.createFile(file);
scriptProperties.setProperty('currentSheetIndex', i+1);

}
if (currentSheetIndex >= sheets.length) {
scriptProperties.deleteProperty('currentSheetIndex');
}
}
Приведенный выше код основан на других вопросах о переполнении стека, которые я нашел. Однако, несмотря на то, что я установил триггер на запуск той же функции сразу после завершения предыдущей, триггер не запускается, и код заканчивается на отметке 4,75 минуты (чтобы предотвратить тайм-аут около 5 минут).
Для Python я не смог найти способ сделать это с помощью Gspread, поэтому я хотел преобразовать всю электронную таблицу в Excel, который затем можно было бы преобразовать в PDF с помощью другой библиотеки.

Код: Выделить всё

class GoogleSheetsClient:
def __init__(self, credentials_path: str):
self.credentials_path = credentials_path
self.gc = gspread.service_account(filename=Path(self.credentials_path))
def get_client(self):
return self.gc

def export_googlesheeets_as_excel_file(sheets_clients: GoogleSheetsClient, id: str):
client = sheets_clients.get_client()
path = os.path.join("pdf_outputs", "googlesheets.xlsx")
f = open(path, "wb")
f.write(
client.export(
id,
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
)
)
f.close()

def export_as_pdf(base_file):
try:
excel = win32com.client.Dispatch("Excel.Application")
excel.Visible = False
wb = excel.Workbooks.Open(base_file)
sheets_in_workbook = wb.Worksheets
pdf_path = "C:/Path/To/PDF/Folder"
for i in len(sheets_in_workbook):
ws = wb.Worksheets[i]
ws.SaveAs(f"{pdf_path}/{i}.pdf", FileFormat=57)
except Exception as e:
print(e)
finally:
wb.Close()
excel.Quit()
Клиент Google Sheets — это класс, который я использую для другого проекта Google Sheets. Основная проблема, с которой я столкнулся, заключается в том, что Excel, который у меня есть, не активирован, поэтому я предполагаю, что не могу ничего сохранить в формате PDF.
Хотелось бы знать, есть ли какие-нибудь лучшие способы или библиотеки для выполнения этой задачи.

Подробнее здесь: https://stackoverflow.com/questions/785 ... preadsheet
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»