Google Scripts:如何调用一个函数在另一个函数完成后运行

Pat*_*ejo 2 google-apps-script

我有一个谷歌脚本,其中有 4 个不同的函数,需要一个接一个地运行,但一个函数可以在前一个函数完成/完成后运行。

每个函数所需的时间各不相同,但平均每个函数大约需要 15-20 分钟。

每个函数都会完成一个包含大量数据的电子表格,因此我想在触发器内运行第一个函数,等到第一个函数结束,运行第二个函数等,以便每(例如)4 小时加载一次信息。

谢谢!

teh*_*wch 5

在一般情况下,要在函数 B 之后运行函数 A,需要编写一个控制器例程,首先调用其中一个,然后调用另一个:

function a() { /* stuff */ }
function b() { /* other stuff */ }
function doStuff() {
  a();
  b();
}
Run Code Online (Sandbox Code Playgroud)

对于您的情况,如果您有一个执行时间限制来处理,否则会终止您的其中一个函数的执行并阻止其余函数的运行,您需要编写一个使用 Apps ScriptsScriptApp的调度例程。您有多种方法可以做到这一点,从使用设置的间隔触发器安排第一个函数,并使用每个函数告诉 Google何时运行下一个函数,而不是运行下一个函数,或者使用脚本属性来指示下一个函数手动运行一个函数并让最后一个函数为第一个函数设置调用。

链接示例:

function a() {
  ...
  // Google will run b() within +/-15 minutes of the indicated time
  // Schedule it for 16 minutes from now, so we know a() has
  // completed and shut down before b runs.
  var next = ScriptApp.newTrigger("b").timeBased();
  next.after(16 * 60 * 1000).create();
}
function b(e) {
  /* Add code to delete the one-time trigger used to call this function
  (The trigger uid is in the event object e) */
  ...
Run Code Online (Sandbox Code Playgroud)

属性方法:

function doStuff() {
  var props = PropertiesService().getScriptProperties();
  var next;
  switch (props.getProperty("runNext")) {
    case "a":
      a();
      next = "b";
      break;
    ...
  }
  props.setProperty("runNext", next);
}
function a() {...}
...
Run Code Online (Sandbox Code Playgroud)

如果您实现一种链接函数的解决方案(相对于使用属性来指示要运行的函数的解决方案),您将需要确保删除以前的触发器,以防止触发器计数无休止地增长。