Файл Excel не отображается на Google Диске - PullRequest
1 голос
/ 09 июля 2019

Я пытаюсь создать новую таблицу Google Sheets из CSV, используя API в Python, и мой код запускается, но созданный Лист нигде не отображается на моем Google Диске.Есть идеи, что я делаю не так?

from oauth2client.service_account import ServiceAccountCredentials
from apiclient.discovery import build
from apiclient.http import MediaFileUpload

#Set up a credentials object I think
creds =
ServiceAccountCredentials.from_json_keyfile_name('client_secret.json', 
['https://www.googleapis.com/auth/drive'])

#Now build our api object, thing
drive_api = build('drive', 'v3', credentials=creds)

folder_id = "1g3q1OelKXDJF8H_Kc0IpgFSxz77NQobc"
file_name = "1505"
mimeType = "application/vnd.google-apps.spreadsheet"

print("Uploading file " + file_name + "...")


file_metadata = {
    'name': file_name,
    'mimeType': mimeType
}

#We have to make a request hash to tell the google API what we're giving it
body = {'name': file_name, 'mimeType': mimeType}
body['parents'] = [{'id':folder_id}]

#Now create the media file upload object and tell it what file to upload,
#in this case 'test.html'
media = MediaFileUpload('1505.csv', mimetype = 'text/csv')

#Now we're doing the actual post, creating a new file of the uploaded type
fiahl = drive_api.files().create(body=body, media_body=media).execute()

#Because verbosity is nice
print("Created file '%s' id '%s'." % (fiahl.get('name'), fiahl.get('id')))

1 Ответ

1 голос
/ 10 июля 2019

Как насчет этого ответа?

Проблема:

Я думаю, что ваш скрипт работает.Но из вашего сценария, если при запуске сценария не возникает ошибка и client_secret.json является файлом при создании учетной записи службы, я думаю, что вы пытаетесь загрузить файл с помощью учетной записи службы.Сервисная учетная запись не является вашей учетной записью.Поэтому, когда вы загружаете файл на Google Диск с использованием Сервисной учетной записи, файл создается на Диск Сервисной учетной записи.Таким образом, загруженный файл не будет отображаться на вашем Google Диске.

Решение

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

Точка модификации:

  • Вы используете Drive API v3.Поэтому, пожалуйста, измените body['parents'] = [{'id':folder_id}] на body['parents'] = [folder_id].
  • Если идентификатор папки folder_id = "1g3q1OelKXDJF8H_Kc0IpgFSxz77NQobc" находится на вашем Google Диске, измените его на идентификатор папки в учетной записи службы.В качестве тестового примера я использовал root в качестве идентификатора папки.
  • После того, как файл загружен учетной записью службы, владелец меняется на вашу учетную запись.Таким образом, вы можете увидеть загруженный файл в корне вашего Google Диска.

Модифицированный скрипт:

Перед запуском скрипта, пожалуйста, установите адрес электронной почты вашего аккаунта Google.на 'emailAddress': '### Email address of your Google account ###'.

from oauth2client.service_account import ServiceAccountCredentials
from apiclient.discovery import build
from apiclient.http import MediaFileUpload

# Set up a credentials object I think
creds = ServiceAccountCredentials.from_json_keyfile_name('client_secret.json', ['https://www.googleapis.com/auth/drive'])

# Now build our api object, thing
drive_api = build('drive', 'v3', credentials=creds)

folder_id = "root"  # Modified from "1g3q1OelKXDJF8H_Kc0IpgFSxz77NQobc"
file_name = "1505"
mimeType = "application/vnd.google-apps.spreadsheet"

print("Uploading file " + file_name + "...")

file_metadata = {
    'name': file_name,
    'mimeType': mimeType
}

# We have to make a request hash to tell the google API what we're giving it
body = {'name': file_name, 'mimeType': mimeType}
body['parents'] = [folder_id]  # Modified

# Now create the media file upload object and tell it what file to upload,
# in this case 'test.html'
media = MediaFileUpload('1505.csv', mimetype='text/csv')

# Now we're doing the actual post, creating a new file of the uploaded type
fiahl = drive_api.files().create(body=body, media_body=media).execute()

# Because verbosity is nice
print("Created file '%s' id '%s'." % (fiahl.get('name'), fiahl.get('id')))

# I added below script.
user_permission = {
    'type': 'user',
    'role': 'owner',
    'emailAddress': '### Email address of your Google account ###'
}
drive_api.permissions().create(
    fileId=fiahl.get('id'),
    body=user_permission,
    transferOwnership=True,
).execute()

Примечание:

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

Ссылки:

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

...