有没有办法同时 运行 两个函数(simultaneously/asynchrounously),一个函数作为无限循环?

Is there a way to run two functions at the same time(simultaneously/asynchrounously) with one function as an infinite loop?

我有两个函数想同时运行,但我不能让它们分开运行,因为一个函数包含一个无限循环while(true)。 JavaScript 的问题在于,如果您要 运行 两个函数,它将在 运行 宁下一个函数之前完成 运行 宁函数;所以如果我 运行 一个带有 while(true) 循环的函数,它永远不会移动到下一个函数。
如果你还不明白,这是我的代码:

function onOpen(){           // Google Apps Script trigger
    infLoop()                //how to run both of these functions at the same time?
    runScript()
}

function infLoop(){          //inf loop.

    while(True){
        Utilities.sleep(100)
        DocumentApp.getActiveDocument()
        .setname("dont change this name")
    }
}

function runScript(){
    //code...
}

到运行两个或多个函数"at the same time"你应该分别调用每个函数。一种方法是从客户端代码 use promises

请记住,您的服务器端无限循环最终会导致您的脚本超过最大执行时间(6 分钟/30 分钟,具体取决于有效用户使用的帐户类型)。

相关

  • Using promises for mulitple queries to Google sheets

运行 Apps 脚本中的无限循环是徒劳的,因为有 an enforced maximum execution time of 6 minutes for most scripts。当您达到该限制时,脚本执行将被终止。

从您的示例脚本来看,您试图做的是设置文档名称的计划作业。 为此,您最好使用 a time-driven trigger

然后您可以像这样构建您的脚本:

function onOpen() {
    // code...
}

function updateDocumentName() {
    DocumentApp.getActiveDocument().setName("dont change this name")
}

然后,就可以setup a time-driven trigger关联updateDocumentName()函数了。

需要注意的一个主要区别:不是每 100 毫秒执行一次逻辑,您可以使用时间驱动触发器设置的最高频率是每 1 分钟一次。

Google 应用脚本同步执行。大多数情况下,simultaneous/paralell 处理是不可能的。根据您的脚本,您似乎希望两个函数同时 运行 onOpen。可能的解决方法(有些未测试):

解决方法#1:使用不同的项目

  • 创建新项目:在编辑器中(Legacy/Old 仅限编辑器)>文件>新建>项目
  • 第一个项目的 onOpen() 将 运行 infLoop()
  • 第二个项目的onOpen()将运行runScript()
  • 这两个功能将 运行 同时打开。

解决方法#2:简单且可安装的触发器1

  • runScript()
  • 创建可安装的触发器
  • 简单触发器 onOpen() 将 运行 infLoop()
  • 这两个功能将 运行 同时打开。
  • 您可以使用两个可安装触发器,而不是简单的可安装触发器。

解决方法#3:Web 应用程序:来自客户端的调用

  • 如果打开了侧边栏或从网络应用程序打开了sheet,则可以通过google.script.run重复调用服务器函数(运行 异步)

  • 这里可以运行一个函数持续6分钟(当前运行时间)。但是通过重复调用服务器函数,你可以运行这个函数很长一段时间(upto 90minutes/day = current trigger 运行time quota/day)

解决方法#4:Web 应用程序:UrlFetchApp#fetchAll2

  • UrlFetchApp#fetchAll 运行 异步
  • 网络应用发布后,发布的 url 可以与查询参数一起使用。如果函数名作为参数发送,doGet() 执行该函数,.fetchAll 可异步用于多个函数。

解决方法#5:onEdit/onChange

  • 如果进行了编辑,两个功能(onEdit/onChange) 运行 同时。

解决方法 #6:工作表 API/onChange

  • 如果 add-on/script 通过 sheet 进行更改 api,onChange 可能会 被触发。如果触发,通过 sheets api 进行的每个更改都会导致 onChange 异步地变为 运行。

是的!只需将一个函数放在另一个函数中。

function EmailSummary() {
  // Modified from  .. SOURCE: https://mashe.hawksey.info/2015/07/tips-on-emailing-inline-google-charts-from-sheets-using-apps-script/
  function emailCharts(sheet_name){    // eg "SF_EMAIL"
    sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheet_name)
    var charts = sheet.getCharts();

    if(charts.length==0){
      MailApp.sendEmail({

...

只要确保正确缩进即可。