forって何?GAS初心者が実例で学んだ繰り返し処理の基本
GAS初心者の頃に最初につまずいた「for文」について、自分の実体験を元に解説します。基本構文からスプレッドシートでの実用例、ifとの組み合わせ、二重ループやインデントの工夫まで、「実際にどう使ったか」をベースに紹介します。
このブログは、Google Apps Script(GAS)を使った自作ツールの記録や、開発の過程での気づきをまとめたものです。
丁寧な解説というより、「こんなこともGASでできるんだ」というアイディアのきっかけになれば幸いです。
for文の基本
繰り返し処理の基本形は以下のような形です。
for (let i = 0; i < 5; i++) {
Logger.log(i);
}
「何回も同じ処理をしたい」場面でまず使うのがこの形です。
iが0から始まって、1ずつ増えながら、5未満の間繰り返す、という流れです。
初心者の頃は、
- letって必要?
- i < 5 で終わるの?
- i++ ってなんだ?
みたいなところが気になりましたが、まずは「何回も同じ処理をしたいときに使うんだ」とだけ覚えればOKです。
この例文であれば「最初は0で、iは5未満で、1つずつ増えてる」って内容で繰り返し処理が行われています。
スプレッドシートでの実用例
GASでスプシを操作するなら、行ごとに何か処理したいときに for が活躍します。
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("データ");
const values = sheet.getDataRange().getValues();
for (let i = 1; i < values.length; i++) {
const row = values[i];
Logger.log(row[0]);
}
ヘッダー行を飛ばして1行ずつ処理したいときにこのパターンをよく使います。
iは行数を表していて、1行ずつ順に処理をしています
values[i] で1行分の配列が取れます。
ifとの組み合わせ
for文でデータを1行ずつ取り出して処理するとき、特定の条件に合致するデータだけを対象にしたい場合があります。 そんなときに使うのが
if文です。「この条件を満たしていたら実行する」という、分岐処理の基本構文です。
たとえば、スプレッドシートのデータから「未処理」と記された行だけを抽出してログに表示したいとき、次のように記述します。
for (let i = 1; i < values.length; i++) {
const row = values[i];
if (row[3] === "未処理") {
Logger.log("処理が必要:" + row[0]);
}
}
このコードでは、スプレッドシートの2行目(インデックス1)以降のデータを順番に見ていき、各行の4列目(配列ではインデックス3)が「未処理」となっている場合に、1列目(インデックス0)の値をログに出力しています。
「条件付きで処理を行いたい」という場面では、if 文は最も基本的かつ重要な構文の一つです。
例えば、「特定の担当者の行だけ処理したい」「金額が1万円以上のデータだけ抽出したい」といったニーズにも、同様の書き方で対応できます。
if を使うことで、すべての行に一律で処理をするのではなく、「必要なデータだけを選んで処理する」ことが可能になり、無駄な処理を避けられるだけでなく、バグやミスの防止にもつながります。
条件分岐を使いこなすことは、GASに限らずプログラミング全般で非常に重要な考え方です。ぜひ繰り返し使って慣れておきましょう。
二重ループの注意点
for (let i = 0; i < list1.length; i++) {
for (let j = 0; j < list2.length; j++) {
if (list1[i][0] === list2[j][0]) {
Logger.log("一致:" + list1[i][0]);
}
}
}
このコードは、2つのリスト(list1とlist2)を比較し、それぞれの1列目([0])が一致する要素をログに出力する処理です。 「リストの中のリスト(2次元配列)」を扱うときや、「すべての組み合わせをチェックしたい」ときなどに、二重ループ(二重のfor文)を使うことがあります。
ただし、多重ループを使う場合は以下の点に注意が必要です。
- 変数名(i/jなど)が意味を持つようにする:ネストが深くなるほど、何をループしているのか分かりづらくなります。可能であれば
outerIndexやinnerIndexのように、少し意味を持たせた変数名を使うと可読性が上がります。 - 処理の中身が複雑になりすぎないように:ネストが深いまま複雑な処理を追加すると、バグの原因になります。必要に応じて関数に分けるなど工夫しましょう。
- パフォーマンスにも注意:2つの配列が大きい場合、処理回数が
list1.length × list2.lengthになるため、動作が重くなることがあります。最適化やループ回避の工夫も重要です。
二重ループは便利ですが、構造が複雑になりやすいため、できるだけシンプルに保つことを意識しましょう。
三重以上とreturn・continueの活用
ループ処理が二重、三重と深くなるにつれて、コードの可読性はどんどん下がっていきます。
処理が複雑になると、どの条件でどこまで処理を続けるのか、何をスキップして何を実行するのかが分かりづらくなり、バグの原因にもなりがちです。
そんなときに役立つのが、continue や
returnといった「処理の流れを制御する命令」です。
これらを上手に使うことで、ループの中でも必要な処理だけをシンプルに書くことができ、ネストの深いコードでも見通しが良くなります。
continue:処理をスキップして次のループへ
特定の条件を満たす行は処理の対象外にしたい場合などに、continue を使って処理をスキップすることができます。
以下は、3列目が空欄の場合は何もしないで次の行に進む例です。
for (let i = 0; i < data.length; i++) {
if (data[i][2] === "") continue;
// 本処理
}
このように、条件によって処理を飛ばすことで、「不要な処理を避けて、本当に必要なデータだけに集中する」ことができます。
ネストを減らせるため、コード全体の見通しも良くなります。
return:関数の実行を途中で終了
ループの途中で、もう処理を続ける必要がなくなった場合には return を使って関数全体の実行を止めることができます。
以下は、スプレッドシートの中から「重要」というキーワードを含むデータを見つけたら、すぐに処理を終了する例です。
function findKeyword() {
for (let i = 0; i < data.length; i++) {
if (data[i][1].includes("重要")) {
Logger.log("見つけた!");
return;
}
}
}
このように return を使えば、「条件を満たした時点で無駄な処理をせずに抜ける」ことができ、効率的なスクリプトになります。
特に検索処理や条件マッチのチェックなどでは非常に有効です。
インデントの意味とコツ
コードを書くときに忘れてはいけないのが、見た目の整理(インデントや空白の使い方)です。
動けばいいと思いがちですが、見た目が整っていないコードは、後から見返すと何をしているのか非常に分かりにくく、バグの原因にもつながります。
特に for文やif文などのネスト(入れ子)構造が増えると、見た目の乱れは処理の理解を大きく妨げます。
コードは「自分のために書くもの」であり、「未来の自分(あるいは他の人)」が読むものです。
だからこそ、処理の構造がひと目でわかるよう、一貫した見た目のルールを守ることがとても重要です。
以下に、悪い例と良い例を比較してみましょう。
悪い例(インデントなし・読みにくい)
for (let i = 0; i < list.length; i++) {
for (let j = 0; j < list2.length; j++) {
if (list[i] === list2[j]) {
Logger.log("一致!");
}
}
}
一見すると動作には問題ありませんが、処理の階層構造がまったく見えず、どこからどこまでがループで、どの条件で何が行われているのかが非常に分かりにくい状態です。
良い例(インデントあり・構造が明確)
for (let i = 0; i < list.length; i++) {
for (let j = 0; j < list2.length; j++) {
if (list[i] === list2[j]) {
Logger.log("一致!");
}
}
}
インデントを使って階層を表現することで、どの処理がどこに属しているのかが一目で分かります。
読み手がコードを追いやすくなり、ミスにも気づきやすくなります。
なぜ「見た目」が大切なのか?
- バグを防げる:ネストが深くなるほど、閉じ括弧
}の位置ミスが起きやすくなります。正しいインデントで書けば、構造ミスにすぐ気づけます。 - 読み返しやすい:数日後・数か月後の自分が見たときに、すぐに内容を理解できるようになります。
- 他人と共有しやすい:チームやネットにコードを載せるとき、読みやすいコードはそれだけで信頼されやすくなります。
GASのようにすぐ動かせるスクリプトだからこそ、「とりあえず動いたコード」から「きれいで理解しやすいコード」への意識が大切です。
自分自身の作業効率を上げるためにも、書いたコードはできるだけ整理しておく習慣を身につけましょう。
まとめ
最初はただの「繰り返し」でも、
- データを走査する
- 条件付きで処理する
- 多重ループで複雑な処理に対応する
といった具合に、使える場面が一気に広がります。
GASでは「スプレッドシートとの連携」がほぼ必須なので、forの使いどころは本当に多いです。
慣れれば、仕事効率も思考整理も加速します。