Googleのスプレッドシートの便利な数式queryの中で、order byを使って別のシートから指定した範囲を抜き出しソートを掛けたときに、descはきちんと表示されるのに、数式の中をascに変えたとたんに表示されない、、、という事態に陥りました。
その原因と解決方についてまとめています。
原因
ascだけが機能せず、表示がおかしくなる原因は空白行が含まれているからでした。
ascで昇順に並べ替えたときに、指定範囲内に空白が含まれる場合、空白が一番上にきます。一方、descで降順に並べ替えたときは、空白行が下にいくので、データがきちんと整列してあるように見えます。
つまり、ascもdesc同様にきちんと機能しているということです。
症状
descの場合
例えば、次の数式のように、importrangeを使って他の行を読み込んだ場合に「実施日」でソートを行います。
=query(importrange(シートID, 範囲), select * order by Col15 desc)
descの場合は以下のようにしっかりと指定した15行目の「●実施日」でソートが行われます。
*データ抽出用なので、書式設定はしていません。
ascの場合
数式の末尾を「asc」に入れ替えてみます。
=query(importrange(シートID, 範囲), select * where Col15 is not null order by Col15 asc)
すると、何も表示されなくなりました(ように見えるだけ)
これは、指定した範囲内に空白が含まれているため、空白行が上に来ているだけです。
実際に下の方にスクロールしてみると、きちんとascでソートされたデータがあります。
空白行が1000行ぐらい含まれていたので、気づくのが遅れました。。w
対処法
対処はとても簡単です。ソートしたい行の空白行を除外して呼び出せばOKです。where句を使って、以下の指示を追記します。
where ソート対象の列 is not null
これで、指定した行の空白行は除外する指示になります。
実際の記述は以下のようになります。
=query(importrange(シートID, 範囲), select * where Col15 is not null order by Col15 asc)
きちんと指定した行で昇順ソートされたデータが表示されました。
descはきちんと機能するのに、ascが機能しない!Googleのサーバーエラーか何か!?と思った方は、ぜひ下の方にスクロールして確認してみてください。
よきプログラミングDAYを!