こんにちは、あやこです。

私は非エンジニアで、RUNTEQというプログラミングスクールでカスタマーサポートをしており、そのメンバーをまとめる立場として働いています。

ただ、業務をしている中でGASを使って効率化できた事があったので、共有できればと思います!

元々行っていた面倒な業務

RUNTEQでは、日々入学を検討している方向けに「キャリア相談会」というものを実施していて、行った方の所感や、今後フォローメールを送っていいかなどを専用のスプレッドシートにまとめています。

説明会の予約が入ると、チームの共通アドレスへキャリア相談会を実施する方の情報が入ります。

こんな感じで、予約が入る度にメールが来るようになっています。

このメールが来た後、専用のスプレッドシートに、キャリア相談会の申込日・実施日・申込者の氏名・メールアドレスを入力していきます。

キャリア相談会のメールが入るたびにぽちぽちと行うのですが、簡単すぎる作業であるが故、漏れが発生しやすく、説明会の予約人数や実施人数を集計したいマーケ側からはよく「早く入力してください!」と催促を頂いてしまう事態となっておりました。

入力する担当者を決めて、マネジメントの力技で「やって!やったら報告して!」のような、管理方法をとっても良かったのですが、漏れが発生する可能性はあり、漏れが起こるたびに担当者に謝らせるようななんとも言えない時間が無駄だなと思い、GASの力で業務効率化をする事にしました。

GASのコードはこちら

function MailToForm() {
  //データを吐き出す箇所を指定
  var sheet_url = 'スプシのURL';
  var sheet_name = 'スプシのシート名';
  var ss = SpreadsheetApp.openByUrl(sheet_url);
  var sheet = ss.getSheetByName(sheet_name);

  // メール検索条件を設定。特定のタイトルで検索する。検索対象は直近8スレッドで十分そう。トリガーで毎日動かすので
  var title = 'subject:【RUNTEQ キャリア相談会申し込み】お申し込みが来ています。'; //タイトルが合致するメールを探す
  var thds = GmailApp.search(title, 0, 8);//条件に合致するメールのスレッドを取得
  var messe = GmailApp.getMessagesForThreads(thds);//スレッド内のメールを取得。[スレッド番号][メッセージ番号]の2次元配列になる

  //maxまで繰り返しで文面検索し、スプシに吐き出す
  for(var i = 0; i < messe.length; i++) {
    for(var j = 0; j < messe[i].length; j++) {

      var messageId = messe[i][j].getId();

      //もし、スプレッドシートに既に存在したら実行しない(idで重複判定する)
      if(!hasId(messageId)){

     //メール本文からスプシに載せたい文字列だけくり抜く
      var date = thds[i].getMessages()[j].getDate();
      var setDate = Utilities.formatDate(date, "JST","MM/dd");
      var body = messe[i][j].getPlainBody();

      var regName = new RegExp('名前: ' + '.*?' + '\r' );
      var Name = body.match(regName)[0].replace('名前: ', '').replace('\r', '');
      
      var regSend = new RegExp('メールアドレス: ' + '.*?' + '\r' );
      var Send = body.match(regSend)[0].replace('メールアドレス: ', '').replace('\r', '');
      var regDate = new RegExp('日時: ' + '.*?' + ' ' );
      var SetsumeiDate = body.match(regDate)[0].replace('日時: 2021/', '').replace('\r', '');
      //くり抜いた文字を入力すべき場所へ入力
      sheet.appendRow(["",setDate,SetsumeiDate, Name, Send, messageId]);
      }
    }
  }

	//重複判定用、メールのIDを出力する
  function hasId(id){  
    var data = sheet.getRange(1, 6,sheet.getLastRow(),1).getValues(); //F列にメールのID掲載するよう設定
    var hasId = data.some(function(value,index,data){
    return (value[0] === id);
  });
  return hasId;
}

  //受信日時順の昇順に並び替え
 let narabikae = sheet.getRange('B1:Z1000'); //全部並び替え対象にすると重すぎるので一部指定に。今後バグったらここが列超えてる可能性あり。
  narabikae.sort({column: 3, ascending: true}); //説明会実施日が3列目のためそこで降順並び替え

}

非エンジニアなのでnarabikaeなどローマ字表記の書き方があるのはご愛嬌。

メールフォルダからタイトルに合致するメールを探し、そのメールの必要な表記だけ切り抜き、重複ではないかメールのIDから判定して、重複されていないもののみ入力をするようなプログラムにすることができました。

その後トリガー指定で、毎日自動的にプログラムを動かすようにしました。

リリースしてからチームには発表

チームは非エンジニアでGASを使って開発している、と言われても分からないと思うので、やっている事は教えず、完全にツールができた状態で公開しました。

「もう入力いらないよ!」と言って、GASを動かした画面を画面共有するとチームからは感激の嵐。

それからも手間が少なくなって本当に良かったと言って頂けました。

こういう小さい業務を効率化するところからでも始めてみる事が大切だと思っています。

エンジニアではなくても、業務改善できる事はあるので、今後も積極的に行ってアウトプットしていきたいなと思っています!