【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
}
前回、書いたこの記事から思い付きました。
カレンダーの自動化については、こちらをご覧ください。
登録、情報の追記、シートへの書き出しなど盛り沢山です。
この記事が気に入ったらサポートをしてみませんか?