关于 python:以编程方式更新 google docs 上托管的电子表格

Programatically updating a spreadsheet hosted on google docs

我有一个预先存在的电子表格托管在 google 文档中。每个月我都会更新这份文件。我在电子表格中有一个模板工作表,我想克隆然后更新。

我更喜欢克隆工作表而不是从头开始创建它,因为它有一些非常复杂的公式。

我在这里使用 Python api 来获取 google 文档:

http://code.google.com/apis/spreadsheets/data/1.0/developers_guide_python.html

有人知道如何克隆和复制现有文档中的工作表吗?

编辑

我似乎让一位读者感到困惑。我没有 Excel 电子表格。我只有一个带有模板工作表的 Google Docs 电子表格。

我想克隆这个工作表,重命名它,然后以编程方式对其进行编辑。


  • 使用复制文档中的说明克隆您的模板工作表
  • 访问克隆文档中的工作表列表并迭代到所需的电子表格。
  • 使用单元格提要在电子表格中获取适当的单元格,然后更新值。

  • 哇!!!把卡车倒回去。有一个更简单的方法

    过去几周我一直在对此进行一些研究,因为我计划为我的月度报告做同样的事情。我还没有充实实际的代码,但我会在取得进展时添加它。

    在 Google Docs 中,有很多 API 和与使用文档相关的类似术语,所以事情可能会变得有点混乱。如果您还不知道,请在您的脑海中建立一个事实,即 GAS(Google Apps Scripting)和 GAE(Google App Engine)是两个完全不同的东西。尽管它们听起来相同,但它们与 Java 与 JavaScript 相似。

    GAS 是嵌入在 Google Docs 中的脚本(希望将来可以作为独立模块导入),用于驱动诸如验证和动态文档之类的事情,但它们比大多数人怀疑的要强大得多(它们可以做一些事情如修改/更新外部文档和自动电子邮件响应)。请记住,这些必须是轻量级的,因为它们在 google\\ 的服务器上运行。如果您的脚本需要很长时间才能完成,它的执行将过早地中断(谷歌四处寻找限制)。这意味着你应该只使用 vanilla JS(没有像 jQuery 这样的框架)并尽可能地调整性能。

    另一方面,GAE 就像位于云中某处的 Web 服务器(具有可用的数据库层)。它作为一个方便(并且已经部署)的中间件层存在,供企业/利益相关者创建自定义应用程序来完成更多繁重的工作。不幸的是,外部电子表格的 API 太有限,无法单独完成我们正在处理的工作,因此它不是选项。

    使用 Google Apps 脚本和基于时间的触发器实现自动化

    这种方法应该可行,但需要稍微有点hackish的方法。

    打开包含您的报告表的工作簿。单击 [工具] -> [脚本编辑器...]。一旦到达 [触发器] -> [当前脚本的触发器...].

    如果您没有任何触发器,请添加一个。然后,在 \\'Events\\' 下拉菜单下选择 \\'Time-driven\\'。

    欢迎来到服务器端事件处理程序的世界。您从基于云的文档中获得的一项简洁功能是能够直接在您的文档中触发 cron 作业。无需外部中间件。

    如果您现在还没有注意到 \\'Month timer\\' 没有触发器。这就是它变得笨拙的地方。为了解决缺少此功能的问题,我们需要每天触发触发器并使用一些 JavaScript 将当前日期与前一天的日期匹配。

    [代码会放在这里]

    首先是附加到时间触发事件处理程序的函数。这段代码只是简单地解析日期,将它与前一个日期进行比较,并将该值存储在一个隐藏表(我们用作外部持久层)中以供第二天的比较。如果满足新月份的条件,则运行下一个代码块。

    [代码会放在这里]

    你的显然与我的略有不同,但基本概念是:

    • 加载 SpreadSheet 对象(不要与 Sheet 对象混淆)
    • 找到模板 Sheet 对象
    • 克隆模板 Sheet 给它一个合适的基于日期范围的名称

    在我的工作中,我的下一步将是从月份中提取数据以生成堆叠折线图,以便向我的上级报告当前状态。

    注意:由于文档的多用户协作性质,必须在服务器端触发事件。这给我们带来了很大的问题。因为如果代码出错,事件代码会在别处运行,我们不会从浏览器获得任何反馈。唯一的解决方案是在触发器上设置通知,以便在脚本出现故障时立即通过电子邮件发送给您。

    更新:在研究这个时,我发现了另一种很酷的技术。如果我能设法让它在没有任何错误的情况下工作,我可能会尝试使用 Google 日历上标记的日期来调用触发器。


    首先,我以前从未使用过 Python - 但我会告诉你我是如何在 C 中做到这一点的。

    我已使用 cURL 向 Google 文档 API 发出 GET 请求。文件的二进制数据被返回,我将其写入文件。现在我有了 XLS 文件,然后我使用了一个可以读取 XLS 文件的 C/C 库来操作下载的文件。我使用的 API 支持多种选项;你可以做任何你可以在 Excel 中做的事情。修改后我再次上传到谷歌文档。


    这真的很复杂。我知道您可以使用 Python 使用他们的 API 编辑电子表格,Google 倾向于在他们的许多网络服务上提供这种能力,这一切都是通过以某种方式发送由 XML 组成的 HTTP 发布请求来完成的,我希望您知道那部分,我不。

    据此,您至少可以添加工作表,从其他工作表读取行并将行写入工作表。如果必须,您可以一次复制一行,但是为每一行发送一个额外的 POST 请求似乎是一个可怕的想法。

    编辑:

    我对这方面的了解越来越多,但离解决您最初的问题还有很长的路要走。 REST 原则的概述涵盖了 Web 上程序之间进行的基本交互方式。谷歌似乎虔诚地追随它。

    这一切都发生在 HTTP 协议中,在今天之前我对此一无所知。在此 HTTP 规范中详细说明了基本游戏。它并不像看起来那么枯燥,也许我只是一个巨大的极客,但我发现它是一个鼓舞人心的读物。与美国宪法没什么不同。

    因此,由于您想"克隆"一个文档,因此您将对特定工作表使用 GET 请求,然后将该工作表作为 POST 的有效负载发回。

    越来越近:)


    难道您不能将电子表格导出为 xls,然后将其上传为名称(略有不同)的新文档,并在 XML 元数据中指定新名称?

    http://code.google.com/apis/documents/overview.html 上的下载和创建/上传文档部分应该是有益的。

    我无法立即在 Python API 文档中看到任何导入/导出功能,但发送一些 http 请求还不错。


    (2017 年 2 月)用当前术语重新表述问题:如何复制 Google 表格模板,然后以编程方式修改它(副本)?简短回答:使用当前的 Google API,特别是 Google Drive v3 API 和 Google Sheets v4 API,要容易得多,而且您可以使用 Google API 客户端库支持的任何语言来实现。

    最新的 Sheets API 提供了旧版本中不具备的功能,即让开发人员能够像使用用户界面 (UI) 一样以编程方式访问 Sheet,即创建冻结行、单元格格式设置、调整行/列大小、添加数据透视表、单元格验证、创建图表等

    如您所料,Sheets API 主要用于以编程方式访问电子表格操作