GASのタイムアウトエラー(6分の壁)を回避する裏技

GASのタイムアウトエラー(6分の壁)を回避する裏技

GASの処理の実行時間は最大6分まで(有料プランは30分まで)で、それを越えるとタイムアウトエラーになってしまうという規制があります。一般的に、6分の壁30分の壁と言われていますが、なんと解決方法があるのでご紹介します!

サンプルのシートとプログラム

まず、スプレッドシートを新しく作成し、シート名は「test」にしてください。

シート「test」

シート名「test」

次に、拡張機能から「AppsScript」を選択し、下記のスクリプトを全て貼り付けて実行ください。

拡張機能からAppsScript

拡張機能からAppsScript

// 300回ループさせるテスト
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){
      // 100秒経過したら、スクリプトプロパティを設定し、トリガーをセットして、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);
    }
  }
  // 300周し終えたらスクリプトプロパティを削除
  PropertiesService.getScriptProperties().deleteProperty('nextIndex');  
}

function setTrigger() {
  const triggers = ScriptApp.getProjectTriggers();
  // プロジェクト内のセットされているトリガーを一つずつチェック
  for(const trigger of triggers){
    // もし、'testLoop300'という名前のトリガーがあったら、そのトリガーを削除
    if(trigger.getHandlerFunction() == 'testLoop300'){
      ScriptApp.deleteTrigger(trigger);
    }
  }
  // 1分後にトリガーをセット(1分 = 60秒 = 1秒*60 = 1000ミリ秒 * 60)
  ScriptApp.newTrigger('testLoop300').timeBased().after(1000 * 60).create();
}

testLoop300 の関数を実行すると、 自動的にスプレッドシートのA列には数字が 1 から記載され始め、B列には実行してからの秒数が記載されます。

100秒経過すると、自動的に testLoop300 の関数が1分後にトリガーがセットされます。同時に、次に記載したい数字がプロパティの中の nextIndex の中に保存されます。なので、次にtestLoop300 が実行された際にはスプレッドシートには nextIndex の番号が記載されます。

上記を繰り返しながらスプレッドシートに数字を記述していき、300行到達するまで半永久的に実行し続けているのがわかると思います!

A列が300に到達するまで半永久的に更新

A列が300に到達するまで半永久的に更新

ぜひご活用ください。

「ChatGPT API × LINE」Udemy講座を販売中

OpenAI社のAPIを使ったLINEチャットボットの作り方のUdemy講座を公開中!

まだChatGPTのAPIを使って生成AIアプリ開発をしたことがない方はもちろん、非エンジニアの方にも分かりやすくプログラミングの基礎から丁寧に2時間半かけて解説しています。是非Udemy講座も併せてチェックしてご受講いただけると幸いです!