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を利用することで、普段の業務でおこなっている手作業を自動化できるため、ぜひとも利用したいところです。
利用にあたっては、今回紹介した実行時間の削減を参考に効率化していきましょう。
コメント