質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

540閲覧

GASで二次配列のarraySort時、number,string混同データの並び結果が正しくない。

takaD

総合スコア315

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/09/16 01:08

編集2020/09/16 01:46

前提・実現したいこと

二次配列データを取得し、スクリプト内で並び替えを行おうとしています。
(その後バイナリーサーチをするため)

そこで過去に実装した並び替えプログラムを動かしたら、結果が正しくなく、
調査した所、表示形式を自動にしたデータ群をgetValues()したとき、
配列内のデータにNumberとStringが混同していると、
処理が正しく行われていない様に感じました。

恐らくJavaScriptの基本的な仕様の問題なのかもしれませんが、
知識不足でお手上げ状態でございます・・・

String とNumberの混同データをバイナリーサーチ出来る様に並び替えを行う事は出来るのでしょうか・・・?
それとも単純にfunction arrSort()のアルゴリズムが間違えているだけなのでしょうか?
ご意見いただけると幸いです。

該当のソースコード

GAS

1function mainTest(){ 2var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet() 3var arr = ss.getRange("A2:A").getValues() 4arrSort(arr) 5ss.getRange(2,2,arr.length,1).setValues(arr) 6arrSort(arr,0,1) 7ss.getRange(2,3,arr.length,1).setValues(arr) 8 9} 10 11 12 13function arrSort(arr,col,desc){ 14 15 if(typeof col != 'number'){col = 0} 16 17const ascComp = function(a,b){ 18 if(a[col] < b[col] ) return -1; 19 if(a[col] > b[col] ) return 1; 20 return 0; 21 } 22 23const descComp = function(a,b){ 24 if( a[col] > b[col] ) return -1; 25 if( a[col] < b[col] ) return 1; 26 return 0; 27 } 28 29const blankComp = function(a, b) { 30 if (a[col] === "") return 1; 31 if (b[col] === "") return -1; 32 return 0; 33 } 34 35 if(desc != 1){ 36 arr.sort(ascComp); 37 arr.sort(blankComp); 38 }else{ 39 arr.sort(descComp); 40 } 41 return arr; 42}

試したこと

テストデータ
26879722
97531022
T3185186D
268D726
531556
A156
TA318
221

表示形式:自動配列で下記結果となりました。
自動配列

同じデータで表示形式:書式なしテキストの場合下記結果(正しく並び替えされている)
書式なしテキスト

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ご認識の通り、複数の型が混じっているための動作です。

同じデータで表示形式:書式なしテキストの場合下記結果(正しく並び替えされている)

このケースを正常系とするなら、a[col]b[col]にそれぞれtoString()を行えばいけると思います。

javascript

1function arrSort(arr,col,desc){ 2 3 if(typeof col != 'number'){col = 0} 4 5const ascComp = function(a,b){ 6 if(a[col].toString() < b[col].toString() ) return -1; 7 if(a[col].toString() > b[col].toString() ) return 1; 8 return 0; 9 } 10 11const descComp = function(a,b){ 12 if( a[col].toString() > b[col].toString() ) return -1; 13 if( a[col].toString() < b[col].toString() ) return 1; 14 return 0; 15 } 16 17const blankComp = function(a, b) { 18 if (a[col].toString() === "") return 1; 19 if (b[col].toString() === "") return -1; 20 return 0; 21 } 22 23 if(desc != 1){ 24 arr.sort(ascComp); 25 arr.sort(blankComp); 26 }else{ 27 arr.sort(descComp); 28 } 29 return arr; 30}

投稿2020/09/16 01:19

nekoniki

総合スコア2411

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takaD

2020/09/16 01:49

回答ありがとうございます。 型が混同すると挙動がおかしくなるのは正しいことなのですね・・・ 型を統一(String)して並び替えをし、バイナリサーチするときも対象が数字の場合はStringにしてから検索する様に諸々気を付けていこうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問