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

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

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

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

Google Apps Script

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

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

Q&A

解決済

2回答

1140閲覧

GASで範囲内を並び替えしたい

退会済みユーザー

退会済みユーザー

総合スコア0

Google スプレッドシート

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

Google Apps Script

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

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

0グッド

0クリップ

投稿2022/02/10 08:39

前提・実現したいこと

スプレッドシートだとエクセルのような並び替えが出来ないことに気付き、下記のようなスクリプト組んでみました。

リストの1行目にはバラバラな番号が入力してあり転置して貼り付けした後に並び替え、並び変えるたものを再度転置して貼り付けるという構想です。

ですが並び替えの部分が上手くいかず、思ったような昇順・降順になりません。

手作業で転置→範囲を並び替えした場合は構想通りになるため、コードに問題があるのだと思われますが、ご教授頂けませんでしょうか?

宜しくお願いいたします。

該当のソースコード

function copyToPasteTranspose() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var source = ss.getSheetByName("並べ替え").getRange("C1:AH44"); var destination = ss.getSheetByName("並べ替え").getRange("AJ3:CA34"); source.copyTo(destination, SpreadsheetApp.CopyPasteType.PASTE_NORMAL,true); var ss = SpreadsheetApp.getActiveSpreadsheet(); var rangesort = ss.getSheetByName("並べ替え").getRange("AJ3:CA34"); rangesort.sort(36); }

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

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

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

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

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

guest

回答2

0

転置したということは、1行目にあった番号が1列目になるので、
もし、番号順にソートという意味の昇順、降順であれば

sort(36) //36列目をソート  → sort(1) //1列目をソート

ではないですか?

投稿2022/02/14 11:32

snowrabbit

総合スコア7

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

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

退会済みユーザー

退会済みユーザー

2022/02/17 04:01 編集

ご回答ありがとうございます。 sourceの範囲("C1:AH44")を転置して貼り付けるとdestinationの範囲("AJ3:CA34")になり、AJが36列目にあたるのでsort(36)にしておりました。ですが頂いたsort(1)にしても番号順になりません。 実はsourceの範囲("C1:AH44")の1行目には関数が入っておりまして、これが悪さしているのではないかと思い、転置して貼り付けた後のAJ列をコピーして元のAJ列に値のみ張り付けし直してみました。 すると今度は部分的に値ごと消えて歯抜けのような状態になってしまいました。 質問後もあれこれ考えて改善していましたが、どうにも上手くまとまらず難儀しております。 改善できませんでしょうか? function copyToPasteTranspose() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var fromcopy = ss.getSheetByName("並べ替えtest").getRange("C1:AH44"); var tocopy = ss.getSheetByName("並べ替えtest").getRange("AJ1:CA34"); fromcopy.copyTo(tocopy, SpreadsheetApp.CopyPasteType.PASTE_NORMAL,true); //転置して貼り付け copyto(); sort(); } function copyto() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var source = ss.getSheetByName("並べ替えtest").getRange("AJ1:AK32"); var destination = ss.getSheetByName("並べ替えtest").getRange("AJ1:AK32"); source.copyTo(destination, SpreadsheetApp.CopyPasteType.PASTE_VALUES,false); } function sort() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var rangesort = ss.getSheetByName("並べ替えtest").getRange("AJ3:CA34"); rangesort.sort(36); }
snowrabbit

2022/02/20 13:29

確かに、36でした。すみません。 このように変更するとどうなりますか function copyToPasteTranspose() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var fromcopy = ss.getSheetByName("並べ替えtest").getRange("C1:AH44"); var tocopy = ss.getSheetByName("並べ替えtest").getRange("AJ1:CA34"); fromcopy.copyTo(tocopy, SpreadsheetApp.CopyPasteType.PASTE_VALUES,true); //転置して値のみ貼り付け tocopy.sort(36) //tocopyの並び替え、36列目 tocopy.copyTo(fromcopy, SpreadsheetApp.CopyPasteType.PASTE_NORMAL,true); //転置して元の場所に貼り付け // 各関数は使っていません... } function copyto() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var source = ss.getSheetByName("並べ替えtest").getRange("AJ1:AK32"); var destination = ss.getSheetByName("並べ替えtest").getRange("AJ1:AK32"); source.copyTo(destination, SpreadsheetApp.CopyPasteType.PASTE_VALUES,false); } function sort() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var rangesort = ss.getSheetByName("並べ替えtest").getRange("AJ3:CA34"); rangesort.sort(36); }
snowrabbit

2022/02/20 13:34

説明してませんでした。 始めの転置して貼り付け(PASTE_NORMAL)を いっそ、転置して値のみ貼り付けにしてみました(PASTE_VALUES) 私も仮でデータを入れ、動かしてみたら関数部分は歯抜けになりましたw
guest

0

ベストアンサー

自己解決しました。

function copyToPasteTranspose() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var fromcopy = ss.getSheetByName("並べ替えtest").getRange("C2:AH44"); var tocopy = ss.getSheetByName("並べ替えtest").getRange("AK1:CA32"); fromcopy.copyTo(tocopy, SpreadsheetApp.CopyPasteType.PASTE_NORMAL,true); //転置して貼り付け var fromcopy2 = ss.getSheetByName("並べ替えtest").getRange("C1:AH1"); var tocopy2 = ss.getSheetByName("並べ替えtest").getRange("AJ1:AJ34"); fromcopy2.copyTo(tocopy2, SpreadsheetApp.CopyPasteType.PASTE_VALUES,true); //値のみ転置して貼り付け var rangesort = ss.getSheetByName("並べ替えtest").getRange("AJ1:CA32"); rangesort.sort(36); var fromcopy3 = ss.getSheetByName("並べ替えtest").getRange("AK1:CA32"); var tocopy3 = ss.getSheetByName("並べ替えtest").getRange("C2:AH44"); fromcopy3.copyTo(tocopy3, SpreadsheetApp.CopyPasteType.PASTE_NORMAL,true); //転置して値のみ貼り付け直し }

fromcopy2.copyTo(tocopy2, SpreadsheetApp.CopyPasteType.PASTE_VALUES,true); //値のみ転置して貼り付け

転置した上から関数が入っている数字部分だけを「値のみ転置して貼り付け」することでその後の並び替えも上手くいきました。

投稿2022/02/26 08:11

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問