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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

2回答

2153閲覧

google Apps Script シート名によるシートの並び替え コードを知りたい

hiroshiorz

総合スコア15

Google Apps Script

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2018/08/01 15:52

スプレッドシートのワークシートを名前の順に並び替えるプログラムを組みたいのですがどのように組めばいいのかわかりません。

もっと自分で考えてみなければいけないのかもしれませんが、検索してもわからず質問することにしました。
丸投げとなり申し訳ありませんがご教授いただければ幸いです。

シートは
「集計」「マスタ」「テンプレ」「2018.7.29」「2018.7.28」・・・と続いていきます。
テンプレデータをコピーしてその日のデータを作成するので過去のデータを作ると
「集計」「マスタ」「テンプレ」「2018.6.1」「2018.7.29」「2018.7.28」・・・のようになります。
これを
「集計」「マスタ」「テンプレ」「2018.7.29」「2018.7.28」「2018.6.1」のように左に最新 右に古いと並び替えを行いたいです。
日付シートの書き方は「年.月.日」で統一してあります。

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

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

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

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

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

guest

回答2

0

大体下記のような感じです。(Sheets APIを利用しています。)

ただし、ソートについては、「2018.7.3 > 2018.7.28」になってしまったり
最初の3つのシートについて加味していないので、適宜変更してください。

JavaScript

1function sheetSort() { 2 var spreadsheetId = "xxx"; 3 var getOptionalArgs = { 4 "fields": "sheets.properties.sheetId,sheets.properties.title" 5 } 6 7 var data = Sheets.Spreadsheets.get(spreadsheetId, getOptionalArgs) 8 var dataList = JSON.parse(data).sheets; 9 10 // dataListをソートする 11 dataList.sort(function(a, b) { 12 if (a.properties.title > b.properties.title) return -1; 13 if (a.properties.title < b.properties.title) return 1; 14 return 0; 15 }); 16 17 // ソートのためのクエリ作成 18 var updateOptionalArgs = { 19 "requests": [ 20 ] 21 } 22 23 for (var i in dataList) { 24 var d = dataList[i]; 25 updateOptionalArgs.requests.push({ 26 "updateSheetProperties": { 27 "properties": { 28 "sheetId": d.properties.sheetId, 29 "index": i 30 }, 31 "fields": "sheetId,index" 32 } 33 }); 34 } 35 36 // ソート実行 37 Sheets.Spreadsheets.batchUpdate(updateOptionalArgs, spreadsheetId); 38}

投稿2018/08/02 03:00

編集2018/08/02 03:51
macaron_xxx

総合スコア3191

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

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

hiroshiorz

2018/08/02 05:19

ReferenceError: 「Sheets」が定義されていません。(行 45、ファイル「コード」) そうそうな回答ありがとうございます! ↑のようなエラーが出ました><
hiroshiorz

2018/08/02 06:16

教えていただきありがとうございます! Sheets APIとはそういうことなのですね!学びました! 再度実行した結果 Requested entity was not found. のエラーでした。
hiroshiorz

2018/08/02 16:59

参考URLを貼っていただきありがとうございます! 自分なりに試行錯誤してみます!
guest

0

ベストアンサー

moveActiveSheet()しか見つけられず、これではシート数が多かったらアウトですね。

適切なシート名のテストデータを用意するのがつらいのでテストしてません。

javascript

1// このスプレッドシートをソートしてくれるやつ 2function sortSheets() { 3 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 4 var sheetNames = spreadsheet.getSheets() //シート名の配列を得る 5 .map(function(element, index, array) { //名前だけにする 6 return element.getName(); 7 }) 8 .filter(function(element, index, array) { //2ではじまる名前だけにする 9 return (element[0] == '2'); 10 }) 11 .sort(compareDateLikeStr); // 日付を文字列じゃなくて色々と考えて降順ソート 12 13 for(var i = 0; i < sheetNames.length; i++) { // シート名がソート済みなので、一つずつ移動させる 14 var cur = spreadsheet.getSheetByName(sheetNames[i]); 15 cur.activate(); 16 spreadsheet.moveActiveSheet(i + 4); 17 } 18} 19 20function sortTest() { //テスト用 21 var t = ["2018.1.1", "2018.1.11", "2017.1.11"]; //実際のシート名を入れてみてソートされるか確認してください 22 t.sort(compareDateLikeStr); 23 Logger.log(t); // 結果として、並んでいるかログで見てください 24} 25 26// 日付っぽい文字列をソート(降順) 27// .で3つに区切れるはずなので、それを数値化して、年>月>日で比較する。 28function compareDateLikeStr(a, b) { 29 var aYMD = a.split('.').map(function(element, index, array) { return Number(element);}); 30 var bYMD = b.split('.').map(function(element, index, array) { return Number(element);}); 31 if(aYMD.length != 3 || bYMD.length != 3) return 0; 32 if(aYMD[0] > bYMD[0]) return -1; 33 if(aYMD[0] < bYMD[0]) return 1; 34 //ここまでで年が同じ 35 if(aYMD[1] > bYMD[1]) return -1; 36 if(aYMD[1] < bYMD[1]) return 1; 37 //ここまでで年月が同じ 38 if(aYMD[2] > bYMD[2]) return -1; 39 if(aYMD[2] < bYMD[2]) return 1; 40 return 0; 41}

--蛇足
今からは困難でしょうが、将来の参考として
0. 2018.07.31, 2018.08.01となっているとソートが非常に楽です。//compareなんちゃらが不要になる
0. テンプレートからのコピーが完全手動でなくていいなら、コピー時に思った場所にインサートするのがいいのかなーと妄想しました(そういうコピーがGASでできるかは未調査)

投稿2018/08/02 03:22

編集2018/08/03 14:22
papinianus

総合スコア12705

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

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

macaron_xxx

2018/08/02 03:58

compareDateLikeStrがいい感じですね! mapの使い方も参考になります~。 filterは後々見返した時にどういう意図かわかりにくそうですね、、compareDateLikeStrみたく正規表現でt/f返すメソッド用意したほうがよさそう?
papinianus

2018/08/02 04:08

filterはリーダブルではないですね。elm != "集計"を3つつなぐのが面倒になって手抜きした結果です(includesが使えれば…)。 正規表現は苦手意識があってぱっと思いつかなかったのですが、言われてみると用途的には、/\d{4}.\d{1,2}.\d{1,2}/がしっくりきますね。 ただ、挿入位置をi+3にしていることもあり、シート名の運用規則にべったりで、あまり使えないですね(シートの数と配列の差分を取れば変数化できそう)。
hiroshiorz

2018/08/02 05:20

回答ありがとうございます! 3つ実行するもの出てきたんですけどどれを実行すればいいのでしょうか?>< 実行したらばらばらになっちゃいました・・・
hiroshiorz

2018/08/02 05:35

日付2018.07.31のように月、日も2桁でシート作れますので作ります!
macaron_xxx

2018/08/02 06:13

どれを実行したらいいかわからないぐらいのプラグラミング知識しかないのであれば、 まずは勉強したほうがいいと思いますよ。
hiroshiorz

2018/08/02 06:28

知識不足で初歩的な質問ばかりしてしまい失礼いたしましたm(_ _)m 学校でVBAを授業で受けていた程度でスプレッドシートも似たようにプラグラム組めば便利になるんじゃないかと思ったものの、勉強不足なために自分では作り切れず投稿した次第であります。 もう少し作っていただいたものを読めるほどには勉強します>< ご指摘いただきありがとうございます。
papinianus

2018/08/02 07:36

ホントすみません。i+4ですね。インデクス1始まり見てたのにごめんなさい。(macaron_xxxさんありがとうございます) →回答修正します。また、コメントも入れてみます。 実行するものは、sortSheets()です。 testはソートのテスト用で(質問者様が思っているとおりに並ぶかのテスト)、compareDateLikeStrはソートのために分けました。
papinianus

2018/08/02 07:49

私に限らない(と思いたい)ですが、本番データでいきなりトライしないでください。 ブックに相当するスプレッドシートをコピーすることは(手動でも)容易なはず。 私は逆にVBAにくじけたのですが、VBAとjsでは考え方が違うところがあるので、理解しづらかったかもしれません。特にmapとかfilterとかをつかっているせいで。でもforでやっていくとかしんどいじゃないですか? あと、Excelもjavascriptをサポートする気があるらしいので、jsは覚えていきましょう。 > スプレッドシートも似たようにプラグラム組めば便利になるんじゃないかと思った 個人的には、こう思えることは結構大事なことと思っています。また、初歩的であることは悪いことではないです。
hiroshiorz

2018/08/02 16:58

ありがとうございます! しかしながら「集計」「マスタ」「テンプレ」もばらばらになってしまうようになりました。 自分なりに試行錯誤してみて わからない場合また、質問させていただこうと思います!
papinianus

2018/08/03 14:21

修正しました。 場所は、 return (element[0] != '2');の!=を==にしたことです。 すみませんが、集計とマスタとテンプレは戻せないコードなので、その3つが1,2,3番目にある状態で再度トライすれば直ると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問