通过编程更新Google表格
我有一个已经存在的Google表格,每个月我都会更新这个文档。在这个表格里,我有一个模板工作表,我想把它复制一份,然后进行更新。
我更希望复制这个工作表,而不是从头开始创建,因为里面有一些比较复杂的公式。
我在这里使用的是Google表格的Python接口:
http://code.google.com/apis/spreadsheets/data/1.0/developers_guide_python.html
有没有人知道怎么在一个已经存在的文档中复制和克隆一个工作表呢?
编辑
我似乎让一个读者感到困惑了。我没有Excel表格,只有一个包含模板工作表的Google表格。
我想复制这个工作表,给它重新命名,然后通过程序进行编辑。
6 个回答
首先,我之前从来没有用过Python,不过我可以告诉你我是怎么在C++中做到这一点的。
我使用了cURL来向谷歌文档API发送一个GET请求。这样我得到了文件的二进制数据,然后把这些数据写入了一个文件。现在我就有了这个XLS文件,接着我用一个可以读取XLS文件的C/C++库来处理这个下载下来的文件。这个API支持很多选项,你可以做任何在Excel中能做的事情。修改完成后,我又把文件上传回谷歌文档。
哇!等等,这里有个更简单的方法
这几周我一直在研究这个,因为我打算为我的月度报告做同样的事情。虽然我还没有把实际的代码写出来,但我会在进展中添加它。
在Google文档中,有很多API和相关术语,可能会让人感到困惑。如果你还不知道,先记住,GAS(Google Apps 脚本)和GAE(Google 应用引擎)是完全不同的东西。虽然它们听起来相似,但就像Java和JavaScript一样,差别很大。
GAS是嵌入在Google文档中的脚本(希望未来能作为独立模块导入),可以用来做一些验证和动态文档的工作,但它们的功能比大多数人想象的要强大得多(比如可以修改/更新外部文档和自动发送邮件回复)。要记住,这些脚本需要轻量,因为它们是在Google的服务器上运行的。如果你的脚本执行时间太长,可能会被提前中断(可以上网查一下限制)。这意味着你应该只使用原生的JavaScript(不要用像jQuery这样的框架),并尽可能进行性能优化。
而GAE就像一个网络服务器(带有数据库层),存在于云端。它是一个方便的中间件层,供企业或个人创建自定义应用来处理更复杂的任务。不幸的是,外部电子表格的API功能太有限,无法单独完成我们正在做的事情,所以这不是一个选项。
使用Google Apps脚本和基于时间的触发器进行自动化
这个方法应该可行,但需要一些小技巧。
打开包含你报告表的工作簿。点击[工具] -> [脚本编辑器...]。然后在这里,去[触发器] -> [当前脚本的触发器...]。
如果你没有任何触发器,添加一个。然后,在“事件”下拉菜单中选择“时间驱动”。
欢迎来到服务器端事件处理程序的世界。使用基于云的文档,你可以直接在文档中触发定时任务,而不需要外部中间件。
如果你还没注意到,这里没有“月计时器”的触发器。这就是需要一些技巧的地方。为了绕过这个缺失的功能,我们需要每天触发一次,并用一些JavaScript来将当前日期与前一天的日期进行比较。
[code will go here]
首先,创建一个与时间触发器事件处理程序关联的函数。这段代码简单地解析日期,将其与前一天的日期进行比较,并将值存储在一个隐藏的表中(我们用它作为持久层),以便第二天进行比较。如果满足新月的条件,下一段代码就会运行。
[code will go here]
你的代码可能会和我的有些不同,但基本概念是:
- 加载电子表格对象(不要和表对象混淆)
- 找到模板表对象
- 克隆模板表,并给它一个基于日期范围的合适名称
在我的代码中,下一步是提取这个月的数据,生成一个堆叠折线图,以向我的上级报告当前状态。
注意:由于文档的多用户协作特性,事件必须在服务器端触发。这给我们带来了一个大问题。因为事件代码在其他地方运行,如果代码出错,我们无法从浏览器获得任何反馈。解决这个问题的唯一方法是在触发器上设置通知,当脚本出错时立即通过邮件通知你。
更新:在研究这个过程中,我发现了另一个很酷的技巧。如果我能顺利实现这个功能而没有任何错误,我可能会尝试使用Google日历上的日期来触发这个事件。