GASのタイムアウトエラー(6分の壁)を回避する裏技
GASの処理の実行時間は最大6分まで(有料プランは30分まで)で、それを越えるとタイムアウトエラーになってしまうというのが一般です。一般的に、6分の壁や30分の壁と言われていますが、解決方法があります!
テストで動かしてみよう!
まず、スプレッドシートを新しく作成し、シート名は「test」にしてください。
次に、拡張機能から「AppsScript」を選択し、下記のスクリプトを全て貼り付けて実行ください。
// 1000回ループさせるテスト function testLoop300() { const startTime = new Date(); // ①実行開始時点の日時 const SS = SpreadsheetApp.getActiveSpreadsheet(); const SHEET_TEST = SS.getSheetByName('test'); let startIndex = Number(PropertiesService.getScriptProperties().getProperty('nextIndex')); if (!startIndex) startIndex = 1; // もしstartIndexがnullの場合は1を代入 for(let index = startIndex; index <= 300; index++){ const currentTime = new Date(); // ②ループx周目時点の日時 const seconds = (currentTime - startTime)/1000; // 経過秒数を計算(①と②の差分) if(seconds > 100){ // 300秒経過したら、スクリプトプロパティを設定し、トリガーをセットして、returnする PropertiesService.getScriptProperties().setProperty('nextIndex', index); setTrigger(); return; } SHEET_TEST.getRange(index+1, 1).setValue(index); // A列にindexを入力 SHEET_TEST.getRange(index+1, 2).setValue(seconds); // B列に経過秒数を入力 SpreadsheetApp.flush(); Utilities.sleep(1000); // 1秒スリープさせる(1秒 = 1000ミリ秒) } // 300周し終えたらトリガーを削除 const triggers = ScriptApp.getProjectTriggers(); for(const trigger of triggers){ if(trigger.getHandlerFunction() == 'testLoop300'){ ScriptApp.deleteTrigger(trigger); } } // 1000周し終えたらスクリプトプロパティを削除 PropertiesService.getScriptProperties().deleteProperty('nextIndex'); } function setTrigger() { const triggers = ScriptApp.getProjectTriggers(); // プロジェクト内のセットされているトリガーを一つずつチェック for(const trigger of triggers){ // もし、'testLoop1000'という名前のトリガーがあったら、そのトリガーを削除 if(trigger.getHandlerFunction() == 'testLoop300'){ ScriptApp.deleteTrigger(trigger); } } // 1分後にトリガーをセット(1分 = 60秒 = 1秒*60 = 1000ミリ秒 * 60) ScriptApp.newTrigger('testLoop300').timeBased().after(1000 * 60).create(); }
自動的にスプレッドシートに記述していき、300行到達するまで半永久的に実行し続けているのがわかると思います!
ぜひご活用ください。
「ChatGPT API × LINE」Udemy講座を販売中
OpenAI社のAPIを使ったLINEチャットボットの作り方のUdemy講座を公開中!
まだChatGPTのAPIを使って生成AIアプリ開発をしたことがない方はもちろん、非エンジニアの方にも分かりやすくプログラミングの基礎から丁寧に2時間半かけて解説しています。是非Udemy講座も併せてチェックしてご受講いただけると幸いです!