以编程方式更新Google文档上托管的电子表格

时间:2009-12-03 05:58:05

标签: python google-docs

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

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

我在这里使用Python api for google docs:

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

有谁知道如何在预先存在的文档中克隆和复制工作表?

修改

我似乎对一位读者感到困惑。我没有excel电子表格。我只有一个包含模板工作表的Google文档电子表格。

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

6 个答案:

答案 0 :(得分:6)

  1. 使用Copying Documents
  2. 上的说明克隆模板工作表
  3. 访问克隆文档中的list of worksheets并迭代到所需的电子表格。
  4. 使用cell feed获取电子表格中的相应单元格,然后update值。

答案 1 :(得分:4)

<强>哇!!!把卡车放回去。有一个更简单的方法

过去几周我一直在研究这个问题,因为我打算为我的月度报告做同样的事情。我还没有充实的实际代码,但随着我的进步,我会添加它。

在Google文档中,有许多API和与使用文档相关的类似术语,事情会让人感到有些困惑。如果你还不知道,那就确定GAS(Google Apps Scripting)和GAE(Google App Engine)是两个完全不同的东西。虽然它们听起来是一样的,但它们与Java类似于JavaScript。

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

另一方面,GAE就像一个位于云中某处的Web服务器(具有可用的数据库层)。它作为一个方便(并且已经部署)的中间件层存在,用于企业/兴趣创建自定义应用程序以进行更繁重的工作。不幸的是,外部电子表格的API太有限了,无法完成我们自己的工作,所以这是一个非选择。

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

这种方法应该可以工作,但需要稍微采用hackish方法。

打开包含报告表的工作簿。点击[工具] - &gt; [脚本编辑器]。一旦有goto [Triggers] - &gt; [当前脚本的触发器......]。

如果您没有任何触发器,请添加一个。然后,在“事件”下拉菜单中选择“时间驱动”。

欢迎来到服务器端事件处理程序的世界。使用基于云的文档获得的一个简洁功能是能够直接在文档中触发cron作业。没有必要的外部中间件。

如果您现在还没有注意到“月计时器”没有触发器。这是hacky的地方。要解决缺少此功能的问题,我们需要每天触发触发器并使用一些JavaScript将当前日期与前一天的日期相匹配。

[代码将转到此处]

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

[代码将转到此处]

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

  • 加载SpreadSheet对象(不要与Sheet对象混淆)
  • 找到模板Sheet对象
  • 克隆模板工作表,为其提供适当的基于日期范围的名称

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

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

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

答案 2 :(得分:2)

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

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

修改

我正在越来越多地了解这一点,但距离解决原始问题还有很长的路要走。这个overview of REST principles超越了网络上程序之间的基本交互方式。谷歌似乎在虔诚地追随它。

这一切都发生在HTTP协议中,这是我今天之前一无所知的事情。在这个HTTP specification中,基本游戏被拼写出来。它不像它看起来那么干燥,也许我只是一个巨大的极客,但我觉得这是一个鼓舞人心的读物。与“美国宪法”不同。

因此,既然您要“克隆”文档,那么您将使用特定工作表的GET请求,然后将该工作表作为POST的有效负载发回。

越来越近了:))

答案 3 :(得分:2)

首先,我以前从未使用过Python - 但我会告诉你我是如何用C ++做的。

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

答案 4 :(得分:1)

您无法将电子表格导出为xls,然后将其上传为具有(稍微)不同名称的新文档,并在XML元数据中指定新名称吗?

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

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

答案 5 :(得分:0)

(2017年2月)用当前术语修改问题:如何复制Google Sheet模板,然后以编程方式修改它(副本)?简短回答:&# 39;使用当前的Google API(尤其是Google Drive v3 APIGoogle Sheets v4 API)会更容易,您可以使用Google APIs Client Libraries支持的任何语言进行操作。

最新的Sheets API提供旧版本中不可用的功能,即为开发人员提供对Sheet的编程访问,就像使用用户界面(UI)一样,即创建冻结行,单元格格式化,调整行/列大小,添加数据透视表,单元格验证,创建图表等。

正如您所猜测的,Sheets API主要用于以编程方式访问电子表格操作&amp;如上所述的功能,但要执行文件 - 级别访问,例如复制模板工作表,请改用Google Drive API

使用Drive API复制文件(Sheet)的伪代码(Python)(假设我们首先使用模板名称搜索最近修改的文件,因此orderBy并选择第一个结果{{1下面):

[0]

伪代码从SQL数据库(SQLite)读取值并将它们写入上面创建的新工作表(从单元格&#39; A1&#39; as&#34;左上角&#34;),就好像是用户从UI输入值(因此可以应用公式等):

TMPLFILE = 'my Sheets template'
tmpl = DRIVE.files().list(q="name='%s'" % TMPLFILE).execute().get('files')[0]
NEW_SHEET = {'name': 'Sheets data, Feb 2017'}
SHEET_ID = DRIVE.files().copy(body=NEW_SHEET, fileId=tmpl['id']).execute().get('id')

如果您对现代Google API相对较新,我会为您提供一个(有点过时但用户友好的)intro video。之后有2个视频也许有用,包括一个使用Drive API演示的视频。这些是this playlist中的视频2,3和4。视频23&amp; 25是另一对以Drive和Sheets API为特色的。

所有较新的视频都可以在this playlist中找到,您可以在其中找到另一对包含Sheets API的视频,以及复制&#34;模板复制&#34;上面的代码,但复制幻灯片模板,然后使用Slides API)修改(视频2)。

正如另一个答案中所提到的,如果你更喜欢环境而不是使用REST API,你也可以使用Google Apps Script做类似的事情,尽管Apps Script目前使用较旧的API。此外,很少有突出的错误可能会使其更具挑战性(特别是this onethis one)。