前提・実現したいこと
Google Apps Scriptとslackを使ってbotを作成しています。以下のようにトリガーを設定していたのですが、たまに指定時間のトリガーが複数回実行されることがあります。
該当のソースコード
mainCreateTriggerを10時以前に実行するようトリガーを設定し、10時、11時、13時、15時、、、にslackに通知するよう設定しています。
function mainCreateTrigger(){ delAllTrigger();//トリガーをデリート var targetHours = [10,11,13,15,17,19,21,23]; for(var i=0; i<targetHours.length; i++){ setTrigger(targetHours[i]); } function setTrigger(targetHour){ var time = new Date(); time.setHours(targetHour); time.setMinutes(00); ScriptApp.newTrigger('sendToSlack').timeBased().at(time).create(); } function delAllTrigger() { const triggers = ScriptApp.getProjectTriggers(); for(const trigger of triggers){ if(trigger.getHandlerFunction() == "sendToSlack"){ ScriptApp.deleteTrigger(trigger); } } }
試したこと
現在は実行部分にロックをかけ、実行した後にトリガーの削除(トリガーをつくるときにIdと日時を記録し、実行したときにそれらを照らし合わせてトリガーの削除)を行っています。しかし、トリガーを作成する段階でミスしてないか、もっとほかにスマートなやり方があるのではないかと思って質問させていただきました。
//実行部分 function sendToSlack(){ var lock = LockService.getScriptLock(); if(lock.tryLock(300000)){ try{ postSlack();//slackに投稿 Utilities.sleep(10000);//10秒待つ delOverTimeTrigger();//現在時刻を越したトリガーを削除 } catch(e) { errorPost()//エラーポスト } finally{ lock.releaseLock(); } } }
あなたの回答
tips
プレビュー