このスクリプトですが、処理速度という点で、幾つか改善余地があります。まず、前提知識として、以下のように、スプレッドシートへのアクセスを伴う処理は、その実行速度が遅くなります。
これらの処理の特徴を踏まえてスクリプトを見ると、for文の条件式にgetLastRow()メソッドがありますし、forループ内の処理にgetRange()メソッドやgetValue()メソッドが多数含まれています。
つまり、これらのメソッドの使用回数を極力減らすことで、スクリプト全体の処理速度を向上できます。なお、実行速度が遅い処理はスプレッドシートだけでなく、ドライブなど他のサービスでも同様です。極力、各サービスへアクセスする処理数を減らせるようにスクリプトを組んでいく必要があるのです。
前述の経費データ収集スクリプトについて、配列を活用したものが以下になります。
function collectData() {
var sheetMain = SpreadsheetApp.getActiveSheet();
var mainValues = [];
var files = DriveApp.getFolderById('-----フォルダID-----').getFiles();
while (files.hasNext()) {
var file = files.next();
var sheet = SpreadsheetApp.open(file).getSheets()[0];
var basicValues = sheet.getRange('G1:G4').getValues();
var month = basicValues[0][0]; //対象月
var department = basicValues[2][0]; //部署
var fullname = basicValues[3][0]; //氏名
var startRow = 8, startColumn = 1;
var lastRow = sheet.getLastRow();
var lastColumn = sheet.getLastColumn();
var numRows = lastRow - startRow + 1;
var values = sheet.getRange(startRow, startColumn, numRows, lastColumn).getValues();
for (var i = 0; i < numRows; i++){
mainValues.push([
month, //対象月
values[i][0], //日付
department, //部署
fullname, //氏名
values[i][1], //科目
values[i][4], //適用
values[i][5], //金額
values[i][6] //備考
]);
}
}
sheetMain.getRange(2, 1, mainValues.length, mainValues[0].length).setValues(mainValues);
}
スクリプト「colectData()」の、処理の流れは以下のようになっています。
おおまかな流れは第8回と同様ですが、途中に配列関連の処理が加わっています。以下で、スクリプトのポイントとなる部分について解説します。
「数百のファイルを1つ1つ開くの面倒……」、複数のExcelデータを1箇所に集約するマクロ術
「計算式エラーで残業確定……」、GASで入力データのチェックツールを作成
プログラム自動実行で仕事を楽に! APIでSlackなどと連携できる「Google Apps Script」とはCopyright © ITmedia, Inc. All Rights Reserved.