哇!!!把卡车倒过来。有一个更简单的方法
在过去的几周里,我一直在研究这个问题,因为我计划为我的月度报告做同样的事情。我还没有充实实际的代码,但我会在我取得进展时添加它。
在 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 对象混淆)
- 找到模板工作表对象
- 克隆模板工作表,为其提供适当的基于日期范围的名称
在我的工作中,我的下一步将是从当月中提取数据以生成堆叠线图,以便向我的上级报告当前状态。
注意:由于文档的多用户协作性质,必须在服务器端触发事件。这给我们带来了很大的问题。因为如果代码出错,事件代码会在其他地方运行,所以我们不会从浏览器中得到任何反馈。唯一的解决方案是在触发器上设置一个通知,以便在脚本出错时立即向您发送电子邮件。
更新:在研究这个时,我发现了另一种很酷的技术。如果我能设法让这个工作没有任何错误,我可能会尝试使用谷歌日历上标记的日期来调用触发器。