Преобразуйте Google Sheet в PDF и сохраните в той же папке Google Диска, что и лист

Настройка

У меня есть пустой шаблон счета-фактуры Google Sheet в папке.

Используя Python, Gspread и PyDrive, я дублирую шаблон и заполняю копию данными.


Вопрос

Клиенты должны получать счет в формате pdf, а не в Google.

Я столкнулся с этим вопросом, где указано, как экспортировать лист локально в pdf, а именно:

file_obj = drive.CreateFile({'id': 'sfkldjlfsdkjfgdklj'})
file_obj.GetContentFile('temp.pdf', mimetype='application/pdf')

Как я могу создать PDF-файл из таблицы Google, но вместо того, чтобы загружать PDF-файл локально, сохранить его в той же папке Google Диска, что и Google Sheet?


person LucSpan    schedule 30.03.2020    source источник


Ответы (2)


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

Если я правильно понимаю, как насчет этого ответа? Подумайте об этом как об одном из нескольких возможных ответов.

Проблема и решение:

К сожалению, электронную таблицу Google нельзя напрямую преобразовать и экспортировать в Google Диск с помощью Google API. В этом случае необходимо использовать обходные пути. В этом ответе я хотел бы предложить следующие 2 обходных пути.

Схема 1:

В этом шаблоне ваша цель достигается с помощью pydrive. В этом случае электронная таблица загружается на локальный компьютер в виде файла PDF, а файл PDF загружается в ту же папку электронной таблицы на Google Диске.

Пример сценария:

spreadsheet_id = '###'  # Please set the Spreadsheet ID.
pdf_filename = 'sample.pdf'

drive = GoogleDrive(gauth)

# Download Spreadsheet as PDF file.
dl_file = drive.CreateFile({'id': spreadsheet_id})
dl_file.GetContentFile(pdf_filename, mimetype='application/pdf')

# Get parent folder ID of the Spreadsheet.
url = 'https://www.googleapis.com/drive/v3/files/' + spreadsheet_id + '?fields=parents'
headers = {'Authorization': 'Bearer ' + drive.auth.credentials.token_response["access_token"]}
res = requests.get(url, headers=headers)

# Upload the PDF file to the same folder of Spreadsheet.
up_file = drive.CreateFile({'parents': [{'id': res.json()['parents'][0]}]})
up_file.SetContentFile(pdf_filename)
up_file.Upload()
print('title: %s, mimeType: %s' % (up_file['title'], up_file['mimeType']))
  • Чтобы получить идентификатор родительской папки Spreadsheet, я использовал метод files.get в Drive API, используя requests.

Схема 2:

В этом шаблоне ваша цель достигается с помощью веб-приложений, созданных с помощью скрипта Google Apps. В этом случае с помощью веб-приложений электронная таблица преобразуется в формат PDF и создается файл в той же папке, что и электронная таблица. Таким образом, процесс может выполняться только на стороне Google. Сценарий python отправляет по запросу только идентификатор электронной таблицы. Для этого выполните следующую последовательность действий.

1. Создайте новый проект скрипта Google Apps.

Пример сценария веб-приложений - это сценарий Google Apps. Поэтому создайте проект скрипта Google Apps.

Если вы хотите создать его напрямую, перейдите на страницу https://script.new/. В этом случае, если вы не вошли в систему Google, откроется экран входа в систему. Пожалуйста, войдите в Google. При этом открывается редактор сценариев Google Apps Script.

2. Подготовить сценарий.

Скопируйте и вставьте следующий скрипт (скрипт Google Apps) в редактор скриптов. Этот сценарий предназначен для веб-приложений.

function doGet(e) {
  var spreadsheetId = e.parameter.id;
  var file = DriveApp.getFileById(spreadsheetId);
  var blob = file.getBlob();
  var folder = file.getParents().next();
  var pdfFile = folder.createFile(blob.setName(file.getName() + ".pdf"));
  return ContentService.createTextOutput(pdfFile.getId());
}
  • В этом случае используется метод GET.

3. Разверните веб-приложения.

  1. В редакторе скриптов откройте диалоговое окно, выбрав «Опубликовать» -> «Развернуть как веб-приложение».
  2. Select "Me" for "Execute the app as:".
    • By this, the script is run as the owner.
  3. Select "Anyone, even anonymous" for "Who has access to the app:".
    • In this case, no access token is required to be request. I think that as the test case, I recommend this setting.
    • Конечно, вы также можете использовать токен доступа. В то время выберите «Любой».
  4. Нажмите кнопку «Развернуть» как новую «версию проекта».
  5. Automatically open a dialog box of "Authorization required".
    1. Click "Review Permissions".
    2. Выберите собственную учетную запись.
    3. Нажмите «Дополнительно» в разделе «Это приложение не проверено».
    4. Нажмите "Перейти к ### имени проекта ### (небезопасно)"
    5. Нажмите кнопку «Разрешить».
  6. Щелкните "ОК".
  7. Copy the URL of Web Apps. It's like https://script.google.com/macros/s/###/exec.
    • When you modified the Google Apps Script, please redeploy as new version. By this, the modified script is reflected to Web Apps. Please be careful this.

3. Запустите функцию с помощью веб-приложений.

Это образец сценария Python для запроса веб-приложений. Задайте URL-адрес веб-приложения и идентификатор таблицы.

import requests
spreadsheet_id = '###'  # Please set the Spreadsheet ID.
url = 'https://script.google.com/macros/s/###/exec?id=' + spreadsheet_id
res = requests.get(url)
print(res.text)

Использованная литература:

Если я неправильно понял ваш вопрос и это было не то направление, которое вам нужно, прошу прощения.

person Tanaike    schedule 30.03.2020
comment
@LucSpan Спасибо за ответ. Я рад, что ваша проблема решена. - person Tanaike; 31.03.2020

Вы можете использовать метод Files.export Drive API, чтобы преобразовать лист в mime-тип application / pdf. Попробуйте это в проводнике API файлов.

person Aerials    schedule 30.03.2020