8

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

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

我在这里为谷歌文档使用 Python api:

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

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

编辑

我似乎把一位读者弄糊涂了。我没有excel电子表格。我只有一个带有模板工作表的 Google Docs 电子表格。

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

4

6 回答 6

6
  1. 使用复制文档的说明克隆模板工作表
  2. 访问克隆文档中的工作表列表并遍历所需的电子表格。
  3. 使用单元格提要在电子表格中获取适当的单元格,然后更新值。
于 2010-11-02T15:43:32.317 回答
4

哇!!!把卡车倒过来。有一个更简单的方法

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

在 Google Docs 中,有很多 API 和与使用文档相关的类似术语,以至于事情可能会有些混乱。如果您还不知道,请在脑海中确定 GAS(Google Apps 脚本)和 GAE(Google App Engine)是两个完全不同的东西。尽管它们听起来相同,但它们与 Java 与 JavaScript 相似。

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

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

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

这种方法应该可以工作,但需要一种稍微笨拙的方法。

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

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

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

如果您现在还没有注意到“月份计时器”没有触发器。这就是它变得棘手的地方。为了解决这个特性的缺失,我们需要每天触发触发器并使用一些 JavaScript 来匹配当前日期和前一天的日期。

[代码将在这里]

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

[代码将在这里]

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

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

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

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

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

于 2012-01-03T00:33:12.237 回答
2

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

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

编辑:

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

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

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

越来越近 :)

于 2009-12-07T03:13:04.287 回答
2

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

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

于 2009-12-09T08:49:13.627 回答
1

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

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

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

于 2009-12-09T03:12:21.313 回答
0

(2017 年 2 月)用当前术语重新表述问题:如何复制 Google 表格模板,然后以编程方式修改它(副本)?简短的回答:使用当前的 Google API,特别是Google Drive v3 APIGoogle Sheets v4 API更容易,您可以使用Google APIs Client Libraries支持的任何语言来做到这一点。

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

您可以猜到,Sheets API 主要用于以编程方式访问上述电子表格操作和功能,但要执行文件访问(例如复制模板工作表),请改用Google Drive API

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

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')

伪代码从 SQL 数据库 (SQLite) 读取值并将它们写入上面创建的新工作表(从单元格“A1”开始为“左上角”),就像用户从 UI 输入值一样(因此可以应用公式, ETC。):

cxn = sqlite3.connect('db.sqlite')
cur = cxn.cursor()
rows = cur.execute('SELECT * FROM data').fetchall()
cxn.close()
DATA = {'values': rows}
SHEETS.spreadsheets().values().update(spreadsheetId=SHEET_ID,
    range='A1', body=DATA, valueInputOption='USER_ENTERED').execute()

如果您对现代 Google API 比较陌生,我为您准备了一个(有些过时但)用户友好的介绍视频。之后有 2 个视频也可能有用,其中一个演示了如何使用 Drive API。这些是此播放列表中的视频 2、3 和 4 。视频 23 和 25 是另一对具有 Drive 和 Sheets API 的视频。

所有较新的视频都可以在此播放列表中找到,您可以在其中找到另一对具有 Sheets API 的视频以及上面“模板复制”代码的重复,但复制了一个 Slides 模板,然后使用Slides API进行修改)代替(视频2)。

As mentioned in another answer, you can also use Google Apps Script to do something similar if you prefer that environment vs. using REST APIs, although Apps Script currently uses older APIs. Also there are few outstanding bugs that may make it a bit more challenging (specifically this one and this one).

于 2017-02-28T02:56:09.790 回答