无限循环GoogleAppScript

时间:2019-05-20 20:10:33

标签: javascript loops google-apps-script

如何创建一个无限循环来反复更改Google应用脚本中的单元格值?

function doTest() {    
    if(x>=360) x = 0;
  Utilities.sleep(500);
      x = x+1;   
  SpreadsheetApp.getActiveSheet().getRange('a13').setValue(x);  
  incr();
}

我希望它增加一个单元格值,直到它达到360,然后从0开始。

3 个答案:

答案 0 :(得分:1)

无限循环最终将使您的应用程序崩溃。但是,假设这就是您要的工作,这是一种实现方法:

function iterate() {
    var range = SpreadsheetApp.getActiveSheet().getRange('a13');
    var i = 0;

    while(true) {
        range.setValue(i);
        SpreadsheetApp.flush();
        i = (++i) % 361; 
    }
}

答案 1 :(得分:1)

  • 您要每0.5秒向上计数活动电子表格上单元格“ A13”的数量值。
  • 您要将数字从0循环到360。
  • 您想将此循环作为无限循环。

如果我的理解是正确的,那么该示例脚本如何?我认为您的情况有几个答案。因此,请仅考虑其中之一。在此示例脚本中,我使用了侧边栏。即,我使用了Javascript和Google Apps Script。我认为可以通过从边栏中运行Google Apps脚本来实现无限循环。我可以确认,在我的环境中,此计数可以运行的时间超过Google Apps脚本最长6分钟的执行时间。

用法:

使用此脚本时,请执行以下流程。

  1. 将以下脚本复制并粘贴到脚本编辑器(电子表格的容器绑定脚本)。
  2. 运行run()的功能。
    • 这样,将在电子表格上打开一个侧边栏。
  3. 当您单击“开始”按钮时,该数字将被放入活动工作表的单元格“ A13”,并且该值每0.5秒递增一次。数字从0到360循环循环。
    • 如果要停止计数,请单击“停止”按钮。

示例脚本:

function setValue(v) {
  Utilities.sleep(500);
  SpreadsheetApp.getActiveSheet().getRange("A13").setValue(v);
}

function run() {
  var str = '<input type="button" value="start" onclick="start()"><input type="button" id="stop" value="stop" onclick="stop=false"><script>var stop=false; function work(v){return new Promise((resolve, reject)=> google.script.run.withSuccessHandler(()=> resolve()).setValue(v));}async function start(){stop=true; var i=0; while(stop){await work(i); i=(++i) % 361;}}</script>';
  var html = HtmlService.createHtmlOutput(str);
  SpreadsheetApp.getUi().showSidebar(html);
}
扩展的HTML:

在上述示例脚本中,HTML被最小化。脚本下方是展开的HTML。

这仅用于确认HTML。因此,您无需复制并粘贴。

<input type="button" value="start" onclick="start()">
<input type="button" id="stop" value="stop" onclick="stop=false">

<script>
  var stop = false;

  function work(v) {
    return new Promise((resolve, reject) => google.script.run.withSuccessHandler(() => resolve()).setValue(v));
  }

  async function start() {
    stop = true;
    var i = 0;
    while(stop) {
      await work(i);
      i = (++i) % 361;  // This is from Dimu Designs's answer.
    }
  }
</script>

注意:

参考文献:

如果这种方法不是您的目标方向,我表示歉意。

答案 2 :(得分:0)

以下人员可以完成工作!
请注意对flush的调用,这确保了电子表格将在每次迭代时刷新。
否则,您将不会实时看到单元更新。 享受;-)

function doIncrease() {
  for(var x=0;;x++){
    //Set value
    SpreadsheetApp.getActiveSheet().getRange('a13').setValue(x);
    //Flush changes to spreadsheet
    SpreadsheetApp.flush();
    //Wait as long as desired
    Utilities.sleep(500);
    //Reboot the Endless loop from 0 to 360
    if(x==360) x=0;
  }
}