【问题标题】:How can I ensure a Google sheet updates an importRange() when using getValues() in Apps script在 Apps 脚本中使用 getValues() 时,如何确保 Google 工作表更新 importRange()
【发布时间】:2021-01-27 11:49:58
【问题描述】:

我有一个 Google 工作表 (A) 可以导入到另一个 Google 工作表 (B)。 (B) 然后获取更多数据并将合并的数据导入另一个 Google Sheet (C)

这个 (A) 到 (B) 的过程发生在 40 组配对电子表格中,因此所有 40 组最终都在 (C) 中,作为它们所有状态的综合记录。

然后,我运行一个 Apps 脚本触发器来检查状态,并根据每组的状态,发送电子邮件并提醒要做的事情。

问题在于 (C) 并不总是使用来自 (A) 的最新信息进行更新,因此发送的状态不正确。它时好时坏——有时有效,有时无效——就好像 (C) 正在使用某种定期更新的缓存版本,但在被脚本打开时不会实时收集数据

今天早上又发生了。当我打开 (C) 时,我可以在屏幕上看到不正确的状态,然后当它完成“工作”时,状态会正确更新

似乎也是如此,当在脚本中使用 getActiveSpreadsheet() 中的 getValues() 时,它不会等到工作表完成“工作”才能在继续之前获取所有最新数据。

所以一个简单的问题 - 您能否确保脚本等到通过 2 张工作表链完全计算完工作表后再继续执行脚本?

或其他解决方案?

我想尝试的一件事是在脚本中打开 (C) 然后依次打开每个 (B),以便 (B) 获得最新的 (A),然后 (C) 可能会获得最新的 (B​​)和 (A),这似乎很艰巨。

所以想检查一下我在这里是否遗漏了一些可以添加到脚本中以强制计算的简单内容。

注意:该脚本是 (C) 的绑定脚本,我已经在代码开头有 SpreadsheetApp.flush() 虽然我刚刚注意到 SpreadsheetApp.flush() 在 getActiveSpreadsheet() 之前所以也许我在我“得到”它之后应该冲洗吗? - 我会试试的

非常感谢

【问题讨论】:

  • Importrange 充其量是不稳定的,您不能强制它以编程方式重新计算。我建议可能每 30 分钟使用 .getDisplayValues() 将工作表 C 缓存到另一个工作表中并使用它,但它永远不能保证 100% 是最新的。
  • 嗨。谢谢。我不确定 getDisplayValues() 是否会有所帮助,因为在“工作”完成之前,显示的值不是更新的值。或者你是说它不会以某种方式获得显示的值,直到它知道它有新计算的数据要显示?需要注意的是,该脚本仅在每天凌晨 3 点运行一次,因此不需要更新它 - 几个小时前就可以了。

标签: google-apps-script google-sheets


【解决方案1】:

问题

所以一个简单的问题 - 您能否确保脚本等到通过 2 张工作表链完全计算完工作表后再继续执行脚本?

没有。 Google Apps 脚本没有内置方法来了解电子表格的重新计算状态。

如果您的电子表格中有一个单元格可以明确指示重新计算已完成,那么您可以使用 getDisplayValue() 轮询该单元格显示的值,并将其与之前存储在 Properties Service 属性中的显示值进行比较,或者类似的东西。

如果您确实需要确保获得最新的计算值,请使用 Google Apps 脚本/JavaScript 而不是使用公式。

【讨论】:

  • 是的,我不确定我能拿到那个单元格。我已经决定,因为脚本每天凌晨 3 点只运行一次,没有用户处于活动状态,所以我将添加一个 Utilities.sleep(60000) 并查看是否有足够的时间来计算然后继续 - 有点麻烦
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多