![見出し画像](https://assets.st-note.com/production/uploads/images/117329497/rectangle_large_type_2_6e3a49626466b4be177f14e12bdf7187.png?width=1200)
「入力後即ソート機能」を実装し、地元の老人福祉施設の入居者データ管理業務を秒で終わるようにしてみた。
こんにちは。新潟県湯沢町にUターンして、プログラミング教室で勤務する腰越です。本日は地元企業の自動システム制作受注「第2弾」ということで、老人福祉施設からの依頼に関して記録に残します。
第1弾の内容はこちら
きっかけ
ある日、知り合いから「スプレッドシート(エクセル)で管理している老人福祉施設の入居者データの整理作業が大変だ」との相談を受けました。
独自の区分(入居者・入居予定者・他入居者…)でデータ行を整理
区分ごとに指定した順番に並び替える
という作業を手動だと手間がかかる、とのこと。
なので上記2つの並び替え作業(ソート処理)を、入力時に自動で行うシステムを制作し、日々の業務効率化のお手伝いをすることになりました。
完成イメージはこんな感じ↓
システム開発までの流れ
要件定義
今回の要件は先程話した「データ整理作業の自動化」です。
これを普段しようしているスプシに組み込みます。
設計・開発
前回は簡単な設計書をつくったのですが、今回はスプレッドシート内で完結する内容だったので、先人の知恵を借りながらコードを作成したら、出来ました。
GASで自動ソートをかける方法
テスト→納品
その後基本的な確認はオンラインで行いました。
最後納品するまでのやり取りが大体2-3週間くらいでした。
納品後の質問や細かい修正は無償で行い、お客様都合の大きな回収の場合のみ有償で行っています。
完成コード(参考)
スプシのシート
![](https://assets.st-note.com/img/1687137398504-SCTa83ToVl.png?width=1200)
6行目以降で自動ソートを行う設定
コード
/**
* ①入力範囲内で区分の番号順にソート
*/
function division_sort() {
//スクリプトに紐づくスプレッドシートのアクティブな「スプレットシート」を読み込む
let ss = SpreadsheetApp.getActiveSpreadsheet();
//スクリプトに紐づくスプレッドシートのアクティブな「シート」を読み込む
let sheet = ss.getActiveSheet();
//最終行の値を取得する
let lastRow = sheet.getLastRow();
//シート内でソートしたいセル範囲をgetRangeで指定する
let data = sheet.getRange(6, 1, lastRow, 29);
//A列(column:1)を基準に昇順(true)でソートする
data.sort({column: 1, ascending: true});
andRankSort(ss,data,sheet,lastRow);
}
/**
* ②指定した区分([1.順位],[2.直近]...)の行数を取得、その範囲内で合計点を基準としたソートをかける
*/
function andRankSort(ss,data,sheet,lastRow) {
//定数を用意し、各区分のカウント数を代入
let count_rankRow = 0; //[1.順位]
let count_recentRow = 0; //[2.直近]
let count_futureRow = 0; //[3.将来]
let count_cancelRow = 0; //[4.キャンセル]
//セルに値が入っている所を範囲として、全取得
let values = sheet.getDataRange().getValues();
//Logger.log(values);
//最初〜最終行まで[1.順位]の個数を繰り返し処理でチェック
for (let value of values){
//取得するセルの場所を指定し、もし取得した値が[1.順位]だった場合はcountに+1をする
if(value[0] == "1.順位"){
//Logger.log("[1.順位]なので+1します");
count_rankRow++;
}else if (value[0] == "2.直近"){
count_recentRow++
}else if (value[0] == "3.将来"){
count_futureRow++
}else if (value[0] == "4.キャンセル"){
count_cancelRow++
}
}
//count個数を確認したい場合はlogでチェック
//Logger.log("[1.順位]は" + count_rankRow + "個\n[2.直近]は" + count_recentRow + "個\n[3.将来]は" + count_futureRow + "個\n[4.キャンセル]は" + count_cancelRow + "個");
//最終行の数を取得
let columns = sheet.getLastColumn();
//シート内でソートしたいセル範囲をgetRangeで指定する、シート内に1つもない場合は実行しない
//[1.順位]
if(count_rankRow > 0){
let nursingScore = sheet.getRange(6, 1, count_rankRow, columns);
//Y列を基準に[1,順位]の範囲のみ降順でソートする
nursingScore.sort({column: 25, ascending: false});
}
//[2.直近]
if(count_recentRow > 0){
nursingScore = sheet.getRange(6 + count_rankRow, 1, count_recentRow, columns);
//Y列を基準に[2,直近]の範囲のみ降順でソートする
nursingScore.sort({column: 25, ascending: false});
}
//[3.将来]
if(count_futureRow > 0){
nursingScore = sheet.getRange(6 + count_rankRow + count_recentRow, 1, count_futureRow, columns);
//Y列を基準に[3,将来]の範囲のみ降順でソートする
nursingScore.sort({column: 25, ascending: false});
}
//[4.キャンセル]
if(count_cancelRow > 0){
nursingScore = sheet.getRange(6 + count_rankRow + count_recentRow + count_futureRow, 1, count_cancelRow, columns);
//Y列を基準に[4,キャンセル]の範囲のみ降順でソートする
nursingScore.sort({column: 25, ascending: false});
}
}
まとめればもっとキレイなコードになりそうですが、とりあえずこれで動きます。
まとめ
「入力作業をする」「行を並び替える」という作業は、1つ1つだと大した手間ではないかもしれません。しかし、それに毎回5-10分費やすことを考えると月に何時間、年間だと何十時間ととられることになります。そこに人件費をかけるくらいなら、単純作業は全て機械(システム)に任せて「人にしか出来ないことをする」というのがどの企業にも大切なのかもしれません。
「人材不足の地方企業にこそ、ちょっとした自動システムを!」をテーマに今後も地元企業の応援&もちろん日々の授業もしていこうと思います。
ではではまた。
さいごに
ポートフォリオをつくりました。
お役に立てることがありましたらお声がけください。
よろしければサポートお願いします。いただいたサポートはデジタルツール活用に関する記事作成の活動費用にします!