web-dev-qa-db-ja.com

Google AppsスクリプトのFor-eachループ

Google Apps Scriptを使用して、簡単なメールボットハンドラーを記述しています。
何かの配列があるとしましょう。
for-eachループを使用して配列を反復処理したい。
(配列を反復処理するたびにfor(var i=0;i<threads.length;i++)と書くのは面倒です。)
Google Appsスクリプトのfor-eachループを探しています。
すでに this の回答を見ましたが、おそらくforループが機能しないため、オブジェクトは未定義です。

// threads is a GmailThread[]
for (var thread in threads) {
  var msgs = thread.getMessages();
  //msgs is a GmailMessage[]
  for (var msg in msgs) {
    msg.somemethod(); //somemethod is undefined, because msg is undefined.
  }
}


(私はまだjavascriptが初めてですが、Javaのfor-eachループを知っています。)

13
phlaxyr
 Google Appsスクリプトの場合:
「for(item item in itemArray)」を使用する場合、
 'item'はループ全体のitemArrayのインデックスになります(0、1、2 、3、...)。
 
「for each(itemArrayのvar item)」を使用する場合、
 'item'はループ全体でitemArrayの値になります( ' item0 '、
' item1 '、' item2 '、' item3 '、...)。

例:

function myFunction() {
  var arrayInfo = [];

  arrayInfo.Push('Apple');
  arrayInfo.Push('orange');
  arrayInfo.Push('grapefruit');

  Logger.log('Printing array info using for loop.');
  for (var index in arrayInfo)
  {
    Logger.log(index);
  }
  Logger.log('Printing array info using for each loop.');
  for each (var info in arrayInfo)
  {
    Logger.log(info);
  }
}

結果:

 
 [17-10-16 23:34:47:724 EDT] forループを使用して配列情報を印刷します。
 [17-10-16 23:34:47:725 EDT] 0 
 [17-10-16 23:34:47:725 EDT] 1 
 [17-10-16 23:34:47:726 EDT] 2 
 [17-10-16 23:34:47:726 EDT]ループごとに配列情報を印刷します。
 [17-10-16 23:34:47:727 EDT] Apple 
 [ 17-10-16 23:34:47:728 EDT]オレンジ
 [17-10-16 23:34:47:728 EDT]グレープフルーツ
 
33
Branden Huggins

MDNからThe for...in statement iterates over the enumerable properties of an object, in original insertion order. For each distinct property, statements can be executed.だから、for...inステートメント。 forEach() を使用できます。これは、配列要素ごとに提供された関数を1回実行しますが、質問に関数が含まれていないので、多分それはあなたの望むものではありません。 map() は別のオプションですが、関数も必要です。map()メソッドは、呼び出し配列内のすべての要素で提供された関数を呼び出した結果で新しい配列を作成します。

3
Jason Fry