UnityとかOpenToonzとかUberEATSとかOpenStreetMapとか

Googleスプレッドシートで表を1列(1行)に変換する

  Googleスプレッドシートの表のセルの要素を1列に表示させます。Excelでもおそらく同様にできます。

 必要な関数は以下の通り。

INDEX(参照, [行], [列]) 参照(範囲)の指定行、列の要素を返します
ROUNDUP(値, [桁数]) (数)値を指定桁数で切り上げます
ROW([セル参照]) 指定セルの行数を返します
MOD(被除数, 除数) 除算の剰余を返します

 

 5×3の表があります。

 左上のセルから横の順に要素を取り出したいと思います。

f:id:taidachika:20180413115440j:plain

  

 まず、

=INDEX($A$1:$E$3, 

 のように範囲指定します。範囲をドラッグし、F4キーを押すことでセル固定できます。セル固定をしないと関数をコピペした際に参照範囲が勝手に更新されてしまいます。英数の前に$を入力するだけですので手入力でも構いません。

 

 次に何でもいいので行によって1ずつ増加する数が欲しいため、ROW(A1)を用います。B1でもC1でも構いません。参照範囲の列数で割った商を切り上げたものが指定する行です。

=INDEX($A$1:$E$3, ROUNDUP(ROW(A1)/5, 0), 

 のようにします。これでROW()の値が1~5ならば1、6~10ならば2を返します。

 

 最後に列数を指定します。ROW()を、参照範囲の列数、例えば5で割った余りをそのまま利用すると、0~4の範囲の値しか得られないため、+1します。また、A0のセルは存在せず、ROW() = 0の時1を得るためにA5から開始します。

 

 したがって、

=INDEX($A$1:$E$3, ROUNDUP(ROW(A1)/5, 0), MOD(ROW(A5),5)+1)

 とすることで行数順に要素を取り出せます。あとは下に引っ張るだけです。

f:id:taidachika:20180413114825j:plain

 

 行と列の関数を入れ替えると以下のようになります。ただし列数はすべて行数に置き換えます。つまり5を3にします。

=INDEX($A$1:$E$3, MOD(ROW(A3),3)+1, ROUNDUP(ROW(A1)/3, 0))

f:id:taidachika:20180413114845j:plain

 

 ROW関数の代わりにCOLUMN関数を使えば横向きに配置できます。

=INDEX($A$1:$E$3, ROUNDUP(COLUMN(A1)/5, 0), MOD(COLUMN(E1),5)+1)

f:id:taidachika:20180413114905j:plain

 

=INDEX($A$1:$E$3, MOD(COLUMN(C1),3)+1, ROUNDUP(COLUMN(A1)/3, 0))

f:id:taidachika:20180413114916j:plain

 

 これを利用して表をhtmlのテーブルに変換していましたが、「excel html テーブル」とかで検索したら便利なツールがいくつもあったのでこうした用途での需要はあまりないと思いました…

 javascriptなどで容易に変換ツールを作成できますが、タブやカンマのある要素がある場合は注意が必要です。