如何使用谷歌应用程序脚本中的另一个函数停止一个函数?

Posted

技术标签:

【中文标题】如何使用谷歌应用程序脚本中的另一个函数停止一个函数?【英文标题】:How to stop one function using another function in google apps script? 【发布时间】:2021-11-06 08:55:09 【问题描述】:

我有一个函数调用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")

【问题讨论】:

虽然我不确定你的实际情况,但从settrigger的函数名称来看,如果I have a function call settrigger, basically this is a function that will keep running until certain condition is fulfilled.的函数是由触发器运行的,那么使用另一个函数删除触发器怎么样?但是,如果我误解了您的问题,我深表歉意。 嗨 Tanaike,我在附加脚本的情况下编辑了我的问题,如果你运行脚本,它会导致单元格 A1 闪烁,我只是想要一个停止闪烁并更改单元格颜色的功能A1 再次变为白色。 throw 检查外部值(如 A2 值或 propertiesservice)后第一个函数出错 你的意思是在运行上面的脚本时遇到错误? @Tanaike 没问题 :) 【参考方案1】:

那么,下面的修改呢?

修改脚本:

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的键stop被创建。这样,y != 100000 && p.getProperty("stop") == null 就是false。这样,循环就停止了。

参考:

Properties Service

补充:

从您评论中的附加问题如下,

我尝试添加几行代码将背景再次变回白色,但似乎效果不佳,有时仍然保持红色,这取决于运气。

在这种情况下,出现问题的原因是函数 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");

【讨论】:

非常感谢!该脚本几乎可以完美运行!我尝试添加几行代码将背景再次更改回白色,但似乎效果不佳,有时仍保持红色,这取决于运气。你知道我哪里做错了吗? @weizer 感谢您的回复。我很高兴你的问题得到了解决。关于您对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. 的附加问题,我更新了我的答案。你能确认一下吗? 如果您希望可靠地查看后台更改,则必须将 SpreadsheetApp.flush() 插入到混合中,这将大大降低执行速度。我个人不会做这样的事情,因为它是一种黑客行为。我会在客户端对话框中用 setInterval 和 clearInterval 替换 感谢 Tanaike 提供的额外脚本,它现在完美运行!

以上是关于如何使用谷歌应用程序脚本中的另一个函数停止一个函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用php在同一类中的另一个函数中使用一个函数[关闭]

如何根据不同 R 生态系统中的另一个向量重写代码,将函数应用于行子集?

如何访问反应Context.Provider值中的另一个函数?

如何从 UICollectionView 的另一个类中的函数加载图像?我正在使用油漆代码

从 module.exports 中的另一个函数调用 module.exports 中的“本地”函数?

如何从Angular中的另一个函数调用一个函数?