如何用 Python 写入公开可用的 Google 工作表(未经授权)?

2024-04-04

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

我还可以在未经授权的情况下读取电子表格的内容requests or pd.read_csv()作者:pandas (我通过更改最后一部分来调整 URL ...edit#gid=... 到 ...export?format=csv&gid=...)。然而,当向我收到的同一 URL 发送 POST 请求时200 status code但还是同样的旧空电子表格。

非常感谢任何帮助。


我相信你的目标如下。

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

为此,这个答案怎么样?

问题和解决方法:

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

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

模式一:

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

示例脚本:

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”。

模式2:

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

Usage:

请执行以下流程。

1. 创建 Google Apps 脚本的新项目。

Web Apps 的示例脚本是 Google Apps 脚本。因此,请创建一个 Google Apps 脚本项目。

如果您想直接创建,请访问https://script.new/ https://script.new/。在这种情况下,如果您尚未登录 Google,则会打开登录屏幕。所以请登录谷歌。这样,Google Apps 脚本的脚本编辑器就打开了。

2. 准备脚本。

请将以下脚本(Google Apps 脚本)复制并粘贴到脚本编辑器中。和请在高级 Google 服务中启用 Google Sheets API https://developers.google.com/apps-script/guides/services/advanced#enabling_advanced_services。该脚本适用于 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. 在脚本编辑器上,通过“发布”->“部署为 Web 应用程序”打开一个对话框。
  2. Select "Me" for "Execute the app as:".
    • 这样,脚本就会以所有者身份运行。
  3. Select "Anyone, even anonymous" for "Who has access to the app:".
    • 在这种情况下,不需要请求访问令牌。我认为我推荐此设置来实现您的目标。
    • 当然,您也可以使用访问令牌。届时,请将其设置为"Anyone".
  4. 单击“部署”按钮作为新的“项目版本”。
  5. Automatically open a dialog box of "Authorization required".
    1. 单击“查看权限”。
    2. 选择自己的帐户。
    3. 单击“此应用程序未经验证”处的“高级”。
    4. 点击“转到###项目名称###(不安全)”
    5. 单击“允许”按钮。
  6. 单击“确定”。
  7. Copy the URL of Web Apps. It's like https://script.google.com/macros/s/###/exec.
    • 当您修改 Google Apps 脚本时,请重新部署为新版本。这样,修改后的脚本就会反映到Web Apps中。请小心这一点。

4. 使用 Web 应用程序运行该函数。

这是用于请求 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 Apps时已经完成了授权。

Note:

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

参考:

  • Web Apps https://developers.google.com/apps-script/guides/web
  • 通过 Google Apps 脚本利用 Web Apps https://github.com/tanaikech/taking-advantage-of-Web-Apps-with-google-apps-script
  • 高级谷歌服务 https://developers.google.com/apps-script/guides/services/advanced
  • 通过 Google Apps 脚本发布 Google 电子表格 https://stackoverflow.com/q/56469509
  • 电子表格.值.更新 https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/update
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用 Python 写入公开可用的 Google 工作表(未经授权)? 的相关文章

  • 为什么 Python 在导入脚本时只保存脚本的字节码?

    既然执行Python字节码会比运行原始源代码更快 因为Python不需要重新编译 为什么Python在导入脚本时只保存编译后的字节码呢 为每个执行的脚本保存 pyc 文件不是更好吗 无论如何 Python 解释器的启动时间都需要时间 即使您
  • 如何(重新)命名 pandas 数据框中的空列标题而不导出到 csv

    我有一个熊猫数据框df1带有一个索引列和一系列未命名的值 我想为未命名的系列指定一个名称 到目前为止 我知道的唯一方法是导出到df1 csv using df1 to csv df1 csv header Signal 然后使用以下命令重新
  • 在Python中,如何将矩阵逆时针旋转90度?

    gt gt gt def rotate matrix k List List int For example if I have m 1 2 3 2 3 3 5 4 3 rotate matrix m should give me 3 3
  • Python 转换矩阵

    我有一个如下所示的列表 2 1 3 1 2 3 1 2 2 2 我想要的是一个转换矩阵 它向我显示如下序列 1 后跟 1 的频率是多少 1 后面跟着 2 的频率是多少 1 后跟 3 的频率是多少 2 后跟 1 的频率是多少 2 后跟 2 的
  • Keras model.predict 函数给出输入形状错误

    我已经在 Tensorflow 中实现了通用句子编码器 现在我正在尝试预测句子的类概率 我也将字符串转换为数组 Code if model model type universal classifier basic class probs
  • 无法在 virtualenv 中安装 libxml2

    我有一个问题libxml2蟒蛇模块 我正在尝试将其安装在python3 虚拟环境使用以下命令 pip install libxml2 python3 但它显示以下错误 Collecting libxml2 python3 Using cac
  • App Engine NDB:如何访问属性的 verbose_name

    假设我有这个代码 class A ndb Model prop ndb StringProperty verbose name Something m A m prop a string value 当然 现在如果我打印 m prop 它会
  • 使用pathlib获取主目录

    翻看新的pathlib在 Python 3 4 中 我注意到没有任何简单的方法来获取用户的主目录 我能想到的获取用户主目录的唯一方法是使用旧的os path像这样的库 import pathlib from os import path p
  • 如何用正则表达式替换多个匹配/组?

    通常我们会编写以下内容来替换一场比赛 namesRegex re compile r is life re I replaced namesRegex sub r butter There is no life in the void pr
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • Python:在字典中查找具有唯一值的键?

    我收到一个字典作为输入 并且想要返回一个键列表 其中字典值在该字典的范围内是唯一的 我将用一个例子来澄清 假设我的输入是字典 a 构造如下 a dict a cat 1 a fish 1 a dog 2 lt unique a bat 3
  • python Recipe:列出最接近等于值的项[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 考虑像这样的列表 0 3 7 10 12 15 19 21 我想获得最接近任何值的最近的最小数字 所以如果我通过4 我会得到3 如果我
  • 为什么 Collections.counter 这么慢?

    我正在尝试解决罗莎琳德的基本问题 即计算给定序列中的核苷酸 并在列表中返回结果 对于那些不熟悉生物信息学的人来说 它只是计算字符串中 4 个不同字符 A C G T 出现的次数 我期望collections Counter是最快的方法 首先
  • 如何按 pandas 中的值对系列进行分组?

    我现在有一只熊猫Series与数据类型Timestamp 我想按日期对其进行分组 并且每组中有许多行具有不同的时间 看似显而易见的方法类似于 grouped s groupby lambda x x date 然而 熊猫的groupby按索
  • 从 wxPython 事件处理程序中调用函数

    我正在努力寻找一种在 wxPython 事件处理函数中使用函数的方法 假设我有一个按钮 单击该按钮时 它会使用事件处理程序运行一个名为 OnRun 的函数 但是 用户忘记单击 OnRun 按钮之前的 RadionButton 我想弹出一个
  • Python 2.7 缩进错误[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题是由拼写错误或无法再重现的问题引起的 虽然类似的问题可能是on topic help on topic在这里 这个问题的解决方式不
  • 如何使用 enumerate 来倒数?

    letters a b c 假设这是我的清单 在哪里for i letter in enumerate letters 将会 0 a 1 b 2 c 我怎样才能让它向后枚举 如 2 a 1 b 0 c 这是一个很好的解决方案并且工作完美 i
  • 两种 ODE 求解器之间的差异

    我想知道 两者之间有什么区别ODEINT and solve ivp用于求解微分方程 它们之间有什么优点和缺点 f1 solve ivp f 0 1 y0 y0 is the initial point f2 odeint f y0 0 1
  • 使用 MPI 的 Allreduce 对 Python 对象求和

    我正在使用使用 Python 中的字典和计数器构建的稀疏张量数组操作 我想让并行使用这个数组操作成为可能 最重要的是 我最终在每个节点上都有计数器 我想使用 MPI Allreduce 或另一个不错的解决方案 将其添加在一起 例如 使用计数
  • 如何同时接受int和float类型的输入?

    我正在制作一个货币转换器 如何让 python 同时接受整数和浮点数 我就是这样做的 def aud brl amount From to ER 0 42108 if amount int if From strip aud and to

随机推荐