二次元配列の縦横を入れ替え・転置する方法 スプレッドシート GAS

2022年4月4日

配列イメージ画像 整列したクッキー

Javascript・GASで二次元関数の行・列を入れ替える、いわゆる転置するコードはいろいろなサイトでワンライナーとして紹介されています。

ただ、初心者には微妙にわかりにくそうなところもあったので使い方込みで解説。

スプレットシートでの実践例コードも掲載します。

行・列転置コードと使い方

コード自体はシンプル。関数に限っていえば一行で済みます。

/* ① 行・列を入れ替える転置関数 */
const transpose = a=> a[0].map((_, c) => a.map(r => r[c])); //

/* ② 二次元配列 */
let arr = [["ABC","DEF","GHI"],["あいう","えおか","きくけ"],["イロハ","ニヘホ","トチリ"]];

/* 
[ [ "123", "456", "789" ],
  [ "あいう", "えおか", "きくけ" ],
  [ "イロハ", "ニヘホ", "トチリ" ] ]
*/

/* ③ 行・列を入れ替えて変数arr2に格納 */
let arr2 = transpose(arr);

/* ④ 行・列を入れ替えて変数arrに再格納する場合 */
arr = transpose(arr);

/* 
[ [ "123", "あいう", "イロハ" ],
  [ "456", "えおか", "ニヘホ" ],
  [ "789", "きくけ", "トチリ" ] ]
*/

①が行と列を入れ替える転置関数。いろいろ省略して書けるアロー関数ってヤツ。

あとは①で作ったtranspose関数の引数に二次元配列を突っ込むだけ。

②は転置したい二次元配列を作ってるだけ。GASならgetValues()メソッドを使うことが多いですかね。

③は新しい行と列を入れ替えながら新しい変数に格納。

④はarrに転置しつつ再格納する使い方ですね。使い方に合わせてお好きな方。

以下、より具体的な転置コードの書き方です。

具体例な使用例

転値後のスプシの状態スクショ
スプシの縦横を転値するスクリプト

こちらはスプシ上の縦と横を入れ替えて置き換えるスクリプトの例

const ss = SpreadsheetApp.getActiveSpreadsheet(); // アクティブなスプレッドシートを取得
const sh = ss.getActiveSheet(); // アクティブなシートを取得

const transpose = a=> a[0].map((_, c) => a.map(r => r[c])); // 行・列を入れ替える転置関数

function transposeArr(){
const cellRange = sh.getRange(1 ,1 ,4 ,4);
let arr = cellRange.getValues(); // シート内容を二次元配列として格納
cellRange.clearContent(); // 取得内容を表から削除

/*
[ [ 1, 2, 3, 4 ],
  [ 5, 6, 7, 8 ],
  [ 9, 10, 11, 12 ],
  [ 13, 14, 15, 16 ] ]
*/

arr = transpose(arr); // arrの二次元配列を転置しつつ変数arrに再格納

sh.getRange(1 ,1 ,arr.length, arr[0].length).setValues(arr); // 行・列を入れ替えたデータを表に転記

/*
[ [ 1, 5, 9, 13 ],
  [ 2, 6, 10, 14 ],
  [ 3, 7, 11, 15 ],
  [ 4, 8, 12, 16 ] ]
}
*/

上記transposeArr関数を発動すると、縦横が入れ替わった内容が横っちょに転記されます。

転値後のスプシの状態スクショ
行と列の縦横を入れ換えて転記

この使い方だとclearContentメソッドで消す必要ないけど一応。実際には行と列の長さが違うこともあるので、取得したセルの内容は消す処理を入れた方が確実。

あとはcellRangeで取得している範囲をうまいこと調整してあげればいいですかね。

getMaxRowsとgetMaxColumnsメソッド使えばよさげ。

まとめ:Google Apps Scriptで二次元配列の縦横を入れ替え・転置する方法

特にGoogleスプレッドシートを扱うGASではgetValues()やsetValuesメソッドで表を格納したり表に転記できるため、二次元配列は非常によく使われます。

Javascriptはともかく、GASでは縦横転置専用メソッドあればいいのにって思う。

しかし残念ながら現状は存在しないので、上記コードをうまくご利用ください。