如何在Python中写到一个公开的Google Sheet(未经授权)?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Python中写到一个公开的Google Sheet(未经授权)?相关的知识,希望对你有一定的参考价值。

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

我也能够在没有授权的情况下,使用以下方法读取电子表格的内容 requestspd.read_csv() pandas (我调整了URL,把最后一部分说......改为......。edit#gid=......改为....export?format=csv&gid=...). 然而,当发送一个POST请求到相同的URL时,我收到了200状态代码,但同样的空电子表格。

任何帮助是非常感激的。

答案

我相信你的目标如下。

  • 你想用python把值放到公开共享的Google电子表格中。
  • 在这种情况下,你想在没有授权的情况下访问电子表格。

对于这个问题,这个答案如何?

问题和解决方法。

为了将数值放到公开共享的Google Spreadsheet中,需要使用POST方法。在这种情况下,需要使用访问令牌。另一方面,在GET方法的情况下,当使用Sheets API时,可以使用API密钥。而端点如 exportLinks你可以在不使用API密钥的情况下检索到这些值。这些都是Google方面的规范。

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

模式1.在这种情况下,我想提出以下两种模式。

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

脚本示例:在这个示例脚本中,我建议使用从服务账户获取的访问令牌来访问电子表格。

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将其放到第1个标签的 "A1 "单元格中。

模式2.在此模式中,我建议使用Google Script制作的Web Apps来访问电子表格。

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

使用方法。

请按以下流程操作

1. 1. 创建Google Apps Script的新项目。

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

如果您想直接创建,请进入以下页面 https:/script.new. 在这种情况下,如果你没有登录谷歌,就会打开登录界面。所以请登录谷歌。这样,Google Apps Script的脚本编辑器就被打开了。

2. 2.准备脚本。

请将以下脚本(Google Apps Script)复制并粘贴到脚本编辑器中。然后 请在高级Google服务中启用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中的spreadsheets.values.update方法将值放到电子表格中。

3. 部署Web应用程序。

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

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

这是一个请求Web Apps的示例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 被放到了公开共享的电子表格的第1个标签页的 "A1 "单元格中。
  • 在这种情况下,无需在python脚本中进行授权,因为在部署Web Apps时已经完成了授权。

注意:当你修改了Web Apps的脚本后,你就会发现,你的Web Apps已经被授权了。

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

参考资料

以上是关于如何在Python中写到一个公开的Google Sheet(未经授权)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Google Play 应用说明中写粗体文字?

将背景颜色添加到单元格 Google 工作表(python)

面试题:你简历中写到熟悉Spring源码,那你给我说说它用到了那些设计模式?

如何在 Python 3 中写上标? [复制]

逆向工程:揭示Google Colab未公开的秘密

逆向工程:揭示Google Colab未公开的秘密