【问题标题】:GCP Sheets/Docs API not displaying files in iframeGCP Sheets/Docs API 不在 iframe 中显示文件
【发布时间】:2021-10-22 20:13:34
【问题描述】:

我有一个项目,每次保存新对象时,它都会创建空白的 Google Doc 和 Google Sheet,作为用户可以使用的其他资源。

为此,我在 Google Cloud Platform 中创建了一个服务帐户,生成了 .json,授予了文档中所述的权限(浏览器、服务帐户管理员、IAM 工作负载身份池管理员、工作负载身份用户)。

还创建了一个 API 密钥。

这样我可以成功地创建、删除、列出所有文件并重命名特定文件(下面的脚本),但我无法加载带有文档和电子表格本身的 iframe。我尝试在 iframe 的 src 中加载的地址:

https://docs.google.com/document/d/DOC_ID?key=APIKEY

https://docs.google.com/spreadsheets/d/SHEET_ID/?key=APIKEY

https://docs.googleapis.com/v1/documents/DOC_ID?key=APIKEY

https://sheets.googleapis.com/v4/spreadsheets/SHEET_ID?key=APIKEY

前两个地址加载“您需要访问权限 - 请求访问权限,或切换到具有访问权限的帐户”。谷歌消息(截图在这里"You need access" issue)。

另外两个抛出 401 -“请求缺少所需的身份验证凭据。预期的 OAuth 2 访问令牌、登录 cookie 或其他有效的身份验证凭据。”。

问题:

  1. 如何在 Google 的标准 iframe 上显示这些文件(使用用户界面、工具栏等)?

  2. 有没有一种方法可以像个人 Google 云端硬盘一样查看服务帐户在 Google Cloud Platform 网站中创建的所有文件?我尝试了 drive.google.com,它是空的,但我可以使用 Python 将它们全部列出。

  3. 我尝试使其与 AWS 中的 Workload Identity Federation 一起使用,因此我创建了池,使用我的 AWS ID 将 AWS 设置为提供者,并从“连接的服务帐户”中选择了服务帐户。是否有关于 AWS 配置方面的指南?我暂时搁置了,因为我不知道下一步。

# GOOGLE DOC CREATION
def document_create(request, obj):

    SERVICE_ACCOUNT_FILE = '.json'
    SCOPES = ['https://www.googleapis.com/auth/documents']
    body = {
        'title': obj.title,
    }
    creds = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
    service = build('docs', 'v1', credentials=creds)
    document = service.documents().create(body=body).execute()
# GOOGLE SHEET CREATION
def spreadsheet_create(request, obj):

    SERVICE_ACCOUNT_FILE = '.json'
    SCOPES = ['https://www.googleapis.com/auth/spreadsheets']
    spreadsheet = {
        'properties': {
            'title': obj.title,
        }
    }
    creds = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
    service = build('sheets', 'v4', credentials=creds)
    spreadsheet = service.spreadsheets().create(body=spreadsheet, fields='spreadsheetId').execute()
# LIST ALL FILES
def index(request, template='gcp/index.html'):
    
    SERVICE_ACCOUNT_FILE = '.json'
    SCOPES = [] # WORKS WITHOUT ANY SCOPE SOMEHOW
    creds = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
    service = build('drive', 'v3', credentials=creds)
    
    results = service.files().list().execute()
    drive_list = results.get('files', [])
# RENAME A FILE
def rename(request):

    SERVICE_ACCOUNT_FILE = '.json'
    SCOPES = [] # ALSO WORKS WITHOUT ANY SCOPE SOMEHOW
    creds = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
    service = build('drive', 'v3', credentials=creds)
    
    try:
        service.files().update(fileId=file_id, body={'name': new_file_name}).execute()
    except Exception as e:
        pass

(这是我在这里的第一篇文章,如果有什么不应该的地方,请道歉。)

提前致谢!

【问题讨论】:

  • 如果您只想在本机界面中显示 Google 文档,我不确定您为什么要进入服务帐户和 API。你不能分享它们,让谷歌来做繁重的工作吗?您想以某种方式托管 Google 表格服务器或类似的东西吗?
  • 我需要 API 来允许用户为他们开始的每个项目自己创建一个 Doc 和一个 Sheet。该项目包含一些用户可以使用的东西,一个文档来记录他们的分析,一个工作表来输入他们收集的数据。这可以由多个用户以不同的角色和任务处理相同的项目来完成。
  • 你可以在没有 API 的情况下完成这一切,为什么你特别需要 API?使用普通用户界面无法完成什么?
  • 假设所有用户都知道如何操作,您可以手动操作吗?我说的是同时在线的数千名用户,每月大约 3~500 万,他们远不及有经验的用户,他们需要通过单击“开始项目”立即为他们完成所有工作,以便他们可以开始工作一秒钟,而不是花时间设置所有东西,因为他们中的大多数人甚至不知道如何自己完成所有操作。
  • 它们都在您的域中吗?您不需要为此提供服务帐户。您可以制作一个普通的内部应用程序。例如,您是否遵循了不同 API 的快速入门?您可以完全使用 Drive API 完成此操作。 developers.google.com/drive/api/v3/quickstart/python - 我想你可能陷入了一个兔子洞,它会让一切变得比它需要的复杂得多。

标签: python google-cloud-platform google-sheets-api google-docs-api service-accounts


【解决方案1】:

原来使用 Sheets and Docs API 创建的每个新文件默认都是私有的。

要使其可用,您只需添加新的权限,指定类型(用户/域)、角色和与所选类型对应的值。

这必须使用 Drive API 完成。

【讨论】:

    【解决方案2】:

    您需要share those documents to the public,以便在网页上提供它们。否则,您只能将它们呈现为 HTML、XLSX 或 PDF 以查看,但不能嵌入它们。

    【讨论】:

    • 这些文件由用户创建,将立即使用。文件的数量应该很大,手动执行此操作是不可能的,而且将它们公开也是完全不安全的。这以前在 alpha 版本中有效,但在我重写 beta 版本后停止工作。看起来像是身份验证问题,而不是文件权限。除此之外,甚至没有驱动器(正如我在问题中提到的那样),我正在通过 Workspace 帐户使用 Google Cloud Platform 的 API。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 2012-06-24
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    相关资源
    最近更新 更多