配列の検索方法色々~Google Apps Scriptを使って~

はじめに

プログラムを学び始めると配列と呼ばれるものが出てきます。
配列まではわかったけど、多次元配列になると苦手意識を持っている方や、使用の用途がよくイメージできない方などもいらっしゃる方もいるかもしれません。
本記事では実際にプログラムを追いながら、配列の検索方法や特徴を見ていきます。
実際にプログラムを開発する場合、配列を目にすることはたくさんあります。
是非一読して頂き理解を深めてください。

配列とは

ご存じの方も多いかもしれませんが、簡単に説明しておくと、配列とは変数の集合体と考えることができます。
その変数は値を入れておく箱と考えることができますが、この箱が複数横並びにくっついているイメージです。
それぞれの箱は別もので、任意に箱の中身を取得したい場合は、番号を指定してあげます。この番号のことを「添え字」や「インデックス」と呼びます。また箱の中身を「要素」と呼びます。
上記で挙げた基本的な配列以外に「二次元配列」と呼ばれるものや、「連想配列」と呼ばれるものがあります。
「二次元配列」や「連想配列」はより複雑なデータ構造で要素を保持しますので、基本的な配列とは検索の仕方も異なってきます。
本記事では、基本的な配列、二次元配列、連想配列を順番に実際にコードを打ちながら説明していきます。
基本的な配列に関しては十分わかっている方は、二次元配列や連想配列から読んでみてください。

基本的な配列

ではさっそく配列検索してみましょう。
その前にGASでスクリプトを用意しましょう。
手順は以下になります。

1.Google Driveにログイン。

2.左上の「新規」から「その他」を押下。
3.「Google Apps Script」を選択します。
4.新規のプロジェクトが表示されます。

function myFunction() {

}

この波括弧の中にプログラムを書いていきます。
配列を宣言する場合は、以下のように宣言します。

var array = []

値を入れましょう。

[コード]
function myFunction() {
var array = [“test1”, “test2”, “test3”];
Logger.log(array);
}

結果は以下になります。
※ログを確認する場合は、Ctrl+enterを押します。

[ログ]
[20-10-06 19:40:40:511 PDT] [test1, test2, test3]

arrayの中に値が入っているのがわかります。
では、array配列の中を検索していきましょう。
今回はtest2を取得していきます。
以下のように記述します。

[コード]
function myFunction() {
var array = [“test1”, “test2”, “test3”];
Logger.log(array[1]);
}

結果は以下になります。

[ログ]
[20-10-07 11:42:33:459 JST] test2

無事test2が取得されています。
この時注意して欲しいのが、添字です。
「配列とは」で説明したように、配列を検索する時は、必ず添字を指定してあげる必要があります。
添え字の最初の番号は1ではなく0になります。
従ってtest1, test2, test3からtest2を指定する場合は、1となります。
検索からやや脱線しますが、ついでに配列の操作についても触れておきます。

配列を操作する方法

Shift

Shiftメソッドを使うと、配列の最初の要素を取得することができます。
取得した際に配列内から消えてしまいすので、削除したい場合にも使えます。

[コード]
function myFunction() {
var array = [“test1”, “test2”, “test3”];
var element = array.shift();
Logger.log(element);
}

[ログ]
[20-10-07 12:58:52:541 JST] test1

Pop

Popメソッドは逆に配列の最後を取得することができます。
取得した際に配列内から消えてしまいすので、削除したい場合にも使えます。

[コード]
function myFunction() {
var array = [“test1”, “test2”, “test3”];
var element = array.pop();
Logger.log(element);
}

[ログ]
[20-10-07 13:27:44:827 JST] test3

Length

Lengthプロパティを使うと配列の要素数が取得できます。
Lengthプロパティは配列の添え字にプラス1した数を返します。
ですので、ここでは3が返されます。

[コード]
function myFunction() {
var array = [“test1”, “test2”, “test3”];
var element = array.length;
Logger.log(element);
}

[ログ]
[20-10-07 13:38:14:952 JST] 3.0

for文(繰り返しを使った操作)

最後にfor文を使った検索方法を紹介します。
今回は配列の要素数のすべてを取得するパターンとしますが、for文内に条件などを追加することによって、様々な操作が可能となります。
良く使いますので、是非覚えておくと良いでしょう。

[コード]
function myFunction() {
var array = [100, 200, 300];

for (var i = 0; i < array.length; i++) {
Logger.log(array[i]);
}
}

[ログ]
[20-10-07 14:53:47:116 JST] 100.0
[20-10-07 14:53:47:118 JST] 200.0
[20-10-07 14:53:47:119 JST] 300.0

for文の繰り返しの条件に上記で使ったlengthプロパティを使っています。
先程言った通りlengthで取得される要素数は添え字に+1した形になりますので、漏れなくすべての要素を対象とすることが可能になります。

配列の基本的な検索方法や操作方法を学びました。
他にもUnshiftやPush、Mapなどのメソッドがあります。
次に二次元配列を見ていきます。

二次元配列

二次元配列は以下のように宣言します。

var array = [[],[]];

棒括弧の中に棒括弧を入れ子にして、カンマを挟んで設置します。
要素を入れてみましょう。

[コード]
function myFunction() {
var array = [[“りんご”,”バナナ”,”いちご”],[“きゅうり”,”トマト”,”レタス”],[“牛”,”豚”,”鳥”]];
Logger.log(array[0][1]); //
}

[ログ]
[20-10-07 15:18:37:254 JST] バナナ

二次元配列は、配列の中に、さらに配列がある「入れ子構造」になっています。
今回指定したarray[0][1]の[0]は大枠の配列の添え字を指定しています。

[“りんご”,”バナナ”,”いちご”]の果物を指定したい場合は、添え字0
[“きゅうり”,”トマト”,”レタス”]の野菜から指定したい場合は、添え字1
[“牛”,”豚”,”鳥”]の肉から指定したい場合は、添え字2

のようになります。

さらに次のarray[0][1]の[1]では野菜群の中の添え字1を指定し、バナナを取得しています。
二次元配列は、表データとの相性が良く、データベース等からデータを取得する場合などに使います。
GASでやった場合は以下になります。


[コード]

function myFunction() {
const sheet = SpreadsheetApp.getActiveSheet();
const data = sheet.getRange(2, 1, sheet.getLastRow() – 1,sheet.getLastColumn()).getValues();
console.log(data);
}

[ログ]

[20-10-06 23:40:19:982 PDT] [ [ ‘A太’, ‘東京’, ‘男’, ‘DOCOMO’ ],
[ ‘B男’, ‘東京’, ‘男’, ‘AU’ ],
[ ‘C子’, ‘神奈川’, ‘女’, ‘SOFTBANK’ ],
[ ‘D郎’, ‘東京’, ‘男’, ‘AU’ ],
[ ‘E次郎’, ‘神奈川’, ‘男’, ‘DOCOMO’ ],
[ ‘F美’, ‘東京’, ‘女’, ‘AU’ ],
[ ‘G助’, ‘千葉’, ‘男’, ‘SOFTBANK’ ],
[ ‘H子’, ‘千葉’, ‘女’, ‘DOCOMO’ ],
[ ‘I郎’, ‘東京’, ‘男’, ‘SOFTBANK’ ],
[ ‘Jアン’, ‘埼玉’, ‘男’, ‘DOCOMO’ ] ]

1行づつ配列になっており、その中に要素が格納された二次元配列になっているのが確認できます。
御覧の通り、上記のように表データを取得することができますので、ここから条件などを入れて、必要なデータを抽出したり、加工することができます。
試しに性別が「男」の人を抽出してみましょう。

[コード]
function myFunction() {
const sheet = SpreadsheetApp.getActiveSheet();
const data = sheet.getRange(2, 1, sheet.getLastRow() – 1,sheet.getLastColumn()).getValues();
for(let i = 0; i < data.length; i++) {
if(data[i][2]===”男”){
console.log(data[i]);
}
}
}

[ログ]
[20-10-07 16:21:00:673 JST] [ ‘A太’, ‘東京’, ‘男’, ‘DOCOMO’ ]
[20-10-07 16:21:00:675 JST] [ ‘B男’, ‘東京’, ‘男’, ‘AU’ ]
[20-10-07 16:21:00:676 JST] [ ‘D郎’, ‘東京’, ‘男’, ‘AU’ ]
[20-10-07 16:21:00:678 JST] [ ‘E次郎’, ‘神奈川’, ‘男’, ‘DOCOMO’ ]
[20-10-07 16:21:00:679 JST] [ ‘G助’, ‘千葉’, ‘男’, ‘SOFTBANK’ ]
[20-10-07 16:21:00:680 JST] [ ‘I郎’, ‘東京’, ‘男’, ‘SOFTBANK’ ]
[20-10-07 16:21:00:681 JST] [ ‘Jアン’, ‘埼玉’, ‘男’, ‘DOCOMO’ ]

性別が男のものが取得されました。
簡単にポイントだけ説明しておきますと、for文の条件は先ほどのlengthを使い第一配列群の添え字の数だけループさせています。
if文で、男の場合にログ出力していますが、この時第2配列の添え字は固定で”2″としています。
性別列は表の3列目で固定されているからです。

以上が二次元配列となります。

連想配列

最後に連想配列を見ていきましょう。
連想配列とは何かと言うと、KeyとValueによってデータを保持するデータ構造になります。
基本的な配列では、言わば”添え字とValue”でデータを保持するデータ構造と言えます。
連想配列の場合、要素を取り出す際には、添え字ではなく、Keyを指定する必要があります。

[コード]
function myFunction() {
  var hash = {名前: ‘ハンバーグ’, 分類: ‘洋食’, 主成分: ‘タンパク質’};
console.log(hash[“名前”]);
}

[ログ]
[20-10-07 16:53:22:767 JST] ハンバーグ

上記例では、Keyにあたるのが「名前、分類、主成分」となります。
コロンでつないでValueを設定します。また基本的な配列とは違い、波括弧でKeyとValueを囲むので注意が必要になります。

連想配列はJsonと呼ばれるデータ形式で使われます。
JsonはWebサービスと連携する場合に良く使われるデータ形式で、深く複雑なデータ構造を表現することができます。
WebAPIなどでサービスにリクエストを送るとJson形式でデータを返すことができます。
Web系に従事されている方やこれから進みたい方は是非使い方を覚えておくと良いでしょう。
最後にJsonのデータを想定してより複雑な連想配列を見ていきましょう。

[コード]
function myFunction() {
var Json = {
オムライス: {
分類: ‘洋食’,
主成分: ‘炭水化物’
},
サラダ: {
分類: ‘洋食’,
主成分: {
野菜: ‘繊維’,
ドレッシング: ‘油’
}
},
牛丼: {
分類: ‘和食’,
主成分: {
具: ‘タンパク質’,
ご飯: ‘炭水化物’
}
}
};

console.log(Json[“サラダ”][“主成分”][“ドレッシング”]);

}

[ログ]
[20-10-07 17:21:27:949 JST] 油

縦長に書きましたが、要は波括弧毎にKeyとValueが設定されていますので、それを大枠からKeyの値を検索していくイメージです。
実際は、連想配列と基本的な配列が混ざった場合もあります。
波括弧の場合は、Keyを指定し、棒括弧は添え字を指定すれば良いです。

最後に

いかがでしたでしょうか?
基本的な配列、二次元配列、そして連想配列の検索方法や特徴を見てきました。
大きな開発現場などでは大量のデータや複雑なデータ構造を扱う場合が多くなり、配列も複雑になってきます。
そんな場合でもデータ量に惑わされず、本記事で紹介した基本的な検索方法を実践して頂けたら幸いです。