【スプレッドシート】queryのorder byを使ったときにdescは機能するのに、ascが表示されない(動かない)ときの対処法|GAS

スプレッドシート・スプシspreadsheet GAS-prograshi(プロぐらし)-kv SpreadSheet
記事内に広告が含まれていることがあります。

Googleのスプレッドシートの便利な数式queryの中で、order byを使って別のシートから指定した範囲を抜き出しソートを掛けたときに、descはきちんと表示されるのに、数式の中をascに変えたとたんに表示されない、、、という事態に陥りました。

その原因と解決方についてまとめています。


原因

ascだけが機能せず、表示がおかしくなる原因は空白行が含まれているからでした。

ascで昇順に並べ替えたときに、指定範囲内に空白が含まれる場合、空白が一番上にきます。一方、descで降順に並べ替えたときは、空白行が下にいくので、データがきちんと整列してあるように見えます。

つまり、ascもdesc同様にきちんと機能しているということです。


症状

descの場合

例えば、次の数式のように、importrangeを使って他の行を読み込んだ場合に「実施日」でソートを行います。

=query(importrange(シートID, 範囲), select * order by Col15 desc)
補足

query関数の中で「where句」や「order by句」を使うときの行の指定は通常はAなどの列のアルファベットを使います。

importrangeで他のシートから読み込んだときは、列のアルファベットでは機能しません。代わりに、読み込んだときの列番号を指定します。(上記の例では col15


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を!


タイトルとURLをコピーしました