ZeroScript

ゼロからわかるスクリプト

【こう書く】GASでシートをソートする方法 | Google スプレッドシート

世の中に出回る「Googleスプレッドシートをソートする」コード。動けばいいんですけど、イケてないように見える。

解説も欲しいなとも思ってる、そこのキミッ

コード

はい。 ということで、どん。

/**シート名降順で並べ替える*/
function sortSheet() {
    const SS = SpreadsheetApp.getActiveSpreadsheet();
    const sheets = SS.getSheets();
    /**ソート済み */
    const map = sheets
      .reduce((m, sheet) => {
        const name = sheet.getName();
        return [...m, { sheet, name }];
      }, [])
      .sort((a, b) => {
        if (a.name > b.name) return 1;
        if (a.name < b.name) return -1;
        return 0;
      });
    // ソート部
    for (let i = 0; i < map.length; i++) {
      const sheetIndex = i + 1;
      const { sheet } = map[i];
      sheet.activate();
      SS.moveActiveSheet(sheetIndex);
    }
}

解説

シート順を変えるメソッドは、moveActiveSheetでSpreadsheetクラスにあります。 そのため、sheet.move(1)みたくはできません。

※以下のコードは、上記コードを抜粋し一部変更を加えたものです。単体でコピペしても期待通りの挙動はしません。上記コードをコピペしてください。

  • step1. moveActiveSheetは、現在アクティブなシートの位置を変えるメソッドです。 そのため、ソート対象のシートを事前にactiveにする必要があります。
// 事前にアクティブ
sheet.activate();
// アクティブなシートをsheetIndex番目に移動
SS.moveActiveSheet(sheetIndex);
  • step2. ということは、sheetをシート名の降順にして、順番に呼び出せるようにしておけば良さそう

sheetそのものとシート名が、シート名の降順になったものが、mapです。

    const map = sheets
      .reduce((m, sheet) => {
        const name = sheet.getName();
        return [...m, { sheet, name }];
      }, [])
      .sort((a, b) => {
        if (a.name > b.name) return 1;
        if (a.name < b.name) return -1;
        return 0;
      });

上の抜粋部分では、sheetsreduceして、sortしているのが変数mapに格納されています。

reduceが終わった段階では、 例えばこんな感じになります。

    [
      {
        sheet: oxox, // なにかしらのシート
        name: "3abc", // シート名
      },
      {
        sheet: oxox, // なにかしらのシート
        name: "1abc", // シート名
      },
      {
        sheet: oxox, // なにかしらのシート
        name: "2abc", // シート名
      },
    ];

これがsortされると最終的に変数map

    [
      {
        sheet: oxox, // なにかしらのシート
        name: "1abc", // シート名
      },
      {
        sheet: oxox, // なにかしらのシート
        name: "2abc", // シート名
      },
      {
        sheet: oxox, // なにかしらのシート
        name: "3abc", // シート名
      },
    ];

な感じになります。

あとは、for文でmapを順番に取り出していけばよいです。

ちなみに

moveActiveSheet(sheetIndex)sheetIndexに当たる部分は、1から始まる数字を入れます。

Google スプレッドシートは1から始まるindexか、0から始まるindexなのか、コードを書いていて分からなくなることが多々あります。

変数名をindex0index1のようにすると良いのかもなと思っている。

以上!

まとめ

SpreadSheetクラスのmoveActiveSheetを使ってアクティブなシートの位置を変えるのが、シートソートの肝です。

これが分かればきっと応用も効くはず!

ではまた。