2019年時点で Google Apps Script の JavaScript 構文は若干古く 繰り返し構文でどれが使えてどれが使えないのかイマイチわからなかったりします。
幾つか動かしてみましたので、結果を記載します。


for each...in

  • 実行したスクリプト

    function forEachTest() {
      var sum = 0;
      var obj = [1,2,3];
      for each (var item in obj) {
          sum += item;
      }
      Logger.log(sum);
    }
    
    function forEachObjectTest() {
      var sum = 0;
      var obj = {prop1: 5, prop2: 13, prop3: 8};
      for each (var item in obj) {
          sum += item;
      }
      Logger.log(sum);
    }
    

  • 実行結果

    実行を開始しています
    Logger.log([6.0, []]) [0 秒]
    実行が無事終了しました(合計ランタイム 0.002 秒)
    
    実行を開始しています
    Logger.log([26.0, []]) [0 秒]
    実行が無事終了しました(合計ランタイム 0.002 秒)
    

for each...in実行できました。
ただ、この構文は将来的に廃止される可能性があるため、他の構文を使った方がいいです。
最新版の Chrome で上記 JavaScript を実行すると、以下のエラーとなります。

Uncaught SyntaxError: Unexpected identifier     


for..in

  • 実行したスクリプト

    function forInTest() {
      var string1 = "";
      var object1 = [4, 5, 6];
    
      for (var i in object1) {
        string1 += object1[i];
      }
      Logger.log(string1);
    }
    
    function forInObjectTest() {
      var string1 = "";
      var object1 = {a: 1, b: 2, c: 3};
    
      for (var property1 in object1) {
        string1 += object1[property1];
      }
      Logger.log(string1);
    }
    

  • 実行結果

    実行を開始しています
    Logger.log([456, []]) [0 秒]
    実行が無事終了しました(合計ランタイム 0.002 秒)
    
    実行を開始しています
    Logger.log([123, []]) [0 秒]
    実行が無事終了しました(合計ランタイム 0.003 秒)
    

for..in実行できました。 この構文はなくならないので、 for each...in使うのであればこちらを使った方がいいです。
ただ、MDN のドキュメントに記載がありますが、配列の場合に、index の順序性が担保されない可能性があるとのことです。
index の順序性が重要な場合は、他の構文を使用するのが良いかと思います。


for...of

  • 実行したスクリプト

    function forOfTest() {
      var iterable = [10, 20, 30];
      for (var value of iterable) {
        value += 1;
        Logger.log(value);
      }
    }
    

  • 結果
    エラーになりました。これは構文がサポートされていないようです。

    for-loop 初期化子の後に ; がありません。(行 41、ファイル「main」)
    


for

これは流石に動きます。

  • 実行したスクリプト

    function forTest() {
      for (var i = 0; i < 9; i++) {
        Logger.log(i);
      }
    }
    

  • 実行結果

    実行を開始しています
    Logger.log([0.0, []]) [0 秒]
    Logger.log([1.0, []]) [0 秒]
    Logger.log([2.0, []]) [0 秒]
    Logger.log([3.0, []]) [0 秒]
    Logger.log([4.0, []]) [0 秒]
    Logger.log([5.0, []]) [0 秒]
    Logger.log([6.0, []]) [0 秒]
    Logger.log([7.0, []]) [0 秒]
    Logger.log([8.0, []]) [0 秒]
    実行が無事終了しました(合計ランタイム 0.006 秒)
    


do...while

これも流石に動きます。
* 実行したスクリプト

function doWhileTest() {
  var i = 0;
  do {
    i += 1;
    Logger.log(i);
  } while (i < 5);  
}

  • 実行結果
    実行を開始しています
    Logger.log([1.0, []]) [0 秒]
    Logger.log([2.0, []]) [0 秒]
    Logger.log([3.0, []]) [0 秒]
    Logger.log([4.0, []]) [0 秒]
    Logger.log([5.0, []]) [0 秒]
    実行が無事終了しました(合計ランタイム 0.004 秒)
    

Google Apps Script でどの 繰り返し構文を使うか?

個人的には、for..in 文 で書こうかなと思います。
順序性が重要な箇所は、for 文で、使わないといけない場合は、do...while記載するかと思います。


参考

記事作成時、以下を参考にしました。

以上です。

コメント