2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

社宅を管理せよ!~GAS初心者がChatGPTと一緒に挑戦してみた~

Last updated at Posted at 2024-10-23

助けて、ChatGPT!

こんにちは。私は小売業で人事関係の仕事をしています、やまな。です
今の部署になって早半年・・・。

効率よく仕事ができるようになりたい!!

特に私がそう思ったのは、社宅の管理をしているときでした。
業務の一つとして「技能実習生の社宅管理」があります。
技能実習生はいろいろな国から働きに来ているので、社宅を用意しています。
入社したらすぐに住むことができるように、最低限の家具や家電をそろえて迎えます。その手続きはきっちりやるのですが、そのあとが問題です。

社宅一覧リストには住所や部屋の名前が記載されているだけです。
実習生がどこに住んでいるかは、入社時に手続きをするために用意している別のリストから探す必要があります。
この社宅リストと入社時のリストを照らし合わせて確認するという業務が、実習生の入れ替えの時期や新規で入社するときに必要になります。

これが本当に時間がかかるしとても手間!

今までは、担当者が目で見て管理をしていたので、本当に時間がかかるし、集中力もとても必要になるので、大変でした。

やはり、人の力だけでは限界が・・・。
簡単に情報を照合できるものはないだろうか。

考えたところで、私はデジタル技術を学び始めたばかりの超初心者です。誰に聞けばいいのかも、何をすればいいのかもわかりません。

そんなとき、ChatGPTという存在を思い出しました。
使ったことはほとんどないけれど、なんでも答えてくれるという噂の存在です。

そうだ、ChatGPTに質問して考えてもらおう!

ここから、超初心者の私とChatGPTの挑戦が始まりました。

使用したツール

ChatGPT
・Googleスプレッドシート
Google Apps Script

私とChatGPTが作り上げたもの

これが、私がChatGPTと一緒に作ったGASです。

GASコード

スプリクト
function compareAddresses() {
  // スプレッドシートを開く
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  
  // 従業員リストシートと社宅情報シートを開く
  var employeeSheet = spreadsheet.getSheetByName("従業員リスト");
  var residenceSheet = spreadsheet.getSheetByName("社宅情報");

  // 従業員リストのD列(住所)、B列、C列の情報を取得
  var employeeAddresses = employeeSheet.getRange(2, 4, employeeSheet.getLastRow() - 1, 1).getValues();
  var employeeInfoB = employeeSheet.getRange(2, 2, employeeSheet.getLastRow() - 1, 1).getValues();
  var employeeInfoC = employeeSheet.getRange(2, 3, employeeSheet.getLastRow() - 1, 1).getValues(); // C列を取得

  // 社宅情報シートのA列とB列を取得し、B列とA列を入れ替え
  var residenceAddressesB = residenceSheet.getRange(2, 2, residenceSheet.getLastRow() - 1, 1).getValues();
  var residenceAddressesA = residenceSheet.getRange(2, 1, residenceSheet.getLastRow() - 1, 1).getValues();
  var residenceAddresses = [];
  
  for (var i = 0; i < residenceAddressesA.length; i++) {
    // B列とA列を入れ替えて結合し、空白を削除、全角を半角に変換、大文字を小文字に統一
    var fullAddress = (residenceAddressesB[i][0] + residenceAddressesA[i][0])
                        .replace(/\s+/g, "")  // 空白を削除
                        .toLowerCase()        // 大文字を小文字に統一
                        .normalize("NFKC")    // 全角を半角に変換
                        .replace(/号室?/g, "") // 「号室」および「号」を削除
                        .replace(/室/g, "");   // 「室」を削除
    residenceAddresses.push([fullAddress]);
  }

  // 結果を格納する配列
  var results = [];
  var currentTime = new Date(); // 現在の日時を取得

  // 比較処理
  for (var i = 0; i < employeeAddresses.length; i++) {
    // 空欄の行をスキップ
    if (!employeeAddresses[i][0] || !employeeInfoB[i][0] || !employeeInfoC[i][0]) {
      continue; // 空欄の行は結果に含めない
    }

    // 従業員の住所から空白を削除し、全角を半角に、大文字を小文字に統一
    var empAddress = employeeAddresses[i][0]
                        .replace(/\s+/g, "")  // 空白を削除
                        .toLowerCase()        // 大文字を小文字に統一
                        .normalize("NFKC")    // 全角を半角に変換
                        .replace(/号室?/g, "") // 「号室」および「号」を削除
                        .replace(/室/g, "");   // 「室」を削除
    var matchFound = false;
    
    for (var j = 0; j < residenceAddresses.length; j++) {
      var resAddress = residenceAddresses[j][0];
      
      // 住所の比較
      if (empAddress === resAddress) {
        results.push([employeeInfoB[i][0], employeeInfoC[i][0], employeeAddresses[i][0], "完全一致", currentTime]);  // C列の情報を追加
        matchFound = true;
        break;
      }
    }
    
    if (!matchFound) {
      results.push([employeeInfoB[i][0], employeeInfoC[i][0], employeeAddresses[i][0], "一致なし", currentTime]); // 一致しない場合もC列の情報を追加
    }
  }

  // 結果を新しいシートに書き込む
  var resultSheet = spreadsheet.getSheetByName("比較結果") || spreadsheet.insertSheet("比較結果");
  resultSheet.clear();  // 前回の結果をクリア
  resultSheet.getRange(1, 1, results.length, 5).setValues(results); // 5列に変更
}

実際に使う手順

コードをGASに入力して

スクリーンショット (81).png

実行ボタンを押すと、

スクリーンショット (45).png

この従業員リスト(サンプル)の住所欄と

スクリーンショット (46).png

この社宅情報(サンプル)を照合して

スクリーンショット (47).png

欲しい情報だけ書き出してくれました!

完成までの道のり

これを作るために、ChatGPTとたくさんお話をしました!
その制作過程を紹介します。

1.まずは基本の形を作ってもらう

私からの初めての質問と回答がこちら。

スクリーンショット (51).png

簡潔に聞きすぎたようで、こんなことができますよ、という案内のみで終了。
さらにここから、質問を重ねます。

スクリーンショット (53).png

最近覚えたばかりのGASを使いたいと思っていたので、使えるか質問してみました。
使えるよ、という回答と、そのコードを書いてくれました。
このコードが基盤となります。

スプリクト
function compareAddresses() {
  // スプレッドシートを開く
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  
  // 従業員リストシートと社宅情報シートを開く
  var employeeSheet = spreadsheet.getSheetByName("従業員リスト");
  var residenceSheet = spreadsheet.getSheetByName("社宅情報");

  // 従業員リストのAF列(住所)を取得
  var employeeAddresses = employeeSheet.getRange(2, 32, employeeSheet.getLastRow() - 1, 1).getValues();

  // 社宅情報シートの住所列を取得
  var residenceAddresses = residenceSheet.getRange(2, 1, residenceSheet.getLastRow() - 1, 1).getValues();
  
  // 結果を格納する配列
  var results = [];
  
  // 比較処理
  for (var i = 0; i < employeeAddresses.length; i++) {
    var empAddress = employeeAddresses[i][0];
    var matchFound = false;
    
    for (var j = 0; j < residenceAddresses.length; j++) {
      var resAddress = residenceAddresses[j][0];
      
      if (empAddress === resAddress) {
        results.push([empAddress, "完全一致"]);
        matchFound = true;
        break;
      }
    }
    
    if (!matchFound) {
      results.push([empAddress, "一致なし"]);
    }
  }

  // 結果を新しいシートに書き込む
  var resultSheet = spreadsheet.getSheetByName("比較結果") || spreadsheet.insertSheet("比較結果");
  resultSheet.clear();  // 前回の結果をクリア
  resultSheet.getRange(1, 1, results.length, 2).setValues(results);
}

2.細かい修正を入れる

このコードだとなぜかAF列を対象として照合しようとしていました。
なので、ここを直しつつ、次のお願いをします。

スクリーンショット (55).png

先ほどの完成品で紹介した社宅情報のGoogleスプレッドシート、A列とB列に住所が分かれて入力されていたので、それをつなげて照合してもらいます。
入力が途中になってしまったのに、しっかりと私の聞きたいことを汲み取ってくれました。さすがです!

一度これで試しに実行してみたのですが、すべてが「一致なし」の結果に・・・。
そこで、Googleスプレッドシートのデータがおかしいのかな?と確認していて気が付きました。

A列にアパート名、B列に県名や市町村名が書かれていたため、そのまま繋げてしまうと従業員リストの住所とは一致しない

そこでまた、ChatGPTにお願いをします。

スクリーンショット (57).png

スプリクト
// 社宅情報シートのA列とB列を取得し、B列とA列を入れ替え
  var residenceAddressesB = residenceSheet.getRange(2, 2, residenceSheet.getLastRow() - 1, 1).getValues();
  var residenceAddressesA = residenceSheet.getRange(2, 1, residenceSheet.getLastRow() - 1, 1).getValues();
  var residenceAddresses = [];

これが追加されました。

ここでさらに入れてほしい情報、「照合した日付」を結果に入れてもらえるようにします。

スクリーンショット (69).png

これで日付も結果に載せることができました
ここで試しに実行してみると、住所の並びも正しくなり、「完全一致」という結果が表れるようになりました。
これで一歩前進です。

3.問題発生!どうやって修正する?

ここまで順調に見えたかもしれませんが、実は、ここで一度立ち止まってしまいました。
最終的にすべて一致するようにサンプルを作っているのに、半分以上が一致なし。
結果として表示はされるけれど間違っている、ということしかわからなかったので、コードではなく、シートの情報に問題があるのかもしれないと思い、もう一度Googleスプレッドシートを見直します。
ここでいくつか思い当たるところが見つかりました。

1.住所とアパート名の間にスペースがあるものとないものがある
2.数字の半角と全角が従業員リストと社宅リストで統一されていない
3.「号」や「号室」がついていたりついていなかったりする

これをどうにかして同じものだと照合できればいいのですが、私にはさっぱりなので、ここでもChatGPTの出番です。

まず、スペースをどうにかしてもらいます。

スクリーンショット (59).png

次に、半角と全角関係なく照合できるようにします。
今回は住所に入っていませんが、アルファベットの大文字と小文字の区別も必要ないようにしてもらおうと思います。

スクリーンショット (61).png

最後に、「号」と「号室」の問題を解決してもらいます。

スクリーンショット (63).png

これでできたコードをGASに入力して実行します。
エラーなくできました!が、なぜか一致しているはずの住所が一致なしと出てしまいます。
おそらく号や号室がどこかに引っかかっているのかな、と思うのですが、何となくそう思うだけでどこを直せばいいのかわかりません。
とりあえず、自分が何となく考えたことをChatGPTに伝えてみます。

スクリーンショット (65).png

スクリーンショット (67).png

何度も直してもらいましたが、それでも治らないので、しつこく報告をします。
すると、やっと正しい結果がでるようになりました!

スクリーンショット (71).png

この修正をしてくれたおかげで、やっと正しく動かすことができました!

4.あと一歩!さらに欲しい情報を追加!

そして最後に、従業員番号と氏名を結果に記入したかったので、そこもお願いをしました。
一度に両方をお願いしたところ、なぜかコードがおかしくなったようで、エラーが続出してしまったので、ひとつずつ順番に追加をしてもらいました。

スクリーンショット (75).png

スクリーンショット (77).png

こちらが従業員番号の追加と修正点です。

スクリーンショット (78).png

スクリーンショット (79).png

そしてこちらが氏名の追加の修正点です。

これでやっとGASのコードが完成しました!

できたこと、もっとやりたいこと

ChatGPTにたくさん自分の意見を伝えて、こうして一つのコードを書くことができました。私一人では絶対に書くことができなかったです。
私がやったことといえば、

質問してできたコードを実行、結果を伝えてさらに要望を伝える

たったこれだけです。それなのにGASを動かすことができてしまいました。
改めて自分でCharGPTを使ってみて、その有能さを実感しました。
ただ、注意する点もありました。

質問方法が曖昧だったり、情報量が多いとエラーが出てしまうことがある

これに気を付ければ、今回私が作ったようなものであれば簡単に作ることができます。

今回私が作りたかった、「従業員リストと社宅情報を照合する」ということはできました。
今まで手作業で確認していた時間が削減され、その分ほかの業務に時間を充てることができるようになりました。
削減した時間を使って、そろそろ入社する新規の技能実習生の事前準備を少し早めに終わらせることができました。
今回これを作った意味があったなと感じています。

まだ自分で試している段階ですが、これが完成されたら、同じようなコードを作って社宅だけでなくいろいろな情報の照合手段として使えるようになるかもしれません。
完成したら、職場でもいろいろな人に使ってもらいたいです。

しかし、作ったものを実際の業務で使えるようにコードを書き換えて使用してみると、まだまだ改善したい部分が見つかりました。

・照合結果が「一致なし」だけを別のリストに抜き出したい
・Googleスプレッドシートをで照合したデータをExcelに自動で記載することはできる?
・従業員リストだけでなく、入社時の情報が記載されたリストも同時に照合させたい

実際に使ってみることで見えてくるものは意外と多かったなという感想です。
今回作ったコードに追加したり、GAS以外の方法も模索しながら、さらに実用性の高いものを作りたいと思います。
ChatGPTという力強い味方を手に入れたので、今後もいろいろなことを質問しながら学んでいきます。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?