【こう書く】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; });
上の抜粋部分では、sheets
をreduce
して、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なのか、コードを書いていて分からなくなることが多々あります。
変数名をindex0
やindex1
のようにすると良いのかもなと思っている。
以上!
まとめ
SpreadSheet
クラスのmoveActiveSheet
を使ってアクティブなシートの位置を変えるのが、シートソートの肝です。
これが分かればきっと応用も効くはず!
ではまた。