見出し画像

「入力後即ソート機能」を実装し、地元の老人福祉施設の入居者データ管理業務を秒で終わるようにしてみた。

こんにちは。新潟県湯沢町にUターンして、プログラミング教室で勤務する腰越です。本日は地元企業の自動システム制作受注「第2弾」ということで、老人福祉施設からの依頼に関して記録に残します。

第1弾の内容はこちら


きっかけ

ある日、知り合いから「スプレッドシート(エクセル)で管理している老人福祉施設の入居者データの整理作業が大変だ」との相談を受けました。

  • 独自の区分(入居者・入居予定者・他入居者…)でデータ行を整理

  • 区分ごとに指定した順番に並び替える

という作業を手動だと手間がかかる、とのこと。
なので上記2つの並び替え作業(ソート処理)を、入力時に自動で行うシステムを制作し、日々の業務効率化のお手伝いをすることになりました。

完成イメージはこんな感じ↓

システム開発までの流れ

要件定義

今回の要件は先程話した「データ整理作業の自動化」です。
これを普段しようしているスプシに組み込みます。

設計・開発

前回は簡単な設計書をつくったのですが、今回はスプレッドシート内で完結する内容だったので、先人の知恵を借りながらコードを作成したら、出来ました。

  • GASで自動ソートをかける方法


テスト→納品

その後基本的な確認はオンラインで行いました。
最後納品するまでのやり取りが大体2-3週間くらいでした。
納品後の質問や細かい修正は無償で行い、お客様都合の大きな回収の場合のみ有償で行っています。

完成コード(参考)

スプシのシート

1-5行目までがヘッダー
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分費やすことを考えると月に何時間、年間だと何十時間ととられることになります。そこに人件費をかけるくらいなら、単純作業は全て機械(システム)に任せて「人にしか出来ないことをする」というのがどの企業にも大切なのかもしれません。

「人材不足の地方企業にこそ、ちょっとした自動システムを!」をテーマに今後も地元企業の応援&もちろん日々の授業もしていこうと思います。

ではではまた。

さいごに

ポートフォリオをつくりました。
お役に立てることがありましたらお声がけください。


よろしければサポートお願いします。いただいたサポートはデジタルツール活用に関する記事作成の活動費用にします!