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の使いどころは本当に多いです。
慣れれば、仕事効率も思考整理も加速します。

トップページへ戻る