【GAS】for文の派生for ofとfor in、forEachの処理と違いを解説

2022年5月1日

前回、Google Apps Script(GAS)でfor文を紹介しましたが、forループには派生したfor of、for in、forEachといった繰り返し処理もあります。

それぞれのループ処理の流れと、3つのfor文の派生形の違いについて解説します。

GASの繰り返し処理の基本for文

Google Apps Script(GAS)のスクリプトで、繰り返し処理の基本とも言えるのがfor文です。

繰り返し処理の中には、whileループもありますが、forループは予め何回の繰り返し処理を行うか条件を定めてます。

スプレッドシート上のデータや、配列のデータを処理することが多いGASスクリプトでは、while文よりもfor文を利用することが多いです。

そのため、様々な自動化処理を実行するGASスクリプトではfor文による繰り返し処理が必須と言えます。

for文の派生①for…of、②for…in、③forEach

前述したfor文に関する解説記事の中で、Google Apps Scriptでのforループの記述方法や使用例を紹介しました。

実はGASのfor文には、その派生からできた3種類の構文が用意されています。

  1. for … of文
  2. for … in文
  3. forEachメソッド

3つともfor文とも近い処理が可能ですが、少し記述方法が異なっていて、利用シーンも異なります。

そこで、①for…of文、②for…in文、③forEachメソッドの3つの利用方法をサンプルコードを使って解説します。

①for … of文の使い方とサンプルコード

1つ目のfor…of文は以下の形で利用するループ処理です。

for(変数 of 配列){
  //配列の要素数だけ繰り返し、毎回変数に配列値を格納
  //for ofループで実行する処理を記述

}

配列に含まれるデータを全て処理したい場合に、for of文を用います。

通常のfor文の場合は、「for(let i=0;i<Array.length;i++)」といった書き方で配列の要素を記述していました。

for…of文を使うと、「for(let i of Array)」とlengthプロパティで配列の要素数を取得せずに、配列の要素の数だけループ処理が可能です。

実際にGoogle Apps Script(GAS)でfor of文を使った繰り返し処理のサンプルコードを解説します。

function myFunction() {
  //for ofの処理で使う点数の配列を定義
  const scores = [60,70,80,65,90];
  //for...ofで配列からひとつずつ要素を取得
  for(let score of scores){
    //取得した配列要素をログ出力
    console.log(score);
  }
}

配列要素の回数だけ、for of文の中括弧内に都度変数に配列の値が代入されて処理できています。

このように配列の処理をしたい場合には、for文よりもシンプルな記述ができるのがfor…of文のメリットです。

②for … in文の使い方とサンプルコード

1つ目のfor…in文は以下の形で利用するループ処理です。

for(変数 in オブジェクト){
  //オブジェクトの要素数だけ繰り返し、毎回変数にキー値を格納
  //for inループで実行する処理を記述

}

for in文はオブジェクト(連想配列)のデータからキー要素を順不同で取得して、繰り返し処理を実行します。

この順不同というのがキーポイントで、定義された順番にオブジェクトのキーが取り出されるかは保証されていません。

それゆえに、for…in文は配列のデータ処理には適していません。

配列データは順序性があるデータなので、for…of文を使うようにし、処理するデータに応じてfor…in文と使い分けるのが大切です。

Google Apps Script(GAS)でfor in文を使った繰り返し処理のサンプルコードを解説します。

function myFunction2() {
  //for inの処理で使う5教科点数オブジェクトを定義
  const scores = {'Ja':60,'En':70,'Ma':80,'Sc':65,'So':90};
  //for...inでオブジェクトからひとつずつキーを取得
  for(let score in scores){
    //取得したオブジェクトのキーをログ出力
    console.log(score);
    //取得したオブジェクトのキーから値を出力
    console.log(scores[score]);
  }
}

for of文とは違い、配列ではなく、オブジェクト(連想配列)が対象となっています。

取り出すのはオブジェクトの値ではなく、キー要素になっているため、ログ出力すると値は表示されません。

また、今回はオブジェクトで定義した順番通りに表示されていますが、for in文は順不同のため、実行結果によっては同じ順番ではない時があります。

値を参照したい場合、元のオブジェクトに対してブラケット記法を使って参照します。

このようにすることでオブジェクトのキー要素をfor in文で取り出し、キーに対応する値も取得できます。

③forEachメソッドの使い方とサンプルコード

3つ目のforEach文は、配列のメソッドとして実行する繰り返し処理です。

Array.forEach(function(変数){
  //配列からひとつずつ要素を取得して変数に格納
  //forEachループで実行する処理を記述

});

for ofやfor inは構文として実行していましたが、forEachはArray型の配列変数のメソッドとして実行します。

Google Apps Script(GAS)でforEach文を使った繰り返し処理のサンプルコードを解説します。

function myFunction3() {
  //forEachの処理で使う点数の配列を定義
  const scores = [60,70,80,65,90];
  //forEachメソッドで配列からひとつずつ要素を取得
  scores.forEach(function(score){
    //取得した配列要素をログ出力
    console.log(score);
  });
}

for of文のサンプルコードと同じように配列の値を変数に格納し、ログ出力できています。

forEachはArray型の配列で利用できるメソッドで、オブジェクトでは利用できないので注意が必要です。

forEachは非推奨のメソッドに

forEachメソッドはネットなどで見ると、近年はあまり利用しないよう記述されていることが多いです。

forEachを実行するパターンについてはfor of文で代替することができます。

さらにforEachは配列オブジェクトのメソッドなので、breakやcontinueといった処理中断やスキップができません。

そのため、新しくGASのスクリプトを書く際はforEachではなく、for…ofがオススメです。

配列ならfor of、オブジェクトならfor inの使い分け

forEachは非推奨のため、基本のfor文に加えてfor of文とfor in文を使いましょう。

では、for of文とfor in文の使い分けはどのようにすればよいでしょうか。

使い分けの基準は色々ありますが、繰り返し処理するデータの形式が基準に挙げられます。

for of文は配列からデータを取り出したいときに用います。

それに対し、for in文はオブジェクト(連想配列)からデータを取り出したいときに用います。

配列ならfor of、オブジェクトならfor inという使い分けが基本です。

まとめ・終わりに

今回、for文の派生形の繰り返し処理であるfor of文、for in文、forEachを紹介しました。

for of文は配列のデータ全て処理するのに適しており、for文よりもシンプルな記述が可能です。

for in文はオブジェクトのキーを取り出し、キーの数だけ繰り返し実行されます。

forEachもfor of文に近い記述ですが、非推奨のメソッドとなっているので、for ofを使うのがオススメです。

for文でも同様の処理を実装することはできますが、このように配列を処理する場合はfor of、オブジェクトを処理する場合はfor inと使い分けて活用しましょう。

for ofやfor in、forEachも含めたGASで使える繰り返しループについて以下のの記事でまとめています。