【GAS】配列に使えるメソッドまとめ
GASではプログラムを効率よく記述するために配列操作が大きな役割を果たします。この記事では配列(Arrayオブジェクト)に使えるメソッドのうち特に便利なものをご紹介します。
GASにおける配列操作の重要性
配列とは
配列は変数の一つで、通し番号(「インデックス」と呼ばれます)を付けた複数の値を扱えるようにしたものです。配列があることで、一つの変数名を用いて複数の値を扱うことができるようになります。
let array = ['apple', 'orange', 'grape']; // 文字列の要素を3つを持つ配列
配列そのものの操作方法については下記の記事で詳しく解説を行っています。
GASで配列操作が重要な理由
GASは様々なGoogleサービスと連携してデータ処理を行える点で非常に優れています。しかし、処理速度は他の言語と比べて早いわけではなく、サービス連携して処理を行う際の制約が大きかったりもします。
例えば、スプレッドシートのデータを取得したり書き出す操作を行うためにスプレッドシートAPIを使っていますが、APIを使えば使うほどスクリプトの実行速度が遅くなります。(一回の実行で処理時間が6分を超えるとタイムアウトエラーでスクリプトの処理が実行できません。これを俗に「Google Apps Scriptの6分の壁」と呼びます)
タイムアウトが起きなくするには、例えばできるだけスプレッドシートサービスのAPIを呼び出す回数を少なくするようにスクリプトを組むことが重要です。このような効率の良いスクリプトを書くために配列がとても重要な役割を果たす、というわけです。
それでは配列に使える便利なメソッドをご紹介していきます。各メソッドについてより詳しく解説した記事も用意しているのでぜひあわせてご覧ください。
joinメソッド
配列要素を結合して一つの文字列を作成するメソッドです。メソッド呼び出しで元の配列は変更されます。
Array.join([sep])
- sep(任意):要素結合の際に結合部分に挿入される文字列
- 戻り値:要素結合後の文字列
let animal = ['cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey'];
console.log(animal.join('|')); //cat|dog|elephant|tiger|lion|monkey
//デフォルトでははカンマ','がセパレーターとなっている
console.log(animal.join()); //cat,dog,elephant,tiger,lion,monkey
console.log(animal.join(',')); //cat,dog,elephant,tiger,lion,monkey
//2つ以上の引数も可能
console.log(animal.join(['a',' '])); // cata, doga, elephanta, tigera, liona, monkey
//改行記号の「\n」を引数に入れると出力は改行される
console.log(animal.join('\n'));
// // cat
// // dog
// // elephant
// // tiger
// // lion
// // monkey
//二次元配列に適応すると最下層まで展開してから結合される
let animal_2 = [['cat', 'dog'], ['elephant', 'tiger'], ['lion', 'monkey']];
console.log(animal_2.join()); //cat,dog,elephant,tiger,lion,monkey
数字型は文字列として一緒に結合されますが、オブジェクト型は「object」という文字列で結合されます。
let array = ['cat', 'dog', 1, 3, {'name':'Bob', 'age':25}];
console.log(array.join()); // cat,dog,1,3,[object Object]
reverseメソッド
配列順序を反転させるメソッドです。メソッド呼び出しで元の配列は変更されます。
Array.reverse()
- 戻り値:要素の順序が反転した配列
let animal = ['cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey'];
console.log(animal.reverse()); //[ 'monkey', 'lion', 'tiger', 'elephant', 'dog', 'cat' ]
//二次元配列にrevers()した場合、最深層目までは反転されない
let animal_2 = [['cat', 'dog'], ['elephant', 'tiger'], ['lion', 'monkey']];
console.log(animal_2.reverse()); //[ [ 'lion', 'monkey' ], [ 'elephant', 'tiger' ], [ 'cat', 'dog' ] ]
let animal = ['cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey'];
let reversed_animal = animal.reverse();
//戻り値も、元の配列も順序は逆になる
console.log(animal); //[ 'monkey', 'lion', 'tiger', 'elephant', 'dog', 'cat' ]
console.log(reversed_animal); //[ 'monkey', 'lion', 'tiger', 'elephant', 'dog', 'cat' ]
//元の配列を参照している
//console.log(animal === reversed_animal); //true
//元の配列を参照しているので、片方に変更を加えるともう片方にも反映されている
reversed_animal.push('zebra')
console.log(animal); // [ 'cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey', 'zebra' ]
console.log(reversed_animal); //[ 'cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey', 'zebra' ]
sortメソッド
配列の順序を並び替えるメソッドです。並び替え順序は関数で定義できます。メソッド呼び出しで元の配列は変更されます。
Array.sort([func])
- func(任意):順列定義を関数として作成して適応可能。指定しなければ昇順。 ※詳細後述
- 戻り値:並び替え後の配列
let animal = ['cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey'];
console.log(animal.sort()); //[ 'cat', 'dog', 'elephant', 'lion', 'monkey', 'tiger' ]
console.log(animal); //[ 'cat', 'dog', 'elephant', 'lion', 'monkey', 'tiger' ]
pushメソッド
配列末尾に新たな要素を追加するメソッドです。メソッド呼び出しで元の配列は変更されます。
Array.push(val1 [, val2, val3, …])
- valN:配列末尾に追加したい1つ以上の要素
- 戻り値:要素追加後の配列の長さ
let animal = ['cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey'];
console.log(animal.push('giraffe')); //7
console.log(animal); // [ 'cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey', 'giraffe' ]
詳細を下記の記事で解説しているので是非ご覧ください。
popメソッド
配列末尾から要素を削除するメソッドです。メソッド呼び出しで元の配列は変更されます。
Array.pop()
- 戻り値:元の配列末尾から抜き出した要素
let animal = ['cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey'];
console.log(animal.pop()); //monkey
console.log(animal); // [ 'cat', 'dog', 'elephant', 'tiger', 'lion']
shiftメソッド
配列先頭から要素を削除するメソッドです。メソッド呼び出しで元の配列は変更されます。
Array.shift()
- 戻り値:元の配列先頭から抜き出した要素
let animal = ['cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey'];
console.log(animal.shift()); //cat
console.log(animal); // ['dog', 'elephant', 'tiger', 'lion', 'monkey']
unshiftメソッド
配列の先頭に新たな要素を追加するメソッドです。メソッド呼び出しで元の配列は変更されます。
Array.unshift(val1 [, val2, val3, …])
- val:配列先頭に追加したい要素1個以上
- 戻り値(integer):要素追加後の配列の長さ
let animal = ['cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey'];
console.log(animal.unshift('panda')); //7
console.log(animal); // ['panda', 'cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey']
spliceメソッド
配列を分割するメソッドです。元の配列に対して分割する位置と要素数を指定します。メソッド呼び出しで元の配列は変更されます。
Array.splice(from [, num] [, val1, val2, …])
- from(必須):分割対象の配列のインデックス(例:最初の要素を分割したければ「0」を指定)
※配列インデックスより大きい数が指定されたらspliceメソッドは機能しない。また、指定が負の値だった場合は配列の末尾から先頭に向かってカウントされる。 - num(任意):分割対象となるスタート位置からの要素数
※指定されないか配列インデックスより大きい数が指定された場合、スタート位置からの末尾までのすべての要素を分割対象に含める。また、指定が0または負の値だった場合は分割されない。 - valN(任意):配列に追加する要素
- 戻り値:分割した配列(または値)
//先頭から1つの要素を分割
let animal = ['cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey'];
console.log(animal.splice(0,1)); //[ 'cat' ]
console.log(animal); // [ 'dog', 'elephant', 'tiger', 'lion', 'monkey' ]
//先頭2番目から1つの要素を分割
let animal = ['cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey'];
console.log(animal.splice(1,1)); //[ 'dog' ]
console.log(animal); // [ 'cat', 'elephant', 'tiger', 'lion', 'monkey' ]
//先頭2番目から2つの要素を分割
let animal = ['cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey'];
console.log(animal.splice(1,2)); //[ 'dog', 'elephant' ]
console.log(animal); // [ 'cat', 'tiger', 'lion', 'monkey' ]
concatメソッド
配列同士を連結するメソッドです。元となっている配列に変更は加わりません。
array1.concat(array2 [, array3, …])
- arrayN:連結対象の配列
- 戻り値:連結後の配列
let animal = ['cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey'];
console.log(animal.concat(['ondor', 'eagle'])); //['cat','dog','elephant','tiger','lion','monkey','ondor','eagle']
console.log(animal); //[ 'cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey' ]
indexOfメソッド / lastIndexOfメソッド
配列の中に指定した文字列が存在するかを検索するメソッドです。indexOfメソッドは先頭から末尾にかけて、lastIndexOfメソッドは末尾から先頭にかけて検索をかけて最初に一致した要素の位置を返します。
Array.indexOf(searchPattern [,from])
Array.lastIndexOf(searchPattern [,from])
- searchPattern(必須):検索したい文字列
- from(任意):検索開始位置を指定するインデックス番号
※例:indexOf()で3つ目の要素から最後まで検索してほしければ「2」を指定
※指定位置が配列数より大きければ「-1」を返す。また指定位置が負の値であれば逆向きにカウントされる - 戻り値:検索した文字列が配列に含まれてればそのインデックス番号、なければ「-1」を返す
let animal = ['cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey'];
//配列先頭からすべての要素を検索、最初に一致した位置を返す
console.log(animal.indexOf('dog')); //1
//インデックス2(3番目の要素)から検索をかけると'dog'は一致しない
console.log(animal.indexOf('dog',2)); //-1
//末尾からカウントした位置から検索スタートした場合
//'lione' → 'monkey'の順で検索して検索終了となるため'tiger'は一致しない
console.log(animal.indexOf('tiger',-2)); //-1
//'lion'は一致する
console.log(animal.indexOf('lion',-2)); //4
indexOfメソッドとlastIndexOfメソッドは文字列にも配列にも適応可能です。
everyメソッド
配列のすべての要素が関数を満たすかどうかを判定するメソッドです。
Array.every(fnc)
- fnc(必須):配列の要素が満たす条件を表す関数
- ・value(必須):配列の各要素
- ・index(任意):各要素のインデックス
- ・array(任意):メソッドが呼び出された時の元の配列
- 戻り値:すべての要素が条件を満たせば「true」、一つでも満たさなければ「false」を返す
let animal = ['cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey'];
//文字列であるかどうかの判定
function isString(value) {
return typeof value === 'string'
}
console.log(animal.every(isString)); //true
//値に't'が含まれているかの判定
function includingT(value) {
return value.includes('t')
}
console.log(animal.every(includingT)); //false
someメソッド
配列の要素のうち少なくとも1つが関数を満たすかどうかを判定するメソッドです。
Array.some(fnc)
- fnc(必須):配列の要素が満たす条件を表す関数
・value(必須):配列の各要素
・index(任意):各要素のインデックス
・array(任意):メソッドが呼び出された時の元の配列 - 戻り値:一つの要素でも条件を満たせば「true」、すべて満たさなければ「false」を返す
let animal = ['cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey'];
//値に'c'が含まれているかの判定
function includingC(value) {
return value.includes('c')
}
console.log(animal.some(includingC)); //true
//数字であるかどうかの判定
function isString(value) {
return typeof value === 'number'
}
console.log(animal.some(isString));//false
filterメソッド
Array.filter(fnc)
- fnc(必須):配列の要素が満たす条件を表す関数
・value(必須):配列の各要素
・index(任意):各要素のインデックス
・array(任意):メソッドが呼び出された時の元の配列 - 戻り値:一つの要素でも条件を満たせば「true」、すべて満たさなければ「false」を返す
let animal = ['cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey'];
//値に'l'が含まれているかの判定
function includingL(value) {
return value.includes('l')
}
console.log(animal.filter(includingL)); //[ 'elephant', 'lion' ]
forEachメソッド
配列の各要素に対して関数を実行するメソッドです。
Array.forEach(fnc)
- fnc(必須):配列のすべての要素に逐次適応される関数
・value(必須):配列の各要素
・index(任意):各要素のインデックス
・array(任意):メソッドが呼び出された時の元の配列 - 戻り値:関数の実行結果
let animal = ['cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey'];
//各要素をログする関数
function logAnimal(value) {
console.log(value);
}
animal.forEach(logAnimal);
5:45:42 情報 cat
5:45:42 情報 dog
5:45:42 情報 elephant
5:45:42 情報 tiger
5:45:42 情報 lion
5:45:42 情報 monkey
mapメソッド
配列の各要素に対して関数を実行し、その実行結果を要素とした新たな配列を返すメソッドです。
Array.map(fnc)
- fnc(必須):配列のすべての要素に逐次適応される関数
・value(必須):配列の各要素
・index(任意):各要素のインデックス
・array(任意):メソッドが呼び出された時の元の配列 - 戻り値:関数の実行結果を要素とした配列
let animal = ['cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey'];
//各要素の先頭に'a 'を加える関数
function logAnimal(value) {
return 'a ' + value;
}
console.log(animal.map(logAnimal));//[ 'a cat', 'a dog', 'a elephant', 'a tiger', 'a lion', 'a monkey' ]
reduceメソッド / reduceRightメソッド
前の処理を引き継ぎながら関数の処理を実行するメソッドです。reduceメソッは配列の先頭から末尾に向かって処理を行います。reduceRightメソッドは配列の末尾から先頭に向かって処理を行います。
array.reduce(fnc, initialValue)
- fnc(必須):配列のすべての要素に逐次適応される関数
・previousOutput (必須): 直前処理の値
・value(必須):配列の各要素、処理実行時の値
・index(任意):各要素のインデックス
・array(任意):メソッドが呼び出された時の元の配列 - initialValue(任意):初期値、初回処理実行時のpreviousOutputの役割
※初回処理時には直前処理の値が存在しないため、initialValueを初期値として扱い処理を行う - 戻り値:関数の実行結果を要素とした配列
let array = [2,3,4];
//前の処理値を足し合わせる関数
function sum(previousOutput, value) {
return previousOutput + value;
}
console.log(array.reduce(sum)); //9
console.log(array.reduce(sum,2)); //11
//reduceメソッドとreduceRightメソッドの挙動の違い
let array = [2,3,4];
//前の処理値を足し合わせる関数
function sum(previousOutput, value) {
return previousOutput + value;
}
console.log(array.reduce(sum)); //9
console.log(array.reduceRight(sum)); //9
let array_2 = ['a','b','c'];
//前の処理値を結合する関数
function con(previousOutput, value) {
return previousOutput + value;
}
console.log(array_2.reduce(con)); //abc
console.log(array_2.reduceRight(con)); //cba
まとめ
配列(Arrayオブジェクト)に使える便利なメソッドをご紹介しました。