GAS(Google Apps Script ※1)には実行時間が6分間という制限があります。6分以上の処理を実行すると途中で止まってしまうため、GASの実行時間に悩む人も多いのではないでしょうか。

そこで今回は、GASの実行時間を少しでも削減できる方法について解説します。

GAS(※1)
GASとは、Google Apps Scriptの略であり、Googleが提供しているJavaScriptベースのスクリプト言語です。スクリプト言語を使用することで、Googleサービスを効率化できます。例えば毎日Googleスプレッドシートへ自動で株価データを挿入させたり、スプレッドシートへの権限を振ったり、ボタンを押して自動化ができます。
https://developers.google.com/gsuite/aspects/appsscript?hl=ja

GASの実行時間問題とは

GASでは、スクリプトの実行時間が6分間という縛りがあります。6分以上になると、タイムアウトエラーが発生してしまい、処理の途中であろうと強制的に終了してしまいます。したがって、処理時間が長いコーディングをしてしまうと、想定通りの動きにならない可能性があるのです。

GASの実行時間を回避する2つの策とは

GASの実行時間問題は、大きく以下の対策方法があります。

  • 関数の呼び出しを少なくする
  • トリガー実行を活用する

それぞれの方法を解説していきましょう。

対策1: 関数の呼び出しをできる限り少なくする

GASでは、処理で利用する関数の実行回数に制限があります。例えば、セルから値を取得する関数は1日で最大50,000回まで、Googleカレンダーにアクセスして予定を書き込む処理は1日最大5,000回までなどです。

特に、セルから値を取得したり、セルに値を挿入する際は注意が必要です。以下のコードをご覧ください。

function main(){
  //シートを取得
  var sheet = SpreadsheetApp.getActive().getSheetByName('シート1');
   
  //セルを取得
  var range1 = sheet.getRange('A2');       //A2を取得
  var range2 = sheet.getRange('A3');       //A3を取得
  var range3 = sheet.getRange('A4');       //A4を取得
   
  //取得したセルであるrange1,range2の値をsetValue()で設定
  range1.setValue('テスト1'); //A2の値が 'テスト1' に変わる
  range2.setValue('テスト2'); //A3の値が 'テスト2' に変わる
  range3.setValue('テスト3'); //A4の値が 'テスト3' に変わる
}

コードにある「getRange」や「setValue」を1回使うごとに使用回数が1回カウントされます。できるだけこれらの関数を最小限にしなければならないのです。

以下のコードは、できるだけ呼び出す関数の回数を少なくした例です。

function main(){
  //シートを取得
  var sheet = SpreadsheetApp.getActive().getSheetByName('シート1');
   
  //セルを取得
  var range1 = sheet.getRange(“A2:A4”);       //A2~A4を取得
   
  //配列に格納する
  var array = ["テスト1","テスト2","テスト3"];  

  //取得したセルであるrange1,range2の値をsetValue()で設定
  range1.setValue(array); //A2~A4の値が "テスト1","テスト2","テスト3"]に変わる
}

セルをまとめて取得し、シートに挿入する場合も一度で済むように配列へ格納しています。

対策2: トリガー実行を活用

GASの実行時間は、どれだけ最適の処理を記述したとしても、6分を超えてしまうケースがあります。そこで、トリガー実行によって処理を繰り返しおこなっていくのが効果的です。

トリガー実行とは、定期的に処理をおこなえるようにするための仕組みです。例えば、毎日決まった時間に処理を実行したり、1分後に処理を実行したり、毎週月曜日の9時だけ実行するなどの指定ができます。

トリガー実行は、プログラミングによって設定することが可能なため、実行時間が5分を超えたら一度処理を中断し、数分後に処理を実行するトリガーを設定できるのです。

トリガーを実行する処理は、以下の通りです。

function makeTrigger() {
  // 現在の時間を取得
  var startTime = new Date();
  // 処理実行から何分経過したのかを取得
  var diff = parseInt((new Date() - startTime) / (1000 * 60));
    if(diff >= 5){
      var dt = new Date();
      dt.setMinutes(dt.getMinutes() + 1);  //1分後に再実行
    ScriptApp.newTrigger('func').timeBased().at(dt).create();
}

この処理では、実行してから5分を経過してから新しいトリガーを発行しています。新規で発行したトリガーは、「func」という関数を1分後に再実行するものです。再実行後は、引き続き5分を経過してから新たにトリガーを発行して繰り返していきます。

GASを効率的に活用し業務効率化を図ろう

GASは、無料で利用ができるため手軽に活用ができます。GASを利用することで、普段の業務でおこなっている手作業を自動化できるため、ぜひとも利用したいところです。

利用にあたっては、今回紹介した実行時間の削減を参考に効率化していきましょう。