スプレッドシートのワークシートを名前の順に並び替えるプログラムを組みたいのですがどのように組めばいいのかわかりません。
もっと自分で考えてみなければいけないのかもしれませんが、検索してもわからず質問することにしました。
丸投げとなり申し訳ありませんがご教授いただければ幸いです。
シートは
「集計」「マスタ」「テンプレ」「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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア3191
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総合スコア12705
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/02 04:08
2018/08/02 05:20
2018/08/02 05:35
2018/08/02 06:13
2018/08/02 06:27
2018/08/02 06:28
2018/08/02 07:36
2018/08/02 07:49
2018/08/02 16:58
2018/08/03 14:21
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/02 05:19
2018/08/02 06:06
2018/08/02 06:16
2018/08/02 06:26
2018/08/02 16:59