python - 如何在 Python 中写入公开可用的 Google 表格(未经授权)?
问题描述
我对不属于我的 Google 表格拥有完全编辑权限。我希望能够在没有 Google API 授权的情况下使用 Python 写入电子表格。我检查了几个可用的软件包(gdata
等gspread
),似乎所有软件包都要求提供凭据。
我还能够在未经授权的情况下使用requests
或pd.read_csv()
通过 pandas 读取电子表格的内容(我通过将最后一部分说 ... edit#gid=
...更改为 ... ... 来调整 URL export?format=csv&gid=
)。200 status code
然而,当向我收到的相同 URL但相同的旧空电子表格发送 POST 请求时。
非常感谢任何帮助。
解决方案
我相信你的目标如下。
- 您想使用 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 应用程序。
- 在脚本编辑器上,通过“发布”->“部署为 Web 应用程序”打开一个对话框。
- 为“将应用程序执行为:”选择“我” 。
- 这样,脚本作为所有者运行。
- 为“谁有权访问应用程序:”选择“任何人,甚至匿名” 。
- 在这种情况下,不需要请求访问令牌。我认为我为您的目标推荐此设置。
- 当然,您也可以使用访问令牌。届时,请将此设置为“任何人”。
- 单击“部署”按钮作为新的“项目版本”。
- 自动打开“需要授权”对话框。
- 单击“查看权限”。
- 选择自己的帐户。
- 在“此应用未验证”中单击“高级”。
- 点击“转到###项目名称###(不安全)”
- 单击“允许”按钮。
- 单击“确定”。
- 复制 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 应用程序中。请注意这一点。
参考:
推荐阅读
- vuetify.js - (已解决) Vuetify v-data-table, How to render line break (enter key) from v-textarea input
- google-apps-script - 如何在谷歌电子表格的 Htmlservice 上创建突出显示选定的行?
- macos - 未找到 Visual Studio for Mac Data_app?
- netlogo - 用于智慧城市或智慧领域的无人机(认知)Netlogo 模型
- python - 无法打印数据框的某些部分
- c - 考虑简单的程序。这些错误在哪里?
- r - “函数中的不合格参数:”在使用 JAGS 的简单线性回归中
- javascript - 如何只获得一个用户而不是列表?
- python - 连接熊猫中的一列和多行
- css - 响应高度,基于背景大小