【GAS超入門】配列の基本

Google Apps Script(GAS)を使って、スプレッドシートの操作を自動化したり、Webサービスの連携を行ったりするとき、必ずと言っていいほど直面するのが「大量のデータ」の扱いです。

過去記事のスクリプトでは、一つの変数に一つの値(例えば「A」や「100」)しか入れることができませんでした。しかし、実際の業務では、ユーザー名や売上データ、日付など、たくさんの情報をまとめて処理する必要があります。

そこで登場するのが、今回のテーマである「配列(Array)」です。

配列は、複数のデータを一つの変数名でまとめて管理するための、プログラミングにおける基本的な「箱」の仕組みです。この配列をマスターすることで、あなたのGASスクリプトは劇的に強力になり、スプレッドシートの表形式のデータも簡単に扱えるようになります。

この記事では、GAS初心者の方に向けて、配列とは何か、どのように使うのかを、具体的なコード例を交えて丁寧に解説していきます。

承知いたしました。セクション間の水平線を削除し、WordPressへのコピーペーストに適した形式で、配列の基本に関する記事セクションを再度作成します。

配列の基本

配列(Array)の基本的な概念を理解しよう

プログラミングにおける「配列」とは、複数のデータを一つの変数名のもとで、順序立ててまとめて管理するための仕組みです。

これまでのGASのスクリプトでは、let name = '佐藤'; のように、一つの変数に一つの値しか代入できませんでしたが、配列を使うと、['佐藤', '鈴木', '林'] のように複数の値をまとめて格納できます。

配列の構成要素

配列を理解するために、以下の3つの重要な用語を覚えてください。

  • 要素(Element):配列の中に入っている個々のデータ(値)のことです。上記の例では「佐藤」「鈴木」「林」がそれぞれ要素です。
  • 添え字(Index):配列の要素一つ一つに振られた順番を示す番号のことです。この添え字を使って、配列の中から特定のデータを取り出します。【重要】 添え字は必ず「0」から始まります。
  • 配列の長さ(Length):配列に入っている要素の総数(個数)のことです。

配列のイメージ

例えば、3つのデータが入った配列がある場合、そのイメージは下図のようになります。

F0F1F2
要素(値)‘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文の処理の流れ

  1. let i = 0;:変数 i を 0 で初期化します(最初の添え字)。
  2. i < animals.length;i が配列の長さ(3)より小さい間、繰り返し処理を行います。
    • i が 0 のとき: animals[0] が取得されます。
    • i が 1 のとき: animals[1] が取得されます。
    • i が 2 のとき: animals[2] が取得されます。
  3. i++:処理が終わるたびに i が 1 ずつ増えます。
  4. 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();

shiftpop と同様に、削除した値を戻り値として返します。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

配列が順番に操作されていく様子がわかります。

その他の主要な配列操作メソッド

pushshift のほかにも、配列を操作する便利なメソッドがあります。これらは非常によく使われます。

メソッド名処理内容
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つある状態にしておきましょう。)

スプレッドシート内のすべてのシートを取得するには、以下の手順を踏みます。

  1. SpreadsheetApp.getActiveSpreadsheet() で、現在開いているスプレッドシート全体(Spreadsheet オブジェクト)を取得します。
  2. その 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 + 1column + 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(複数形)である点に注意してください。

手順は以下の通りです。

  1. getRange(行番号, 列番号, 行数, 列数) で、書き込みたい範囲(Range オブジェクト)を取得します。
  2. 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 メソッドを使います。

  1. getLastRow()(データが入っている最終行番号を取得)
  2. getLastColumn()(データが入っている最終列番号を取得)
  3. 上記1, 2を使って getRange でデータ範囲をすべて取得します。
  4. 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]]

getValuessetValues を使いこなすことが、GASでスプレッドシートのデータを自在に操るための鍵となります。

まとめ:配列をマスターしてGAS自動化の幅を広げよう

お疲れ様でした。今回は、GASで大量のデータを扱うための必須知識である「配列(Array)」について、その基本からスプレッドシートでの応用までを解説しました。

配列は複数のデータを一つの変数で管理できる仕組みであり、「添え字(インデックス)」が0から始まることが重要なポイントでした。for文やfor...of文を使えば、配列のすべての要素に簡単にアクセスできます。

GASでスプレッドシートを操作する上で、appendRowによる行追加は頻繁に使う便利な機能です。さらに、スプレッドシートの「表」データを扱うための「2次元配列」と、getValues()による一括取得、setValues()による一括書き込みは、最も重要で強力なテクニックです。

配列、特に2次元配列を使いこなせるようになれば、スプレッドシート上のデータを自由自在に読み書きできるようになり、自動化できる範囲が劇的に広がります。ぜひ今回学んだことを活用して、あなただけの業務効率化スクリプト作成に挑戦してみてください。

Dチームメルマガ登録|eBOOK「逆引きAIツールブック」プレゼント中


AIやマーケティングに関する情報を不定期配信中
eBOOK「逆引きAIツールブック」プレゼント中です
↓ ↓ ↓

Dチームメルマガはこちら>>>

 

ABOUT US
山田 どうそん
受講生3万人以上のオンラインビジネス構築のやり方を教える講師|6年以上サブスクメンバーシップのコミュニティを運営|オンラインビジネスで安定したコミュニティシステムの作り方を教えている|1人でも多くの人にオンラインビジネスで物心両面の豊かさを手に入れられるようにディレクションできたらと思っている