$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

Google Spreadsheetで他のマスターデータを読み込んでいるとき列追加で壊れにくくしたい

Google Spreadsheetを使っているとき、別のマスターデータシートから特定列だけ読み込みたい時がある。この時簡単に読み込む方法としてはIMPORTRANGEやQUERY関数を組み合わせて使う方法がある。

ただこのやり方だと、マスターデータシートに列が追加された時に壊れやすいという問題がある。QUERY関数などはヘッダー名を指定して読み込むことができず、SELECT Col1, Col3 のような書き方をする必要がある。これだとマスターデータの途中に列を追加した場合に簡単に壊れてしまう。

そこでマスターデータシートのヘッダー名をキーにして読み込む方法を考えてみた。サンプルは こちらのspreadsheetにおいている。

できること

以下のようなマスターデータがあるとして

別シートで一部だけ読み込みたい。この時にマスターデータに列追加しても壊れないようにしたい。

ヘッダー名をキーにして読み込む方法

やり方としては読み込みたい列ごとに次のような関数を書くこと。これだけで、masterというシートから「名前」というヘッダーの列をすべて読み込める。

=INDEX(master!A1:Y, 0, MATCH("名前", master!1:1, 0))

もう少し関数の意味をコメントで解説する。

// MATCHでとってきた列番号を元に、その列を全てIMPORTする
=INDEX(
  master!A1:Y,
  // INDEXの第二引数に0を指定すると全行を返す(列全体を対象)
  0, 

  // どの列番号を読み込むかをMATCHを使って決める
  // ヘッダー行から「名前」に完全一致する列番号を取得できる
  MATCH(
    "名前",
    master!1:1,
    0 // 完全一致モード
  )
)

このやり方を使えばマスターデータシートの変更に多少強くデータを読み込めて便利である。

別のspreadsheetからも読み込みたい場合

また別シートではなく別のspreadsheetから読み込みたい時はIMPORTRANGEと組み合わせれば良い。こんな感じ。

=INDEX(IMPORTRANGE("<sheet URL>", "master!A1:Y"), 0, MATCH("ColName", IMPORTRANGE("<sheet URL>", "master!1:1"), 0))