While you can create triggers manually through the Apps Script UI, ScriptApp lets you create and delete triggers in code. This is essential for avoiding duplicates, building self-managing scripts, and maintaining clean trigger setups.
If you need to change a trigger's schedule, delete the old one and create a new one:
functionrescheduleDigest(){var functionName ="sendWeeklyDigest";// Delete existingScriptApp.getProjectTriggers().forEach(function(trigger){if(trigger.getHandlerFunction()=== functionName){ScriptApp.deleteTrigger(trigger);}});// Recreate on Friday instead of MondayScriptApp.newTrigger(functionName).timeBased().onWeekDay(ScriptApp.WeekDay.FRIDAY).atHour(17).create();Logger.log("Digest rescheduled to Friday at 5pm.");}
Full Setup Script for Acme Corp Automations
A single setupAllTriggers() function that installs the entire suite of automations for the Sales Tracker:
functionsetupAllTriggers(){var ss =SpreadsheetApp.getActiveSpreadsheet();// Clear existing triggers to start freshScriptApp.getProjectTriggers().forEach(function(t){ScriptApp.deleteTrigger(t);});// 1. Daily report at 8am on weekdaysScriptApp.newTrigger("sendDailyReport").timeBased().everyDays(1).atHour(8).inTimezone("America/New_York").create();// 2. Weekly digest every Monday at 9amScriptApp.newTrigger("sendWeeklyDigest").timeBased().onWeekDay(ScriptApp.WeekDay.MONDAY).atHour(9).create();// 3. Installable onEdit for status changesScriptApp.newTrigger("onEditInstallable").forSpreadsheet(ss).onEdit().create();// 4. onFormSubmit for new lead entriesScriptApp.newTrigger("onNewDealSubmitted").forSpreadsheet(ss).onFormSubmit().create();// 5. onOpen for menu and dashboard refreshScriptApp.newTrigger("onOpenInstallable").forSpreadsheet(ss).onOpen().create();Logger.log("All Acme Corp Sales Tracker triggers installed.");}
Run setupAllTriggers() once after deploying the script to a new spreadsheet, and the entire automation suite is live.