【问题标题】:Excel File Not Showing Up in Google DriveExcel 文件未显示在 Google 云端硬盘中
【发布时间】:2019-07-10 06:43:01
【问题描述】:

我正在尝试使用 Python 中的 API 从 CSV 创建一个新的 Google 表格电子表格,并且我的代码运行,但创建的表格没有显示在我的 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')))

【问题讨论】:

    标签: python google-app-engine google-drive-api


    【解决方案1】:

    这个答案怎么样?

    问题:

    我认为您的脚本有效。但是从您的脚本来看,如果您在运行脚本时没有发生错误并且client_secret.json 是创建服务帐户时的文件,我认为您正在尝试使用服务帐户上传文件。服务帐户不是您的帐户。因此,当您使用服务帐户将文件上传到 Google Drive 时,该文件将创建到服务帐户的 Drive。这样一来,您的 Google Drive 上就无法看到上传的文件。

    解决方案

    如果您想在 Google 云端硬盘中使用服务帐户查看上传的文件,请与您的帐户共享文件。这样,当使用服务帐户上传文件时,您可以看到上传的文件

    修改点:

    • 您使用 Drive API v3。所以请将body['parents'] = [{'id':folder_id}]修改为body['parents'] = [folder_id]
    • 如果folder_id = "1g3q1OelKXDJF8H_Kc0IpgFSxz77NQobc"的文件夹ID在您的Google Drive上,请将其修改为服务帐户上的文件夹ID。作为测试用例,我使用root 作为文件夹 ID。
    • 文件由服务账户上传后,所有者更改为您的账户。这样,您可以在 Google Drive 的根目录中看到上传的文件。

    修改后的脚本:

    在运行脚本之前,请将您的 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 Drive 上的特定文件夹,请使用 OAuth2 而不是服务帐户。
    • 这是一个简单的修改脚本。因此,请根据您的情况进行修改。

    参考资料:

    如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

    【讨论】:

    • 这正是我需要的答案,非常感谢!
    • @Emnut Oggionni 感谢您的回复。我很高兴你的问题得到了解决。也谢谢你。
    猜你喜欢
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多