首页 > 解决方案 > 如何在 Python 中写入公开可用的 Google 表格(未经授权)?

问题描述

我对不属于我的 Google 表格拥有完全编辑权限。我希望能够在没有 Google API 授权的情况下使用 Python 写入电子表格。我检查了几个可用的软件包(gdatagspread),似乎所有软件包都要求提供凭据。

我还能够在未经授权的情况下使用requestspd.read_csv()通过 pandas 读取电子表格的内容(我通过将最后一部分说 ... edit#gid=...更改为 ... ... 来调整 URL export?format=csv&gid=)。200 status code然而,当向我收到的相同 URL但相同的旧空电子表格发送 POST 请求时。

非常感谢任何帮助。

标签: pythongoogle-apps-scriptgoogle-sheetspython-requests

解决方案


我相信你的目标如下。

  • 您想使用 python 将值放到公开共享的 Google 电子表格中。
  • 在这种情况下,您想在未经授权的情况下访问电子表格。

为此,这个答案怎么样?

问题和解决方法:

为了将值放到公开共享的 Google 电子表格中,使用了 POST 方法。在这种情况下,需要使用访问令牌。另一方面,在 GET 方法的情况下,当使用 Sheets API 时,可以使用 API 密钥。像这样的端点exportLinks,您可以在没有 API 密钥的情况下检索值。这些是谷歌方面的规范。

在这种情况下,为了实现您的目标,我想提出以下两种模式。

模式一:

在这种模式中,我想建议使用从服务帐户检索到的访问令牌来访问电子表格。在这种情况下,脚本可以更简单。

示例脚本:

import gspread
from oauth2client.service_account import ServiceAccountCredentials

spreadsheetId = "###"  # Please set the Spreadsheet ID.

scope = ['https://www.googleapis.com/auth/spreadsheets']
credentials = ServiceAccountCredentials.from_json_keyfile_name('credentials.json', scope)
client = gspread.authorize(credentials)
spreadsheet = client.open_by_key(spreadsheetId)
worksheet = spreadsheet.sheet1
worksheet.update_acell('A1', 'sample')
  • 在此示例脚本中,sample使用 gspread 将其放入公共共享电子表格中第一个选项卡的单元格“A1”中。

模式二:

在此模式中,我想建议使用由 Google Apps 脚本创建的 Web 应用程序作为包装 API 来访问电子表格。在这种情况下,python 脚本更简单。

用法:

请执行以下流程。

1. 新建 Google Apps Script 项目。

Web Apps 的示例脚本是 Google Apps 脚本。所以请创建一个 Google Apps Script 项目。

如果要直接创建,请访问https://script.new/。在这种情况下,如果您没有登录 Google,则会打开登录屏幕。所以请登录谷歌。至此,Google Apps Script 的脚本编辑器被打开。

2. 准备脚本。

请将以下脚本(Google Apps 脚本)复制并粘贴到脚本编辑器中。请在Advanced Google services 中启用 Google Sheets API。此脚本适用于 Web 应用程序。

function doPost(e) {
  try {
    const spreadsheetId = e.parameter.spreadsheetId;
    const obj = JSON.parse(e.postData.contents);
    const resource = obj.body;
    const range = obj.arguments.range;
    const valueInputOption = obj.arguments.valueInputOption;
    Sheets.Spreadsheets.Values.update(resource, spreadsheetId, range, {valueInputOption: valueInputOption});
    return ContentService.createTextOutput("ok");
  } catch(e) {
    return ContentService.createTextOutput(JSON.stringify(e));
  }
}
  • 在这种情况下,使用 POST 方法。
  • 在此示例脚本中,作为测试脚本,使用 Sheets API 中的电子表格.values.update 方法将值放入电子表格。

3. 部署 Web 应用程序。

  1. 在脚本编辑器上,通过“发布”->“部署为 Web 应用程序”打开一个对话框。
  2. “将应用程序执行为:”选择“我” 。
    • 这样,脚本作为所有者运行。
  3. “谁有权访问应用程序:”选择“任何人,甚至匿名” 。
    • 在这种情况下,不需要请求访问令牌。我认为我为您的目标推荐此设置。
    • 当然,您也可以使用访问令牌。届时,请将此设置为“任何人”
  4. 单击“部署”按钮作为新的“项目版本”。
  5. 自动打开“需要授权”对话框。
    1. 单击“查看权限”。
    2. 选择自己的帐户。
    3. 在“此应用未验证”中单击“高级”。
    4. 点击“转到###项目名称###(不安全)”
    5. 单击“允许”按钮。
  6. 单击“确定”。
  7. 复制 Web 应用程序的 URL。就像https://script.google.com/macros/s/###/exec
    • 当您修改 Google Apps 脚本时,请重新部署为新版本。这样,修改后的脚本就会反映到 Web 应用程序中。请注意这一点。

4. 使用 Web Apps 运行该功能。

这是一个用于请求 Web 应用程序的示例 python 脚本。请设置您的 Web Apps URL、电子表格 ID 和范围。

import json
import requests

spreadsheet_id = '###'  # Please set the Spreadsheet ID.
body = {
    "arguments": {"range": "Sheet1!A1", "valueInputOption": "USER_ENTERED"},
    "body": {"values": [["sample"]]}
}
url = 'https://script.google.com/macros/s/###/exec?spreadsheetId=' + spreadsheet_id
res = requests.post(url, json.dumps(body), headers={'Content-Type': 'application/json'})
print(res.text)
  • 在此示例脚本中,sample将放在公共共享电子表格中第一个选项卡的单元格“A1”中。
  • 在这种情况下,python 脚本中不需要授权,因为在部署 Web 应用程序时已经完成了授权。

笔记:

  • 当您修改 Web Apps 的脚本时,请将 Web Apps 重新部署为新版本。这样,最新的脚本就会反映到 Web 应用程序中。请注意这一点。

参考:


推荐阅读