「また固まった…」「なぜ私だけこんなに待たされるんだ…」
Google Apps Script(GAS)で業務自動化に挑戦し始めたばかりの頃、私はいつもそう呟いていました。初めて作ったGASスクリプトは、日報の集計作業を自動化するシンプルなものでした。数万行に及ぶ営業データをスプレッドシートから読み込み、条件ごとに分類して別のシートに書き出す。たったそれだけの処理が、実行するたびに数十分、ひどい時には1時間以上もかかっていました。
「これなら手作業の方がマシなんじゃないか…?」
そんな焦燥感に駆られ、結局はタイムアウトでスクリプトが停止。深夜までかかって手作業で集計し直す羽目になったことも一度や二度ではありません。翌朝、上司から「昨日の集計、まだ?」と聞かれるたびに、胃がキリキリと痛みました。「自動化したはずなのに、なぜこんなにも苦しいんだ…」と、本当に情けなくて、自分の不甲斐なさにもうダメかもしれないとすら思いました。
あなたは今、私と同じような悩みを抱えていませんか?
せっかくGASを学んで業務効率化を目指したのに、スクリプトの遅さにうんざりしていませんか?「どうすればGASを高速化できるのか?」と、きっと頭を抱えていることでしょう。その答えこそ、「配列」にあります。
この記事では、かつて遅いGASに絶望していた私が、配列をマスターすることで劇的にスクリプトを高速化させ、業務効率を覚醒させた経験を基に、GAS高速化のための必須テクニックを5つ厳選してご紹介します。もう、あなたの貴重な時間を無駄にすることはありません。
なぜあなたのGASは「遅い」のか?〜図書館の司書に学ぶ非効率の正体〜
GASが遅いと感じる最大の原因は、スプレッドシートへの直接アクセスを何度も繰り返していることにあります。これは、例えるなら「非効率な図書館の司書」のようなものです。
想像してみてください。あなたは図書館の司書です。誰かに本を貸すたびに、棚から一冊ずつ本を取り出し、カウンターまで運び、処理が終わったらまた一冊ずつ棚に戻す。これを数百回、数千回と繰り返すため、貸し出し作業に膨大な時間がかかってしまいます。これでは、どんなに手際の良い司書でも疲弊し、利用者はイライラするばかりでしょう。
GASにおける「棚」はスプレッドシート、「本」はセル一つ一つのデータ、「司書」はスクリプトです。セルへの直接読み書き(getValue()やsetValue())は、この非効率な司書と同じことをしているのです。GASがスプレッドシートにアクセスするたびに、Googleのサーバーとの通信が発生し、その通信コストが積み重なっていくため、処理が遅くなるのです。
では、どうすればこの問題を解決できるのでしょうか?答えは「配列」です。
配列があなたのGASを覚醒させる理由
配列とは、複数のデータをまとめて格納できる「データの箱」のようなものです。先ほどの図書館の例で言えば、「大型カート」に当たります。
効率的な司書は、貸し出す予定の数百冊の本を、まず大型カート(配列)にまとめて載せ、カウンター(メモリ)まで一気に運びます。そこでまとめて処理(データの加工や条件分岐)を行い、処理が終わったらまた大型カートにまとめて載せ、棚(スプレッドシート)に一気に戻すのです。
このように、配列を使うことで、スプレッドシートへのアクセス回数を最小限に抑え、必要な処理はすべてGASのメモリ上で行うことができます。これにより、Googleサーバーとの通信回数が劇的に減り、スクリプトの実行速度は飛躍的に向上するのです。私が遅いGASに苦しんでいた時、この「配列」の概念を理解した瞬間、「これだ!世界が変わる!」と確信しました。
さあ、あなたのGASを覚醒させるための必須テクニックを具体的に見ていきましょう。
GAS高速化のための必須テクニック5選
1. 基本中の基本!`getValues()`と`setValues()`で一括処理
これがGAS高速化の第一歩であり、最も効果的なテクニックです。getValue()やsetValue()でセル一つ一つを読み書きするのではなく、getValues()で範囲内の全データを二次元配列として一括で読み込み、処理後にsetValues()で一括で書き込みます。
Before(非効率な例):
“`javascript
function slowProcess() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
for (let i = 1; i <= sheet.getLastRow(); i++) {
const value = sheet.getRange(i, 1).getValue();
sheet.getRange(i, 2).setValue(value + “加工済み”);
}
}
“`
このコードでは、ループの度にシートへの読み書きが発生し、非常に遅いです。
After(配列を使った高速化例):
“`javascript
function fastProcess() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const range = sheet.getDataRange();
const values = range.getValues(); // 全データを配列で一括読み込み
const processedValues = values.map(row => {
return [row[0] + “加工済み”]; // 配列内で加工
});
range.setValues(processedValues); // 配列データを一括書き込み
}
“`
これだけで、数倍〜数十倍の高速化が見込めます。この違いを知った時の衝撃は忘れられません。「なぜもっと早く知らなかったんだ…」と、過去の自分を呪いましたね。
2. ループ処理は配列内で行う!`for`ループと`forEach`の使い分け
データを加工する際のループ処理は、必ず配列に対して行いましょう。JavaScriptには多様なループ構文がありますが、シンプルなforループやforEachメソッドは、配列の要素を一つずつ処理するのに適しています。
ポイント: forループはインデックスを扱う際に、forEachは各要素に対して処理を行う際に便利です。どちらを使うにしても、重要なのは「シートに直接アクセスしない」ことです。
“`javascript
// forEachを使った例
values.forEach((row, index) => {
// rowは各行の配列
// indexは行番号
processedValues[index][1] = row[0] * 2; // 配列内で計算
});
“`
3. 強力な味方!`map`, `filter`, `reduce`でスマートに処理
JavaScriptの配列には、データ処理をより簡潔かつ効率的に行うための強力なメソッドが多数用意されています。特にmap, filter, reduceは、あなたのGASスクリプトを洗練されたものに変えてくれるでしょう。
map(): 配列の各要素に処理を施し、新しい配列を生成。データの変換に最適。filter(): 配列の要素を条件で絞り込み、新しい配列を生成。特定の条件に合う行だけを取り出したい時に。reduce(): 配列の要素を一つに集約(合計、平均など)する。
これらのメソッドを使いこなせば、冗長になりがちなループ処理を数行のコードに凝縮でき、可読性も格段に向上します。
4. 一時配列を賢く使う!必要なデータだけをメモリに保持
大規模なデータを扱う際、全てのデータを一度にメモリに読み込むと、メモリ不足や処理の遅延を招くことがあります。必要なデータだけを一時配列に格納し、処理が終わったら解放する、という考え方が重要です。
例えば、特定の条件を満たす行だけを抽出し、その行だけを加工して新しいシートに書き込む場合。
1. getValues()で全データを読み込む。
2. filter()で条件に合う行だけを一時配列に抽出。
3. 抽出した一時配列に対して加工処理を行う。
4. 加工済みの配列をsetValues()で書き込む。
この流れで処理することで、無駄なメモリ使用を抑えつつ、効率的なデータハンドリングが可能になります。
5. データ構造を意識する!オブジェクト配列で可読性と効率を両立
二次元配列は便利ですが、データの意味合いが分かりにくい場合があります。例えば row[0] が「商品名」で row[1] が「価格」だとしても、コード上ではただの数字です。
そこで、データをオブジェクト形式で扱う「オブジェクト配列」を導入すると、コードの可読性が飛躍的に向上します。
“`javascript
// 二次元配列からオブジェクト配列への変換例
const header = values.shift(); // ヘッダー行を抽出
const objectArray = values.map(row => {
const obj = {};
header.forEach((key, i) => {
obj[key] = row[i];
});
return obj;
});
// これで objectArray は [{商品名: “A”, 価格: 100}, {商品名: “B”, 価格: 200}, …] のようになる
“`
オブジェクト配列にすることで、item.商品名 のように直感的にデータにアクセスできるようになり、開発効率も上がります。処理が複雑になるほど、この恩恵は大きいです。
私のGASが「覚醒」した日
これらの配列テクニックを一つずつ学び、自身のスクリプトに適用していくたびに、私のGASは劇的に速くなっていきました。かつて数時間かかっていた日報集計は、今ではわずか数秒で完了します。
あの時、上司に怒鳴られ、徹夜で手作業に戻した絶望感は、今や遠い過去の記憶です。スクリプトが高速化したことで、私の業務は劇的に効率化され、残業はほとんどなくなりました。余った時間で、さらに高度な自動化に取り組んだり、新しいスキルを学んだり、あるいは家族と過ごす時間が増えたりと、人生そのものが豊かになったのです。
「ああ、あの苦しかった日々は、この瞬間のためにあったんだな…」
初めて高速化されたスクリプトが、一瞬で処理を終えた時、心の中でそう呟きました。あの時の感動と、業務がスムーズに進む爽快感は、今でも忘れられません。
もう「遅い」GASとは決別しよう!
配列は、GAS高速化の「要」です。最初は少し難しく感じるかもしれませんが、一度その概念と使い方をマスターすれば、あなたのGASスクリプトは劇的に生まれ変わり、業務効率は飛躍的に向上するでしょう。
もう、遅いスクリプトにイライラしたり、無駄な時間を費やす必要はありません。
その「遅い」GAS、配列が救う。
さあ、今日から「配列」を味方につけて、あなたのGASを覚醒させましょう。そして、よりスマートで生産的な働き方を手に入れてください。
