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

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

ただいまの
回答率

90.75%

  • Google Apps Script

    711questions

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

  • Google

    537questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 97

hiroshiorz

score 4

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

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

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

function sheetSort() {
  var spreadsheetId = "xxx";
  var getOptionalArgs = {
    "fields": "sheets.properties.sheetId,sheets.properties.title"
  }

  var data = Sheets.Spreadsheets.get(spreadsheetId, getOptionalArgs)
  var dataList = JSON.parse(data).sheets; 

  // dataListをソートする
  dataList.sort(function(a, b) {
    if (a.properties.title > b.properties.title) return -1;
    if (a.properties.title < b.properties.title) return 1;
    return 0;
  });

  // ソートのためのクエリ作成
  var updateOptionalArgs = {
    "requests": [
    ]
  }

  for (var i in dataList) {
    var d = dataList[i];
    updateOptionalArgs.requests.push({
      "updateSheetProperties": {
        "properties": {
          "sheetId": d.properties.sheetId,
          "index": i
        },
        "fields": "sheetId,index"
      }
    });
  }

  // ソート実行
  Sheets.Spreadsheets.batchUpdate(updateOptionalArgs, spreadsheetId);
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/02 14:19

    ReferenceError: 「Sheets」が定義されていません。(行 45、ファイル「コード」)

    そうそうな回答ありがとうございます!
    ↑のようなエラーが出ました><

    キャンセル

  • 2018/08/02 15:06

    https://www.lisz-works.com/entry/gas-rw-spreadsheet
    これを参考にSheets APIを有効にしないといけないです。

    >Sheets APIを利用しています。
    と書いたので、調べてほしかったなぁ。

    キャンセル

  • 2018/08/02 15:16

    教えていただきありがとうございます!
    Sheets APIとはそういうことなのですね!学びました!

    再度実行した結果
    Requested entity was not found.
    のエラーでした。

    キャンセル

  • 2018/08/02 15:26

    ちょっとさすがに怠慢なので
    https://developers.google.com/sheets/api/guides/concepts
    とか
    https://developers.google.com/sheets/api/quickstart/apps-script
    とか
    読んで何がダメか考えてください。

    キャンセル

  • 2018/08/03 01:59

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

    キャンセル

checkベストアンサー

0

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

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

// このスプレッドシートをソートしてくれるやつ
function sortSheets() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheetNames =  spreadsheet.getSheets() //シート名の配列を得る
    .map(function(element, index, array) {  //名前だけにする
      return element.getName();
    })
    .filter(function(element, index, array) { //2ではじまる名前だけにする
      return (element[0] == '2');
    })
    .sort(compareDateLikeStr); // 日付を文字列じゃなくて色々と考えて降順ソート

  for(var i = 0; i < sheetNames.length; i++) { // シート名がソート済みなので、一つずつ移動させる
    var cur = spreadsheet.getSheetByName(sheetNames[i]);
    cur.activate();
    spreadsheet.moveActiveSheet(i + 4);
  }
}

function sortTest() { //テスト用
  var t = ["2018.1.1", "2018.1.11", "2017.1.11"]; //実際のシート名を入れてみてソートされるか確認してください
  t.sort(compareDateLikeStr);
  Logger.log(t); // 結果として、並んでいるかログで見てください
}

// 日付っぽい文字列をソート(降順)
// .で3つに区切れるはずなので、それを数値化して、年>月>日で比較する。
function compareDateLikeStr(a, b) {
  var aYMD = a.split('.').map(function(element, index, array) { return Number(element);});
  var bYMD = b.split('.').map(function(element, index, array) { return Number(element);});
  if(aYMD.length != 3 || bYMD.length != 3) return 0;
  if(aYMD[0] > bYMD[0]) return -1;
  if(aYMD[0] < bYMD[0]) return  1;
  //ここまでで年が同じ
  if(aYMD[1] > bYMD[1]) return -1;
  if(aYMD[1] < bYMD[1]) return  1;
  //ここまでで年月が同じ
  if(aYMD[2] > bYMD[2]) return -1;
  if(aYMD[2] < bYMD[2]) return  1;
  return 0;
}

--蛇足
今からは困難でしょうが、将来の参考として

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/02 12:58

    compareDateLikeStrがいい感じですね!
    mapの使い方も参考になります~。

    filterは後々見返した時にどういう意図かわかりにくそうですね、、compareDateLikeStrみたく正規表現でt/f返すメソッド用意したほうがよさそう?

    キャンセル

  • 2018/08/02 13:08

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

    キャンセル

  • 2018/08/02 14:20

    回答ありがとうございます!

    3つ実行するもの出てきたんですけどどれを実行すればいいのでしょうか?><
    実行したらばらばらになっちゃいました・・・

    キャンセル

  • 2018/08/02 14:35

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

    キャンセル

  • 2018/08/02 15:13

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

    キャンセル

  • 2018/08/02 15:27

    moveActiveSheetのインデックスは1始まりっぽいですね。
    https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#moveActiveSheet(Integer)

    キャンセル

  • 2018/08/02 15:28

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

    もう少し作っていただいたものを読めるほどには勉強します><
    ご指摘いただきありがとうございます。

    キャンセル

  • 2018/08/02 16:36

    ホントすみません。i+4ですね。インデクス1始まり見てたのにごめんなさい。(macaron_xxxさんありがとうございます)
    →回答修正します。また、コメントも入れてみます。

    実行するものは、sortSheets()です。
    testはソートのテスト用で(質問者様が思っているとおりに並ぶかのテスト)、compareDateLikeStrはソートのために分けました。

    キャンセル

  • 2018/08/02 16:49

    私に限らない(と思いたい)ですが、本番データでいきなりトライしないでください。
    ブックに相当するスプレッドシートをコピーすることは(手動でも)容易なはず。

    私は逆にVBAにくじけたのですが、VBAとjsでは考え方が違うところがあるので、理解しづらかったかもしれません。特にmapとかfilterとかをつかっているせいで。でもforでやっていくとかしんどいじゃないですか?
    あと、Excelもjavascriptをサポートする気があるらしいので、jsは覚えていきましょう。

    > スプレッドシートも似たようにプラグラム組めば便利になるんじゃないかと思った

    個人的には、こう思えることは結構大事なことと思っています。また、初歩的であることは悪いことではないです。

    キャンセル

  • 2018/08/03 01:58

    ありがとうございます!
    しかしながら「集計」「マスタ」「テンプレ」もばらばらになってしまうようになりました。

    自分なりに試行錯誤してみて わからない場合また、質問させていただこうと思います!

    キャンセル

  • 2018/08/03 23:21

    修正しました。
    場所は、 return (element[0] != '2');の!=を==にしたことです。

    すみませんが、集計とマスタとテンプレは戻せないコードなので、その3つが1,2,3番目にある状態で再度トライすれば直ると思います。

    キャンセル

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

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Google Apps Script

    711questions

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

  • Google

    537questions

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