• トップ
  • ブログ一覧
  • 【GAS】Google App Scriptのタイムアウトエラーを回避する方法
  • 【GAS】Google App Scriptのタイムアウトエラーを回避する方法

    はじめに

    Google Apps Script (GAS) を使った自動化は非常に便利だが、タイムアウトエラーに直面したことはないだろうか?
    GASのスクリプトが連続して実行できる時間が無料版で最大6分、有料のGoogle Workspaceプランでも30分に設定されているために発生する。
    スプレッドシートに書き込む処理が時間がかかるため、getValue, setValueを減らし、getValues, setValues を使いまとめて処理することが速くすることができる。
    しかしながら、大量のデータ操作を行うスクリプトを開発していると、コードによる高速化にも限度があり、このタイムアウトエラーは大きな障壁となる。
    この記事では、GASのタイムアウトエラーを回避するための実践的な方法を詳しく解説する。

    スクリプトを分割し、トリガーで再開する

    スクリプトが6分以内に完了しないことが確実な場合、処理を途中で一時停止し、自動的に続きから再開させる仕組みを構築する。
    具体的には、GASのコード内から時間駆動型トリガーを設定し、自身を数分後に再実行させるようにする。これにより、スクリプトは一度終了しても、設定したトリガーによって自動的に再び起動される。さらに、中断した場所から処理を再開できるように、スクリプトプロパティを活用して現在の進捗状況を保存する。

    1.スクリプトプロパティで進捗を保存する

    スクリプトの実行状態(例: 次に処理すべき行番号、処理したデータ量など)をPropertiesServiceを使って保存する。
    これにより、スクリプトが途中で終了しても、再開時に前回の状態を読み込み、中断した場所から処理を続けることができる。

    1// 進捗の取得
    2const properties = PropertiesService.getScriptProperties();
    3let lastProcessedRow = Number(properties.getProperty('lastProcessedRow')) || 1;
    4
    5// 処理の途中で進捗を保存
    6properties.setProperty('lastProcessedRow', currentRow);

    2.時間駆動型トリガーで再開する

    ScriptApp.newTrigger()メソッドを使用して、スクリプトを一定時間後(例: 1分後)に自動的に実行するように設定する。
    スクリプトの実行がタイムアウトに近づいたと判断したら、次の実行をトリガーに設定し、現在のスクリプトを終了する。

    1const startTime = new Date().getTime();
    2const maxExecutionTime = 1000 * 60 * 5; // 5分 (5分経過したらトリガーを設定して終了)
    3
    4// 進捗の取得
    5const properties = PropertiesService.getScriptProperties();
    6let lastProcessedRow = Number(properties.getProperty('lastProcessedRow')) || 1;
    7
    8for (let i = lastProcessedRow; i  maxExecutionTime) {
    9    // 処理の途中で進捗を保存
    10    PropertiesService.getScriptProperties().setProperty('lastProcessedRow', i);
    11
    12    // 同じ関数を再実行するトリガー
    13    ScriptApp.newTrigger('関数名')
    14      .timeBased()
    15      .after(1 * 60 * 1000) // 1分後に実行
    16      .create();
    17    return; // 現在のスクリプトを終了
    18  }
    19}
    20
    21// 全ての処理が完了したら進捗とトリガーを削除
    22PropertiesService.getScriptProperties().deleteProperty('lastProcessedRow');
    23const triggers = ScriptApp.getProjectTriggers();
    24for (const trigger of triggers) {
    25  if (trigger.getHandlerFunction() === '関数名') {
    26    ScriptApp.deleteTrigger(trigger);   
    27  }
    28}

    まとめ

    GASの6分というタイムアウト制限は、スクリプトの設計を工夫することで十分に乗り越えることができる。
    処理効率の向上ももちろん大切だが、トリガーを使ったスクリプトの分割実行は大規模なGASプロジェクトを成功させるための強力な武器となる。
    今回ご紹介したテクニックを活用して、あなたのGASプロジェクトをさらに進化させてほしい。

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background