Google Apps Script(GAS)を使って、スプレッドシートの操作を自動化したり、Webサービスの連携を行ったりするとき、必ずと言っていいほど直面するのが「大量のデータ」の扱いです。
過去記事のスクリプトでは、一つの変数に一つの値(例えば「A」や「100」)しか入れることができませんでした。しかし、実際の業務では、ユーザー名や売上データ、日付など、たくさんの情報をまとめて処理する必要があります。
そこで登場するのが、今回のテーマである「配列(Array)」です。
配列は、複数のデータを一つの変数名でまとめて管理するための、プログラミングにおける基本的な「箱」の仕組みです。この配列をマスターすることで、あなたのGASスクリプトは劇的に強力になり、スプレッドシートの表形式のデータも簡単に扱えるようになります。
この記事では、GAS初心者の方に向けて、配列とは何か、どのように使うのかを、具体的なコード例を交えて丁寧に解説していきます。
承知いたしました。セクション間の水平線を削除し、WordPressへのコピーペーストに適した形式で、配列の基本に関する記事セクションを再度作成します。
配列の基本
配列(Array)の基本的な概念を理解しよう
プログラミングにおける「配列」とは、複数のデータを一つの変数名のもとで、順序立ててまとめて管理するための仕組みです。
これまでのGASのスクリプトでは、let name = '佐藤'; のように、一つの変数に一つの値しか代入できませんでしたが、配列を使うと、['佐藤', '鈴木', '林'] のように複数の値をまとめて格納できます。
配列の構成要素
配列を理解するために、以下の3つの重要な用語を覚えてください。
- 要素(Element):配列の中に入っている個々のデータ(値)のことです。上記の例では「佐藤」「鈴木」「林」がそれぞれ要素です。
- 添え字(Index):配列の要素一つ一つに振られた順番を示す番号のことです。この添え字を使って、配列の中から特定のデータを取り出します。【重要】 添え字は必ず「0」から始まります。
- 配列の長さ(Length):配列に入っている要素の総数(個数)のことです。
配列のイメージ
例えば、3つのデータが入った配列がある場合、そのイメージは下図のようになります。
| F0 | F1 | F2 |
| 要素(値) | ‘dog’ | ‘cat’ |
- この配列の「配列の長さ」は 3 です。
- 添え字は 0、1、2 の3つになります。
配列の宣言と値の取得方法
GAS(JavaScript)で配列を作る方法と、その中から特定のデータを取り出す方法を見てみましょう。
配列を宣言する書式
配列を作成するときは、値をカンマ(,)で区切り、全体を角括弧([])で囲みます。
let 変数名 = [値1, 値2, 値3, ...];
配列には、数値、文字列、真偽値(true/false)など、異なるデータ型の値を混ぜて入れることが可能です。また、配列の中に別の配列を入れる「2次元配列」を作ることもできます。
// 配列の宣言例
let animals = ['dog', 'cat', 'bird']; // 文字列の配列
let dataList = [1, true, 'Hello', null]; // 異なる型の値を格納
let emptyArray = []; // 空の配列も作成可能
配列から値を取得する
配列の中から特定の要素を取り出したいときは、「変数名」の後に角括弧([])をつけ、その中に添え字を指定します。
変数名[添え字]
添え字は0から始まるため、最初の要素を取得したい場合は [0]、2番目の要素なら [1] を指定します。
function func4_1_1_basic() {
// 配列の値を設定
let animals = ['dog', 'cat', 'bird'];
// 配列の値を出力(添え字を使って値を取得)
console.log('animals[0]=' + animals[0]); // 'dog'が得られます
console.log('animals[1]=' + animals[1]); // 'cat'が得られます
console.log('animals[2]=' + animals[2]); // 'bird'が得られます
}
このコードを実行すると、コンソールには以下の結果が出力されます。
animals[0]=dog
animals[1]=cat
animals[2]=bird
for文を使った配列の全要素へのアクセス
配列のすべての要素に対して順番にアクセスしたい場合、一つ一つ添え字を指定するのは大変です。そこでfor文を使うと、自動的にすべての要素を順番に処理できるため大変便利です。
このとき、繰り返し処理の回数を決めるために、配列の「長さ」を使います。配列の長さは、.length プロパティを使って取得できます。
function func4_1_2_for() {
let animals = ['dog', 'cat', 'bird'];
// 配列の長さを取得し、実行結果に出力
console.log('配列の長さ:' + animals.length); // 3
// for文を用いて配列の値を取得
// i は添え字(0から始まり、配列の長さの1つ手前まで繰り返す)
for (let i = 0; i < animals.length; i++) {
console.log('animals[' + i + ']=' + animals[i]);
}
}
for文の処理の流れ
let i = 0;:変数iを 0 で初期化します(最初の添え字)。i < animals.length;:iが配列の長さ(3)より小さい間、繰り返し処理を行います。iが 0 のとき:animals[0]が取得されます。iが 1 のとき:animals[1]が取得されます。iが 2 のとき:animals[2]が取得されます。
i++:処理が終わるたびにiが 1 ずつ増えます。iが 3 になると条件を満たさなくなり、繰り返し処理が終了します。
このコードを実行すると、コンソールには以下の結果が出力されます。
配列の長さ:3
animals[0]=dog
animals[1]=cat
animals[2]=bird
for…of文を使ったより簡単なアクセス
for文の代わりに、for...of文を使うと、配列の全要素へのアクセスをよりシンプルに記述できます。
for…of文の書式
for(変数 of 配列){
処理
}
for...of文は、配列の要素を先頭から一つずつ取り出し、指定した変数に代入しながらブロック内の処理を実行します。
function func4_1_3_for_of() {
let animals = ['dog', 'cat', 'bird'];
// for...of文で値を取得
for (let animal of animals) {
// animalには、'dog', 'cat', 'bird'が順番に入ります
console.log(animal);
}
}
このコードを実行すると、コンソールには以下の結果が出力され、すべての要素に簡単にアクセスできていることが分かります。
dog
cat
bird
配列の値を操作する(変更・追加・削除)
配列は、一度作成した後でも、その中の要素を変更したり、新しい要素を追加したり、不要な要素を削除したりできます。
ここでは、animals という配列を例に、配列がどのように変化していくかを確認してみましょう。
(1) 値の変更
配列の特定の要素を変更するには、添え字を使って値を直接代入します。
// 添え字が 2 の要素(3番目の要素)の値を 'lion' に変更
animals[2] = 'lion';
これにより、配列 animals の3番目の要素(’bird’)が ‘lion’ に変わります。
(2) 末尾への値の追加 (push)
配列の最後(末尾)に新しい要素を追加するには、push メソッドを使います。
// 配列の末尾に 'tiger' を追加
animals.push('tiger');
これを実行すると、配列 animals の末尾に ‘tiger’ が追加されます。
(3) 末尾の値の削除 (pop)
配列の末尾の要素を削除するには、pop メソッドを使います。
// 配列の末尾の要素を削除
let data = animals.pop();
pop メソッドは、削除した値を「戻り値」として返します。そのため、data のような変数にその値を代入して受け取ることができます。
(4) 先頭の値の削除 (shift)
配列の最初(先頭)の要素を削除するには、shift メソッドを使います。
// 配列の先頭の要素を削除
data = animals.shift();
shift も pop と同様に、削除した値を戻り値として返します。shift を実行すると、animals[1] だった要素が animals[0] になるなど、残された要素の添え字が自動的に繰り上がります。
サンプルコードと実行結果
これら一連の操作を、console.log で配列の中身を確認しながら見てみましょう。console.log の引数に配列を入れると、その時点での配列の要素がすべて出力されます。
// sample4-1.gs (func4_1_4)
function func4_1_4() {
// 配列の値を設定
let animals = ['dog', 'cat', 'bird'];
console.log(animals);
// 2番目の値を「lion」に変更
animals[2] = 'lion';
console.log(animals);
// 末尾に「tiger」 を追加
animals.push('tiger');
console.log(animals);
// 末尾を削除
let data = animals.pop();
console.log(animals);
console.log('削除されたデータ: ' + data);
// 先頭を削除
data = animals.shift();
console.log(animals);
console.log('削除されたデータ: ' + data);
}
この func4_1_4 を実行すると、コンソールには以下のように出力されます。
['dog', 'cat', 'bird']
['dog', 'cat', 'lion']
['dog', 'cat', 'lion', 'tiger']
['dog', 'cat', 'lion']
削除されたデータ: tiger
['cat', 'lion']
削除されたデータ: dog
配列が順番に操作されていく様子がわかります。
その他の主要な配列操作メソッド
push や shift のほかにも、配列を操作する便利なメソッドがあります。これらは非常によく使われます。
| メソッド名 | 処理内容 |
push(value) | 配列の末尾にvalueを追加 |
unshift(value) | 配列の先頭にvalueを追加 |
pop() | 配列の末尾の要素を削除し、その値を返す |
shift() | 配列の先頭の要素を削除し、その値を返す |
reverse() | 配列の順序を逆転させる |
配列とスプレッドシート
配列とスプレッドシートの連携操作
配列の基本を学んだところで、いよいよGASの真骨頂であるスプレッドシートの操作に応用してみましょう。配列は、スプレッドシートの行や複数のシートを扱う際に非常に強力な役割を果たします。
(1) 配列を使ってシートに行を追加する (appendRow)
スプレッドシートに新しい行を追加し、そこにデータを書き込む操作は非常によく使われます。Sheetオブジェクトの appendRow メソッドを使うと、配列を渡すだけで簡単に行を追加できます。
appendRow メソッドは、引数として渡された配列の要素を、シートのデータが入力されている最終行の「次」の行に、左から順番に(A列、B列、C列…)書き込みます。
// sample4-1.gs (func4_1_5)
function func4_1_5() {
// 1. アクティブなシートを取得
let sheet = SpreadsheetApp.getActiveSheet();
// 2. わかりやすくするためにシートの内容を一旦クリア
sheet.clear();
// 3. 配列のデータを新しい行として末尾に追加
sheet.appendRow(['ABC', 'DEF']);
// 4. 別の配列(要素数が違ってもOK)を追加
sheet.appendRow([1, 2, 3, 4, 5]);
}
この func4_1_5 を実行すると、アクティブなシートは以下のようになります。
- 1行目のA列に「ABC」、B列に「DEF」が入力されます。
- 2行目のA列に「1」、B列に「2」、C列に「3」、D列に「4」、E列に「5」が入力されます。
このように、appendRow を使えば、1行分のデータを配列として用意するだけで、簡単にシートに追記していくことができます。

(2) スプレッドシート内の全シートを配列で取得する (getSheets)
一つのスプレッドシートファイルには、複数のシート(「シート1」「シート2」など)を含めることができます。GASでは、これらのシート一覧も配列として取得できます。
(操作の前に、スプレッドシートの画面下部にある「+」(シートの追加)ボタンを2回クリックして、「シート1」「シート2」「シート3」のように、シートが3つある状態にしておきましょう。)
スプレッドシート内のすべてのシートを取得するには、以下の手順を踏みます。
SpreadsheetApp.getActiveSpreadsheet()で、現在開いているスプレッドシート全体(Spreadsheetオブジェクト)を取得します。- その
SpreadsheetオブジェクトのgetSheets()メソッドを呼び出します。
getSheets() メソッドは、そのスプレッドシートに含まれるすべてのシート(Sheet オブジェクト)を、配列の形で返します。
// sample4-1.gs (func4_1_6)
function func4_1_6() {
// 1. アクティブなスプレッドシート全体を取得
let spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
// 2. すべてのシートを「配列」として取得
let sheets = spreadSheet.getSheets();
// 3. lengthプロパティでシートの枚数を取得
console.log('シートの枚数:' + sheets.length);
// 4. for文で配列(sheets)をループ
for (let i = 0; i < sheets.length; i++) {
// 5. 配列の各要素(Sheetオブジェクト)のgetName()メソッドで名前を取得
console.log(sheets[i].getName());
}
}
この func4_1_6 を実行すると、コンソールには以下のように出力されます(シート名が「シート1」「シート2」「シート3」の場合)。
シートの枚数:3
シート1
シート2
シート3
このように、getSheets() で取得した「シートの配列」に対して for 文を使い、配列の各要素(sheets[i])が持つ getName() メソッドを呼び出すことで、すべてのシート名を順番に取り出すことができました。

Spreadsheetクラスの主なSheet関連メソッド
getSheets() のほかにも、スプレッドシート全体(Spreadsheet オブジェクト)に対してシートを操作する便利なメソッドがあります。
| メソッド名 | 処理内容 |
deleteActiveSheet() | アクティブな(現在表示中の)シートを削除する |
deleteSheet(sheet) | 引数に渡したSheetオブジェクトを削除する |
duplicateActiveSheet() | アクティブなシートを複製する |
getSheetByName(name) | nameで指定した名前のシートを取得する |
insertSheet(name) | nameで指定した名前のシートを新しく追加する |
2次元配列
2次元配列とは? スプレッドシートの「表」を扱う鍵
これまでに学んだ配列は、['dog', 'cat', 'bird'] のように、データが一列に並んだ「1次元配列」でした。これはスプレッドシートの「1行分」のデータを扱うのには便利です。
しかし、スプレッドシートは通常、複数の行と列で構成される「表」の形をしています。このような表形式のデータをGASでまとめて扱うために使うのが「2次元配列」です。
2次元配列の概念
2次元配列とは、簡単に言えば「配列の中に、さらに配列が入っている」入れ子構造の配列です。
- 外側の配列が、スプレッドシートの「行全体」を表します。
- 内側の配列が、各行に含まれる「列(セル)」のデータを表します。
2次元配列の宣言方法
2次元配列は、角括弧 [] の中に、さらに角括弧 [] で囲んだ配列をカンマ , で区切って記述します。
1行で書くこともできますが、スプレッドシートの表のように、行ごと(内側の配列ごと)に改行すると、視覚的に非常に分かりやすくなります。
// 視覚的に分かりやすい2次元配列の書き方
// 商品リスト(商品名, 単価, 在庫数)を配列で表現
// 3行 x 3列 のデータ
let products = [
['リンゴ', 120, 50], // 0行目
['バナナ', 100, 80], // 1行目
['オレンジ', 150, 30] // 2行目
];
2次元配列の値へのアクセス
1次元配列では 変数名[添え字] で値を取得しましたが、2次元配列では「行」と「列」の2つの添え字を使って値にアクセスします。
書式: 変数名[行の添え字][列の添え字]
1次元配列と同じく、行も列も添え字は0から始まります。
// sample4-2.gs (func4_2_1_basic)
function func4_2_1_basic() {
let products = [
['リンゴ', 120, 50], // 0行目
['バナナ', 100, 80], // 1行目
['オレンジ', 150, 30] // 2行目
];
// 0行目の配列全体を取得
// products[0] は ['リンゴ', 120, 50] という1次元配列
console.log(products[0]);
// 1行目(添え字1)の、2列目(添え字2)の値を取得
console.log(products[1][2]);
}
この func4_2_1_basic を実行すると、コンソールには以下のように出力されます。
['リンゴ', 120, 50]
80
products[1][2] は、まず products[1](1行目)の配列 ['バナナ', 100, 80] を参照し、その中の添え字 [2](3番目)の要素である「80」を取り出しています。
2次元配列の「高さ(行数)」と「幅(列数)」
2次元配列を for 文などで処理する際、その「行数」と「列数」を知る必要があります。これも .length プロパティで取得できます。
- 高さ(行数): 外側の配列の長さ(要素数)です。
products.lengthで取得できます。 - 幅(列数): 内側の配列の長さ(要素数)です。
products[0].length(0行目の配列の長さ)で取得できます。
// sample4-2.gs (func4_2_1_length)
function func4_2_1_length() {
let products = [
['リンゴ', 120, 50],
['バナナ', 100, 80],
['オレンジ', 150, 30]
];
// 高さ(行数)の取得
console.log('高さ:' + products.length);
// 幅(列数)の取得 (0行目の長さを確認)
console.log('幅:' + products[0].length);
}
このコードを実行すると、コンソールには以下のように出力されます。
高さ:3
幅:3
スプレッドシートの「表」と2次元配列でデータをやり取りする方法
2次元配列の最大のメリットは、スプレッドシートの複数セル(セル範囲、Range)のデータを非常に効率よく操作できる点にあります。
(1) 2次元配列をスプレッドシートに書き込む (for文の2重ループ)
まず、基本的な方法として、for文を2重に使って(入れ子にして)セルに1つずつ値を設定する方法を見てみましょう。
- 外側のループ(
row)で行を制御します。 - 内側のループ(
column)で列を制御します。
【注意】 スプレッドシートの行・列番号は1から始まりますが、配列の添え字は0から始まります。そのため、getRange でセルを指定する際は row + 1 や column + 1 のように「+1」のズレを調整する必要があります。
// sample4-2.gs (func4_2_2_nested_loop)
function func4_2_2_nested_loop() {
let products = [
['リンゴ', 120, 50],
['バナナ', 100, 80],
['オレンジ', 150, 30]
];
// アクティブなシートを取得しクリア
let sheet = SpreadsheetApp.getActiveSheet();
sheet.clear();
// forの2重ループで2次元配列のデータを設定
for (let row = 0; row < products.length; row++) {
for (let column = 0; column < products[row].length; column++) {
// (row + 1)行目、(column + 1)列目のセルに値を設定
sheet.getRange(row + 1, column + 1).setValue(products[row][column]);
}
}
}
この方法でも書き込めますが、データ量が多いと setValue を何度も呼び出すため、処理に時間がかかってしまいます。
(2) 2次元配列をスプレッドシートに一括で書き込む (setValues)
GASには、2次元配列をスプレッドシートのセル範囲に一括で書き込む、非常に高速な setValues メソッドが用意されています。
setValue(単数形)ではなく setValues(複数形)である点に注意してください。
手順は以下の通りです。
getRange(行番号, 列番号, 行数, 列数)で、書き込みたい範囲(Rangeオブジェクト)を取得します。setValues(2次元配列)メソッドで、その範囲に配列のデータを一括で流し込みます。
このとき、getRange で指定した範囲の「行数・列数」と、書き込む2次元配列の「高さ・幅」が完全に一致している必要があります。
// sample4-2.gs (func4_2_3_setValues)
function func4_2_3_setValues() {
let products = [
['リンゴ', 120, 50],
['バナナ', 100, 80],
['オレンジ', 150, 30]
];
// アクティブなシートを取得しクリア
let sheet = SpreadsheetApp.getActiveSheet();
sheet.clear();
// 1. 書き込みたい範囲を取得
// 1行目, 1列目 から、
// products.length (3行)分, products[0].length (3列)分の範囲
let range = sheet.getRange(1, 1, products.length, products[0].length);
// 2. 取得した範囲に2次元配列を一括で書き込む
range.setValues(products);
}
func4_2_2_nested_loop と同じ結果になりますが、こちらの setValues を使う方法が圧倒的に高速であり、GASの標準的な書き方です。
(3) スプレッドシートのデータを2次元配列で読み出す (getValues)
今度は逆に、スプレッドシートに入力されている「表」のデータを、GASのスクリプト内で2次元配列として取得してみましょう。
setValues の逆、getValues メソッドを使います。
getLastRow()(データが入っている最終行番号を取得)getLastColumn()(データが入っている最終列番号を取得)- 上記1, 2を使って
getRangeでデータ範囲をすべて取得します。 getValues()メソッドで、その範囲のデータを2次元配列として取得します。
(func4_2_3_setValues を実行して、シートにデータがある状態で試してください)
// sample4-2.gs (func4_2_4_getValues)
function func4_2_4_getValues() {
// アクティブなシートを取得
let sheet = SpreadsheetApp.getActiveSheet();
// 1. データが入力されている最終行と最終列を取得
let lastRow = sheet.getLastRow();
let lastColumn = sheet.getLastColumn();
// 2. 1行1列目から、データの最終行・最終列までの範囲を取得
let range = sheet.getRange(1, 1, lastRow, lastColumn);
// 3. 範囲内のデータを「2次元配列」として取得
let products = range.getValues();
// 4. 取得した2次元配列をコンソールに出力
console.log(products);
}
この func4_2_4_getValues を実行すると、コンソールには setValues で設定した配列とまったく同じ形式の、2次元配列が出力されます。
[['リンゴ', 120, 50], ['バナナ', 100, 80], ['オレンジ', 150, 30]]
getValues と setValues を使いこなすことが、GASでスプレッドシートのデータを自在に操るための鍵となります。
まとめ:配列をマスターしてGAS自動化の幅を広げよう
お疲れ様でした。今回は、GASで大量のデータを扱うための必須知識である「配列(Array)」について、その基本からスプレッドシートでの応用までを解説しました。
配列は複数のデータを一つの変数で管理できる仕組みであり、「添え字(インデックス)」が0から始まることが重要なポイントでした。for文やfor...of文を使えば、配列のすべての要素に簡単にアクセスできます。
GASでスプレッドシートを操作する上で、appendRowによる行追加は頻繁に使う便利な機能です。さらに、スプレッドシートの「表」データを扱うための「2次元配列」と、getValues()による一括取得、setValues()による一括書き込みは、最も重要で強力なテクニックです。
配列、特に2次元配列を使いこなせるようになれば、スプレッドシート上のデータを自由自在に読み書きできるようになり、自動化できる範囲が劇的に広がります。ぜひ今回学んだことを活用して、あなただけの業務効率化スクリプト作成に挑戦してみてください。











