Google apps script GAS-Extend脚本运行时间
基于此,我学习了如何在超过最大运行时间5分钟时延长Google Apps脚本的脚本运行时间 这是可行的,但我不确定我是否用正确的方式做了。我面临如下所述的一些问题 来自main函数,我将变量“t”作为循环的起点,并调用函数Foto_函数。 如果时间超过240秒的限制,则会触发Google apps script GAS-Extend脚本运行时间,google-apps-script,Google Apps Script,基于此,我学习了如何在超过最大运行时间5分钟时延长Google Apps脚本的脚本运行时间 这是可行的,但我不确定我是否用正确的方式做了。我面临如下所述的一些问题 来自main函数,我将变量“t”作为循环的起点,并调用函数Foto_函数。 如果时间超过240秒的限制,则会触发 if (isTimeUp(today)) { // schedule a trigger for a different function Spre
if (isTimeUp(today)) {
// schedule a trigger for a different function
SpreadsheetApp.activeSheet.getRange("A1").setValue(t);
ScriptApp.newTrigger("Foto_function_Repeat")
.timeBased()
.everyMinutes(1)
.create();
break;
}
超过时间后,将启动Foto_函数(称为“Foto_函数_Releat”)的克隆。变量“t”将移交给克隆函数。时间从零开始运行,如果达到240秒,则切换回原始Foto_功能
在循环结束时,触发器将被删除
if (t == lastrow_Fotos + 1) {
stopp_triggers();
break;
}
函数停止触发器(){
var triggers=ScriptApp.getProjectTriggers();
对于(var i=0;i
但是:我收到大约8到12封内容完全相同的电子邮件,我不知道为什么?我的代码有问题吗
……这是完整的代码……我们将向我发送一封电子邮件,因此我知道脚本已经完成
function mainfunction(){
//do some stuff;
SpreadsheetApp.activeSheet.getRange("A1").setValue(2); // handover the variable "t" to the Foto_function
Foto_function();
}
function Foto_function(){
var today = new Date();
var Geodata = getSheetById(1702838837);
var lastrow_XX = Geodata.getRange(1, 1).getDataRegion(SpreadsheetApp.Dimension.ROWS).getLastRow(); //Last row in column A of sheet GEODATA
value_t = SpreadsheetApp.activeSheet.getRange("A1").getValue();
for (var t = value_t; t <= lastrow_XX + 2; t++){
if (t == lastrow_Fotos + 1) {
stopp_triggers();
break;
}
if (isTimeUp(today)) {
// schedule a trigger for a different function
SpreadsheetApp.activeSheet.getRange("A1").setValue(t);
ScriptApp.newTrigger("Foto_function_Repeat")
.timeBased()
.everyMinutes(1)
.create();
break;
}
else {
//do some stuff;
}
}
}
function Foto_function_Repeat(){
var today = new Date();
var Geodata = getSheetById(1702838837);
var lastrow_XX = Geodata.getRange(1, 1).getDataRegion(SpreadsheetApp.Dimension.ROWS).getLastRow(); //Last row in column A of sheet GEODATA
value_t = SpreadsheetApp.activeSheet.getRange("A1").getValue();
for (var t = value_t; t <= lastrow_XX + 2; t++){
if (t == lastrow_Fotos + 1) {
stopp_triggers();
break;
}
if (isTimeUp(today)) {
// schedule a trigger for a different function
SpreadsheetApp.activeSheet.getRange("A1").setValue(t);
ScriptApp.newTrigger("Foto_function")
.timeBased()
.everyMinutes(1)
.create();
break;
}
else {
do some stuff;
}
}
}
function stopp_triggers(){
var triggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < triggers.length; i++) {
ScriptApp.deleteTrigger(triggers[i]);
sendmail();
}
}
function sendmail(){
var user = Session.getActiveUser().getEmail();
var mailname = user.split('@');
mailname = mailname[0];
MailApp.sendEmail({
to: user,
subject: 'GAS-Task is finished',
htmlBody: 'Hello, the task is finished!!!'
});
}
function isTimeUp(today) {
var now = new Date();
return now.getTime() - today.getTime() > 240000;
// 30000 = 30 seconds; this is the threshold limit
// you are free to setup your own threshold limit
}
function main函数(){
//做一些事情;
SpreadsheetApp.activeSheet.getRange(“A1”).setValue(2);//将变量“t”移交给Foto_函数
Foto_函数();
}
函数Foto_函数(){
var today=新日期();
var Geodata=getSheetById(1702838837);
var lastrow_XX=Geodata.getRange(1,1).getDataRegion(SpreadsheetApp.Dimension.ROWS).getLastRow();//工作表Geodata的A列中的最后一行
value_t=SpreadsheetApp.activeSheet.getRange(“A1”).getValue();
对于(var t=value_t;t代码块
ScriptApp.newTrigger("Foto_function_Repeat")
.timeBased()
.everyMinutes(1)
.create();
使您创建一个触发器,每分钟触发函数Foto\u function\u Repeat()
。
因此,每分钟var t
将被设置回=value\u t
,并将在for
循环中递增,直到if(t==lastrow\u Fotos+1)
条件完全满足。
function stop\u triggers()
将删除所有触发器,但不会终止在第一次repeatFunction()
运行开始到t==lastrow\u Fotos+1
满的时间间隔内已经触发的repeatFunction()
的执行
我建议您将触发器的执行时间从.everyMinutes(1)
增加到例如.everyMinutes(4)
。
另外,我建议您在代码的战略位置实现带有计数器变量的日志,这样您就可以监视它的执行,并验证不同函数调用的结果是否符合预期
在脚本运行之间存储值非常有用。您可以存储和检索计数器变量,这样就不会每次都从零开始循环。谢谢!这听起来很合理。如果代码不太复杂,您能告诉我如何调整代码吗?我无法为您调整整个代码,因为我对我的代码了解不够ts目的,但如果为timeUp
实现的时间阈值小于.everyMinutes()
中的参数,则应该能够避免多次同时运行脚本的问题。例如,将阈值设置为200000毫秒。这不起作用。变量“t”正在上升和下降。它应该不断增加,但不会。是的,我会尝试另一件事。我想我知道问题在哪里…会回来的。不,我需要触发器几次,所以在1分钟后重复是可以的。我的意思是…我在1分钟后启动了多个触发器自我重复…这产生了混乱;-)
function mainfunction(){
//do some stuff;
SpreadsheetApp.activeSheet.getRange("A1").setValue(2); // handover the variable "t" to the Foto_function
Foto_function();
}
function Foto_function(){
var today = new Date();
var Geodata = getSheetById(1702838837);
var lastrow_XX = Geodata.getRange(1, 1).getDataRegion(SpreadsheetApp.Dimension.ROWS).getLastRow(); //Last row in column A of sheet GEODATA
value_t = SpreadsheetApp.activeSheet.getRange("A1").getValue();
for (var t = value_t; t <= lastrow_XX + 2; t++){
if (t == lastrow_Fotos + 1) {
stopp_triggers();
break;
}
if (isTimeUp(today)) {
// schedule a trigger for a different function
SpreadsheetApp.activeSheet.getRange("A1").setValue(t);
ScriptApp.newTrigger("Foto_function_Repeat")
.timeBased()
.everyMinutes(1)
.create();
break;
}
else {
//do some stuff;
}
}
}
function Foto_function_Repeat(){
var today = new Date();
var Geodata = getSheetById(1702838837);
var lastrow_XX = Geodata.getRange(1, 1).getDataRegion(SpreadsheetApp.Dimension.ROWS).getLastRow(); //Last row in column A of sheet GEODATA
value_t = SpreadsheetApp.activeSheet.getRange("A1").getValue();
for (var t = value_t; t <= lastrow_XX + 2; t++){
if (t == lastrow_Fotos + 1) {
stopp_triggers();
break;
}
if (isTimeUp(today)) {
// schedule a trigger for a different function
SpreadsheetApp.activeSheet.getRange("A1").setValue(t);
ScriptApp.newTrigger("Foto_function")
.timeBased()
.everyMinutes(1)
.create();
break;
}
else {
do some stuff;
}
}
}
function stopp_triggers(){
var triggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < triggers.length; i++) {
ScriptApp.deleteTrigger(triggers[i]);
sendmail();
}
}
function sendmail(){
var user = Session.getActiveUser().getEmail();
var mailname = user.split('@');
mailname = mailname[0];
MailApp.sendEmail({
to: user,
subject: 'GAS-Task is finished',
htmlBody: 'Hello, the task is finished!!!'
});
}
function isTimeUp(today) {
var now = new Date();
return now.getTime() - today.getTime() > 240000;
// 30000 = 30 seconds; this is the threshold limit
// you are free to setup your own threshold limit
}
ScriptApp.newTrigger("Foto_function_Repeat")
.timeBased()
.everyMinutes(1)
.create();