見出し画像

【GAS】Google Apps Script 活用事例 特定のキーワードが含まれている複数のシートから応募者の情報を取得するスクリプト

カジュアル面談の日程登録がだるい

勤め先では、社内で働くエンジニアとざっくばらんに話せる、カジュアル面談をWantedly経由で受け付けています。個人的には、シートを1枚にまとめて欲しいとずっと思っているのですが、シートを各職種ごとに分けて運用を行なっています。

幸い、Wantedly関連のシートと分かるように、シート名の最初にWAと入ってます。下記のような感じです。

・ WA_iOS
・ WA_Android

スクリプトを実行すると名前の入力画面が出てきて、応募者の名前を入力します。仮に職種別のシートが5枚あったとしたら、入力された名前が、5枚のシートのどこにあるかを検索して取得します。さらに、カレンダーの詳細欄に、名前とWantedlyのURLなどを転記する。ここまでを実務では自動化させました。

HRMOSの場合だと、HRMOS上で面接日程を登録すると、それがGoogleカレンダーにも反映されるのですが、Wantedlyにはそういう手の痒いところに届く激アツなアップデートはないので、手作業部分を効率化した次第です。(※俺が知らないだけの可能性もあります......泣)

全部を紹介すると、めちゃくちゃ長くなってしまうので、とりわけ、複数のシートから情報を取得するスクリプトの汎用性が高そうで、他でも使えそうだなと思ったので、その備忘録です。

スクリプトはこちら。

/**
* 職種別に存在する5つのシートから、対象の名前とWantedlyのリンク、コンフル等のデータを取得するスクリプト
* @param name 応募者の名前 プロンプトで入力してもらう想定
* @return  object  {名前, url1, url2} 
* 
*/

function getWantedlyApplicantInfo_(name){
 const spreadsheet  = SpreadsheetApp.getActiveSpreadsheet();
 const allSheets    = spreadsheet.getSheets();
 
 //シート名にWAが含まれるシートだけを残す
 const targetSheets = allSheets.filter(sheet => sheet.getName().includes('WA_'));
 console.log(targetSheets);
 
 //挙動としては、Ctrl + Fでシートを検索するのと全く同じ
 for(const sheet of targetSheets){
   const finder = sheet.createTextFinder(name).useRegularExpression(true);
   const results = finder.findAll();
   
   //職種別の各シート上に応募者の該当がない場合は処理をスキップ
   if(results.length === 0){continue}
   
   //もしシート上で該当する名前を見つけたら次の処理を実行
   else if(0 < results.length){
     
     //列の挿入対策、見出し行から対象の列を特定する
     const header = sheet.getDataRange().getValues()[1];
     const column = {
       status:     header.indexOf('ステータス'),
       date:       header.indexOf('応募日'),
       name:       header.indexOf('名前'),
       url:        header.indexOf('リンク'),
       confluence: header.indexOf('confluence'),
       isCheck:    header.indexOf('イベント接触有無'),
       first:      header.indexOf('人事1次'),
       memo:       header.indexOf('備考'),
     };
     console.log(column);
     
     //resultは列や範囲、値などを内包した連想配列になっている。
     for(const result of results){
       
       //該当した行を丸ごと取得して、後述する処理で不要な要素を削除する
       const array = sheet.getRange(result.getRow(), 1, 1, sheet.getLastColumn()).getDisplayValues().flat();
       console.log(`該当シート ${sheet.getName()}`);
       
       //['野比のび太', 'https://.....', 'https://....',]
       //名前、URL1, URL2 の3つの要素だけを残す
       const newArray = array.reduce((accumulator, current, index) =>{
         if(index === column.name || index === column.url || index === column.confluence){
           accumulator.push(current);
         }
         return accumulator}, []);//reduce
       
       //console.log(newArray);

       const info = {
         name:          newArray[0],
         wantedly:      newArray[1],
         confluence:    newArray[2],
       }

       console.log(info);
       return info

     }//for
   }//else
  }//for
}

前回、書いたこの記事から思い付きました。

カレンダーの自動化については、こちらをご覧ください。

登録、情報の追記、シートへの書き出しなど盛り沢山です。


この記事が気に入ったらサポートをしてみませんか?