GASは「1実行当たり6分」までという制限がある。処理するデータが増えると途中でスクリプトが止まってしまう可能性がある。今回は、過去に作成した「バラバラのデータを1箇所に集約する」スクリプトの処理を高速化する秘訣を紹介する。
業務で発生するちょっとした面倒くさい業務。特定の操作を繰り返すだけなので、今のままでもいいけど、楽になったらいいなと思うこともあるのではないでしょうか。例えば業務を自動化すると時間が空くため、他の業務に時間を充てたり、残業時間を減らしたりできるかもしれません。
本連載「働く価値を上げる“VBA/GAS術”」では、業務を効率化する手段として「Microsoft Excel」(マイクロソフトエクセル)で使える「VBA」(Visual Basic for Applications)と「G Suite」の「GAS」(Google Apps Script)の使い方を説明し、よくある業務課題の解決策を紹介します。
第8回で、バラバラの経費精算書ファイルからデータを抽出して、1つのデータベースにまとめるGASのスクリプトを紹介しました。経費精算書ではない別のフォーマットだったとしても、ドライブ内のフォルダに存在するスプレッドシートからデータを収集する業務は頻繁に発生します。そのようなときに、このスクリプトは時短を実現するツールとして期待できます。
しかし、処理するデータが増えるとGAS“ならでは”の問題点が発生します。それは「処理時間」です。
GASのスクリプト実行時間は、通常のGmailまたはG Suiteアカウントであれば、「1実行当たり6分まで」という制限があります。実行開始から6分を超えた時点で、スクリプトは強制的に中断します。
参考:Google Apps ScriptーCurrent Limitations
従って、なるべく処理を高速化し、時間内にスクリプトを完了するスクリプトの作り方が求められます。そのための有効な手段の一つが「配列」の利用です。
今回は、以前作成したGASの経費データ収集スクリプトを、配列を使用して、処理速度を向上させます。なお、以下の記事で紹介した命令については本記事では詳しく紹介しませんので、都度参照してください。
第8回目で作成したスクリプトを確認しましょう。
- function collectData() {
- var sheetMain = SpreadsheetApp.getActiveSheet();
- var files = DriveApp.getFolderById('-----フォルダID-----').getFiles();
- while (files.hasNext()) {
- var file = files.next();
- var sheet = SpreadsheetApp.open(file).getSheets()[0];
- var month = sheet.getRange("G1").getValue(); //対象月
- var department = sheet.getRange("G3").getValue(); //部署
- var fullname = sheet.getRange("G4").getValue(); //氏名
- for (var i = 8; i <= sheet.getLastRow(); i++) {
- sheetMain.appendRow([
- month, //対象月
- sheet.getRange(i, 1).getValue(), //日付
- department, //部署
- fullname, //氏名
- sheet.getRange(i, 2).getValue(), //科目
- sheet.getRange(i, 5).getValue(), //適用
- sheet.getRange(i, 6).getValue(), //金額
- sheet.getRange(i, 7).getValue() //備考
- ]);
- }
- }
- }
スプレッドシートのフォーマットも確認します。まず、従業員から集める経費精算書のフォーマットは図1のスプレッドシートです。
これらのスプレッドシートは、スクリプト内で「-----フォルダID-----」で記述されているフォルダIDのフォルダに格納されているとします。また、それらのデータを収集する先は、図2のスプレッドシート「経費収集」となります。
Copyright © ITmedia, Inc. All Rights Reserved.
Coding Edge 記事ランキング