2021年04月09日

【Googleスプレッドシート】INDIRECTとADDRESSとMATCHを使って値を取得する

タイトルが仰々しい感じではありますが、買い物をした時の商品の値段や購入場所、日付などをgoogleスプレッドシートに追加していき、最安値とその価格を良い感じに抜き出したかったのが発端です。

いろいろと調べてみるとVLOOKUPで抜き出す方法が最初に目につきますが、それでは使い勝手が少し悪く、INDEXとMATCHを使った方が良いよとの記事もありましたがなかなか上手くできなかったのでタイトルの関数たちで実現することになりました。

ちなみに検索していたら、相互リンクしている「ソースに絡まるエスカルゴ」さまのページにたどり着いたので記事を参考に同じように解説していこうと思います。

表データの準備

まずは取得したい表データを準備します。表データはGoogleスプレッドシートにて作成しています。
作成した表は下記のとおりです。買い物(や価格調査)をするたびに行数を増やしていくことになります。

日付 場所 ツナ缶 鯖缶 おでん缶
1977/04/08 村上商店 288 358 379
1977/05/13 松井商店 250 381
1977/06/21 スーパー北斗 360 360

実際に作成した表は下記のような感じです。購入していない(価格を調べていない)ところは空白になっています。

20210408_1

各商品の最安値とそれを購入した場所を調べる

やり方は下記のとおりです。

まずはおでん缶の最安値を探します。単純にMIN 関数で良いでしょう。

=MIN(E2:E)

これを例えばセルG2に入れておきます。

次に最安値をキーとして最安値の場所を良い感じに調べます。

=INDIRECT(ADDRESS(MATCH(G2,E:E,0),2,1,TRUE))

やっていることはMATCH 関数でE列の中から最安値と一致する行番号を探し、ADDRESS 関数で行番号と列番号(2はB列のこと)からアドレス値"$B$2"文字列を作成し、INDIRECT 関数にてアドレス値の文字列からセル参照を取得します。
結果として下記の画像のように良い感じに値の取得ができます。


20210408_2



各関数の詳しい説明については下記を参照してください。

MATCH - ドキュメント エディタ ヘルプ

ADDRESS - ドキュメント エディタ ヘルプ

INDIRECT - ドキュメント エディタ ヘルプ

VLOOKUP について

VLOOKUP - ドキュメント エディタ ヘルプの使い方を見ると下記のようになっています。

VLOOKUP(検索キー, 範囲, 番号, [並べ替え済み])

この関数では問題が2つあります。

  1. VLOOKUP では検索キーに指定したキーを範囲内から探し、"範囲内の"番号で指定した列の値しか取れないこと
    今回の表で言えばツナ缶の最安値である「250」から場所の「松井商店」を探すためには検索キーに「250」を入れ、範囲は「B1:C4」とする必要があります(今後も増える可能性を考えれば「B:C」とかにする)。
    今回のようなキーが数字で調べたい対象が文字列の場合にはすべて範囲に含めても良いですが、どちらも数字だったり文字で重複が考えられる場合は範囲に含められません。
  2. 範囲に飛び値を指定できない
    こちらは調査不足の可能性がありますが、VLOOKUP の範囲指定を場所と鯖缶だけのような指定にする方法がわかりませんでした。いちおう飛び値の指定方法として「(B:B,D:D)」のような方法がありますが、うまく動作してくれませんでした。
    また、Google スプレッドシートで配列を使用する - ドキュメント エディタ ヘルプ を参考に「{B:B,D:D}」のように新たに配列を作って検索がうまくできませんでした。
INDEX とMATCH について

これでできることについては【Googleスプレッドシート】INDEXとMATCHを使って値を取得する - ソースに絡まるエスカルゴ に詳しく書かれていますのでそちらを参考にしてください。

このやり方では問題が1つあります。

  1. INDEX 関数では範囲内からでしか値を取得できない
    VLOOKUP と同様ですね。

このやり方ではINDEX の範囲を配列を使って作成することで飛び値も良い感じに検索できるので、1に挙げた問題が気にならなければこの方法で良いと思います。

続きを読む

rabbitcats at 10:00|PermalinkComments(0) ソフトウェア 

2021年02月24日

livedoor blog でコードハイライト

何番煎じかわかりませんが、コードハイライトのやり方です。
そもそもプログラミング関連の記事を書く人はみんなはてなブログを使っていそうな気もしますが、自分への備忘録も兼ねて残しておきます。

コードハイライトにはhighlight.js を使いました。

設定方法は[ブログ設定]にある[デザイン / ブログパーツ]設定内の[PC] を選択し、カスタムJS タブでhead内の設定のところに下記のコードを追加することで実現できます。
私のブログだとスタイル設定がすでに入っていたので、末尾に追加する形にしました。
また、バージョンが上がったらリンクも適宜変えるとよいでしょう。

<link rel="stylesheet"
      href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.5.0/styles/default.min.css">
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.5.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>

簡単ですね!

rabbitcats at 19:00|PermalinkComments(0) コンピュータ | 雑記

2021年02月22日

Typescript の文字列定義まわりの不思議

下記のコードを実行するとHoge.user はundefined となり、Hoge.user2 は期待通りに定義される。

class Hoge {
    static readonly user : "name1";
    static readonly user2 = "name2";
}

console.log(Hoge.user);
console.log(Hoge.user2);

Playground

ただ、最近までReact + Typescript でHoge.user の方も文字列がちゃんと定義されていたのがよくわからないですね。どうして今までは大丈夫だったのでしょうね。



rabbitcats at 15:00|PermalinkComments(0) プログラミング