
【GAS】Google Apps Script 活用事例 色ごとにSORTするスクリプトを書いてみました。
あまりスマートではないのですが、GASで色ごとにSORTするスクリプトを書きました。現在は、色ごとにソートする機能が標準機能として存在するようです.....。進化って速い。
ポイントは、トリガーで行えるという事でしょうか?それから、if文の条件式を工夫すれば、特定の単語だけを上部に、移動するみたいなことが出来るかもしれません。
下記の質問と全く同じ事をしたいと思っていました。
スクリプト実行前
スクリプト実行後
スクリプト全文
function sortByColors() {
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet = spreadsheet.getSheetByName('colors');
const range = sheet.getRange('A2:Z');
//色が付いているセルを2次元配列として取得する [ [ '#d9d2e9' ],[ '#f4cccc' ], [ '#fff2cc' ]....
const colors = range.getBackgrounds();
//白を削除する
const values = colors.map(array => array.filter(color => color !== '#ffffff'));
//1次元配列の要素がゼロ、空の1次元配列を削除する
const newValues = values.filter(array => array.length > 0);
console.log(`空の配列削除後:${newValues.length}`);
console.log(`filter後:\n ${newValues}`);
//影響を受けない範囲に、色情報を一旦書き出す。
const targetColumn = sheet.getLastColumn() + 1;
const tempRange = sheet.getRange(2, targetColumn,newValues.length, 1);
tempRange.setValues(newValues).setFontColor('#ffffff');
console.log(`lastColumn: ${targetColumn}`);
console.log(`tempRange : ${tempRange.getA1Notation()}`);
//一度書き出した色情報を元にsortする。
range.sort([
{column: targetColumn, ascending: false}
]);
//一旦書き出した色情報をクリアする。
tempRange.clearContent();
}
解説
//見出し行を除いて範囲を取得する
const range = sheet.getRange('A2:Z');
//色が付いているセルを2次元配列として取得する [ [ '#d9d2e9' ],[ '#f4cccc' ], [ '#fff2cc' ]....
const colors = range.getBackgrounds();
//白以外を配列に残す。 結果として、白が削除される
const values = colors.map(array => array.filter(color => color !== '#ffffff'));
//1次元配列の要素数が0、空の1次元配列を削除する
const newValues = values.filter(array => array.length > 0);
range.getBackgrounds(); は、今回初めて使いましたが、getValues()と同じ感覚で使えます。2次元配列として取得します。
色がついていないセルは、#ffffff 白として取得されています。今回、色ごとに並び替える際、色のついている行は、白よりも上の行に移動させるというロジックを立てる事が出来ます。
values => array => value
2次元配列 > 1次元配列 > 配列の各要素
colors.map(array => array.filter(color => color !== '#ffffff'));
//配列に白以外が残るようにする。結果として白が削除されます。
完成した色情報の2次元配列を1度、白で書き出します。書き出した列でsortして、sortが終わり次第、書き出した内容を消しています。
スマートではないな.....。
もっとスマートなやり方があれば、教えてください!!......ってか、俺も標準機能試してみよう。手動に頼らず自動化出来ます。
上記のスクリプトは、厳密に言えば、アルファベットで色ごとにSORTしているので、特定の色を一番上に持っていきたい場合は、他の方法を検討する必要があります。
このスクリプトを書いて思った事
sortメソッドは、元の配列を保持しない、破壊的メソッドなのでオリジナルは残して、新しいシートにコピーしたりした方がいいかなと思いました。
.......普通のsortでも十分だった?
function sortByColors() {
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet = spreadsheet.getSheetByName('タスク一覧 のコピー');
const range = sheet.getRange('A2:Z');
//優先度・ステータス順に並び替える
range.sort([
{column: 4, ascending: true},
{column: 5, ascending: false}
]);
}