IrenaRistova
IrenaRistova

Reputation: 1

Can i have a time based trigger to run a function that sets off another time based trigger in Google Apps Script?

I have tried to do it this way, but when the second trigger is set off it is disabled for an unknown reason.

//the first time based trigger that is supposed to run once a day

function startTimeTrigger() {

  ScriptApp.newTrigger('runAuto')
           .timeBased()
           .atHour(14)
           .nearMinute(25)
           .everyDays(1)
           .create();

};

function runAuto() {

  // resets the loop counter if it's not 0
  refreshUserProps();

  // a function that creates the second time based trigger 
  createTrigger();

}

function createTrigger() {

  // Trigger every 1 minute
  ScriptApp.newTrigger('addStats')
      .timeBased()
      .everyMinutes(1)
      .create();
}

Upvotes: 0

Views: 127

Answers (3)

IrenaRistova
IrenaRistova

Reputation: 1

There is a bug while running triggers for the new V8 runtime for Google Apps Script. The solution for me was to disable new Apps Script Runtime by Chrome V8 + accessing the triggers by their TriggerId. This is what it looks like right now:

    //I save trigger ID on script properties. You can find it in files > properties > 
   script properties

   function runAuto() {

   clearContents();  

   refreshUserProps();

   var triggerMinID = PropertiesService.getScriptProperties().getProperty('addStats');

   if(!triggerMinID){
      createTrigger(); 
    } else {
     deleteTrigger(triggerMinID);
     createTrigger(); 
    }

  }


    function createTrigger() {
     var triggerMin = ScriptApp.newTrigger('addStats')
     .timeBased()
     .everyMinutes(1)
     .create();

      var triggerID = triggerMin.getUniqueId();
      PropertiesService.getScriptProperties().setProperty('addStats', triggerID);
      }

Upvotes: 0

Rohod
Rohod

Reputation: 51

Yes, only if you delete the old function that uses the same name:

  function startTimeTrigger() {

      ScriptApp.newTrigger('runAuto')
          .timeBased()
          .atHour(14)
          .nearMinute(25)
          .everyDays(1)
          .create();

  };

  function runAuto() {

      // resets the loop counter if it's not 0
      refreshUserProps();

      // a function that creates the second time based trigger 
      createTrigger();

  }

  function createTrigger() {
      deleteTrigger('addStats')
      // Trigger every 1 minute
      ScriptApp.newTrigger('addStats')
          .timeBased()
          .everyMinutes(1)
          .create();
  }

  function deleteTrigger(key) {
      var allTriggers = ScriptApp.getProjectTriggers();

      for (var i = 0; i < allTriggers.length; i++) {
          if (allTriggers[i].getHandlerFunction() === key) {
              ScriptApp.deleteTrigger(allTriggers[i]);
          }
      }

  }

Upvotes: 1

Cooper
Cooper

Reputation: 64040

A function you might consider using to check if there are any other triggers for the same function.

function isTrigger(funcName){
  var r=false;
  if(funcName){
    var allTriggers=ScriptApp.getProjectTriggers();
    for (let i=0;i<allTriggers.length;i++){
      if(funcName==allTriggers[i].getHandlerFunction()){
        r=true;
        break;
      }
    }
  }
  return r;
}

Upvotes: 0

Related Questions