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

时间:2018-04-26 20:04:00

标签: google-apps-script

我有一个包含4个不同功能的google脚本需要一个接一个地运行,但是一个函数可以在上一个完成/完成之后运行。

每个功能所需的时间取决于,但平均每个功能大约需要15-20分钟。

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

谢谢!

1 个答案:

答案 0 :(得分:2)

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

function a() { /* stuff */ }
function b() { /* other stuff */ }
function doStuff() {
  a();
  b();
}

对于你的情况,如果你有一个执行时间限制要处理,否则会杀死他们执行你的一个函数并阻止其他函数运行,你需要编写一个使用Apps Scripts的调度例程{{ 3}}。您可以通过多种方式执行此操作,从使用设置间隔触发器安排第一个,并使用每个功能告诉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) */
  ...

属性方法:

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

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