如何在 google 应用程序脚本中使用另一个函数停止一个函数?

How to stop one function using another function in google apps script?

我有一个函数调用 settrigger,基本上这是一个将保持 运行 直到满足特定条件的函数。但是,我想添加一个可以手动停止执行 settrigger 函数的函数,而不是单击 Cancel 来停止 运行 脚本。我可以知道函数应该是什么样子吗?感谢您的帮助!

这是我的脚本:

function settrigger() {

  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var y = 1;
  var z = 1

  while ( y != 100000 ){
    var x = ss.getActiveSheet().getRange('A15').getValue();
    x=x+1;
    ss.getRange('A15').setValue(x);
    y=y+1;
    var toggle = ss.getRange('A1')
    if (x%2==0){
      toggle.setBackground("RED");
    } else if (x%2!=0) {
      toggle.setBackground("WHITE");
    }
  }

}

停止函数

function stopfunc() {
  PropertiesService.getScriptProperties().setProperty("stop", "stop");
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var toggle = ss.getRange('A1')
  toggle.setBackground("WHITE")
}

那么,下面的修改怎么样?

修改后的脚本:

function settrigger() {
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var y = 1;
  var z = 1

  var p = PropertiesService.getScriptProperties();
  while (y != 100000 && p.getProperty("stop") == null){
    var x = ss.getActiveSheet().getRange('A15').getValue();
    x=x+1;
    ss.getRange('A15').setValue(x);
    y=y+1;
    var toggle = ss.getRange('A1')
    if (x%2==0){
      toggle.setBackground("RED");
    } else if (x%2!=0) {
      toggle.setBackground("WHITE");
    }
  }
  p.deleteProperty("stop");
}

// When you want to stop the function of `settrigger`, please run this.
function stopfunc() {
  PropertiesService.getScriptProperties().setProperty("stop", "stop");
}
  • 本例中,settrigger的函数为运行后,当stopfunc为运行时,创建了PropertiesService的keystop。这样,y != 100000 && p.getProperty("stop") == null 就是false。这样,循环就停止了。

参考:

已添加:

根据您在评论中的附加问题如下,

I tried to add few lines of code to change the background back to white color again but seems like it doesn't work well, sometime still remain red color, it depends on luck.

在这种情况下,出现问题的原因是函数 settrigger() 在函数 stopfunc() 为 运行 之后停止。所以,请修改上面的脚本如下。

修改后的脚本:

function settrigger() {
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var y = 1;
  var z = 1

  var p = PropertiesService.getScriptProperties();
  while (y != 100000 && p.getProperty("stop") == null){
    var x = ss.getActiveSheet().getRange('A15').getValue();
    x=x+1;
    ss.getRange('A15').setValue(x);
    y=y+1;
    var toggle = ss.getRange('A1')
    if (x%2==0){
      toggle.setBackground("RED");
    } else if (x%2!=0) {
      toggle.setBackground("WHITE");
    }
  }
  p.deleteProperty("stop");
  ss.getRange('A1').setBackground("WHITE");  // Added
}

// When you want to stop the function of `settrigger`, please run this.
function stopfunc() {
  PropertiesService.getScriptProperties().setProperty("stop", "stop");
}