有没有办法同时 运行 两个函数(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({
...
只要确保正确缩进即可。
我有两个函数想同时运行,但我不能让它们分开运行,因为一个函数包含一个无限循环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({
...
只要确保正确缩进即可。