二次元配列の特定の「列(要素)」を削除する方法〜Google Apps Script〜

メモ

はじめに

この記事では、二次元配列で特定の列(にあたる値・要素)を削除する方法をお伝えします。

記事内では内容を頭の中でイメージをしやすいように、二次元配列をSpreadsheetに保存した(setValues)場合を含めてご紹介します。

注意点:

本記事はGoogle Apps Scriptにおける二次元配列の操作についての記事であり、Spreadsheetの列操作(列の削除など)の記事ではない点に注意してください。

また、特定の列(配列番号)を指定する方法での削除を紹介するため、配列操作における”配列の最初の要素を削除するメソッド shift() ” や “配列の最後の要素を削除するメソッド pop()“の使い方は説明しません。

ゴールイメージ

削除前

削除前_削除する列
var beforeArray = [["00", "01", "02", "03", "04", "05" ],
["10", "11", "12", "13", "14", "15" ],
["20", "21", "22", "23", "24", "25" ],
["30", "31", "32", "33", "34", "35" ],
["40", "41", "42", "43", "44", "45" ],
["50", "51", "52", "53", "54", "55" ]];

赤色マーカー部分を削除します。

削除後

削除後_after_array 列を削除後、列が左に詰まるイメージ
var afterArray = [["00", "01", "02", "04", "05" ],
["10", "11", "12", "14", "15" ],
["20", "21", "22", "24", "25" ],
["30", "31", "32", "34", "35" ],
["40", "41", "42", "44", "45" ],
["50", "51", "52", "54", "55" ]];

*削除後、黄色マーカー部分の配列が移動します。

実装方法とそのポイント

実装のポイント

削除したい要素の”配列番号”を指定する。

“配列番号をいかに取得するか” が実装のポイントの1つ目です。今回は、指定の配列番号を固定して紹介していますが、実務では複数の特定列を指定するケースがあります。ご参考に、配列番号を取得する際に参考となるメソッドは、indexOf() や lastIndexOf() などがあります。

特定の配列番号の要素を削除するメソッドは、「splice()」を使用する。

特定の配列番号の要素を削除するために、spliceのメソッドを使用します。ご参考に配列の最初は shift()、配列の最後は pop()などのメソッドがあります。

splice() メソッドの使い方

var beforeArray = ["00", "01", "02", "03", "04", "05"];  ← 赤色マーカー部分を削除する
//"03" の配列番号は 3 である。

var afterArray = beforeArray.splice(3, 1);
//output → console.log(afterArray) ["00", "01", "02", "04", "05"];

// 第一引数: start 3 は 削除したい配列番号を指定する。
//第二引数: deleteCount 1 は 第一引数の値から何個の値を削除するか指定する。
//第三引数: item は 省略可能で、省略した場合は要素の削除となる。
//なお、引数を指定した場合は該当の要素を指定した引数に置き換える。

参考:MDM Web Docs splice() メソッド

実装コード

先述のとおりですが、列の削除前の二次元配列です。

var beforeArray = [["00", "01", "02", "03", "04", "05" ],
["10", "11", "12", "13", "14", "15" ],
["20", "21", "22", "23", "24", "25" ],
["30", "31", "32", "33", "34", "35" ],
["40", "41", "42", "43", "44", "45" ],
["50", "51", "52", "53", "54", "55" ]];

二次元配列の削除の実装例のコードをこちら。

//実行コード
var afterArray = beforeArray.map(function(x) {
  return x.splice(3, 1)
});
//console.log(afterArray);
//[["00", "01", "02", "04", "05" ],
//["10", "11", "12", "14", "15" ],
//["20", "21", "22", "24", "25" ],
//["30", "31", "32", "34", "35" ],
//["40", "41", "42", "44", "45" ],
//["50", "51", "52", "54", "55" ]];

応用編: 複数の特定の列(要素)を削除する方法

注意点

二次元配列の列にあたる要素を複数削除する場合、削除の都度、削除した要素より後ろにある要素の配列番号が減少する点です。これは、splice() メソッドは破壊的メソッドであるためです。例えば、下記のコードの黄色部分に注目するとわかりやすいので紹介します。

//実行コード
var afterArray = beforeArray.map(function(x) {
  return x.splice(3, 1)
});

//console.log(beforeArray); 

//[["00", "01", "02", "04", "05" ],
//["10", "11", "12", "14", "15" ],
//["20", "21", "22", "24", "25" ],
//["30", "31", "32", "34", "35" ],
//["40", "41", "42", "44", "45" ],
//["50", "51", "52", "54", "55" ]];

→ beforeArray と afterArray は同じ配列となる。

削除前は、04 や 14 の配列番号は「4」、 05 や 15 の配列番号は「5」であることに対して、削除後は、 04 や 14 の配列番号は「3」、 05 や 15 の配列番号は「4」となります。複数の列を削除する場合は注意してください。

実装コード

// 削除したい列の配列番号を配列で指定する。
var deleteArray = [3, 4];

// 赤色部分が削除したい列。
var beforeArray = [["00", "01", "02", "03", "04", "05" ],
["10", "11", "12", "13", "14", "15" ],
["20", "21", "22", "23", "24", "25" ],
["30", "31", "32", "33", "34", "35" ],
["40", "41", "42", "43", "44", "45" ],
["50", "51", "52", "53", "54", "55" ]];

//二次元配列の列(要素)の削除の処理
for(var i = 0; i < deleteArray.length; i++ ) {
  // 削除の都度、配列番号を減少させる。
  var deleteIndex = deleteArray[i] - i;

  //配列要素の削除の処理を実施する。
  var afterArray = beforeArray.map(function(x) {
    return x.splice(deleteIndex, 1)
  });
}

console.log(afterArray);
//[["00", "01", "02", "05" ],
//["10", "11", "12", "15" ],
//["20", "21", "22", "25" ],
//["30", "31", "32", "35" ],
//["40", "41", "42", "45" ],
//["50", "51", "52", "55" ]];

コメント

タイトルとURLをコピーしました