見出し画像

【GAS】Google Apps Script 活用事例HRMOS新卒エディションで登録した予定をチームの共有カレンダーにコピーするスクリプト

今後、学生の管理にスプレッドシートを使用しないという上からのお達しがあり、HRMOS 新卒エディションに乗り換える事になりました。

ただし、諸手を挙げて喜ぶような状況ではなく、素人目でも作り込みが甘い部分があります。

やはり痒い所に手が届かない部分があり、HRMOS上で登録した面接日程を、自分のカレンダーからチームの共有カレンダーへ移す作業を自動化するスクリプトを書きました。

スクリプトはこのような感じ

/**
 * HRMOS(新卒エディション経由)で登録した予定を、面接共有カレンダーに
 * コピーして移すスクリプト1次選考の日程を作成する
 * 
 * HRMOS上で、Googleカレンダーに登録した際、挿入されるURL
 * が間違っているバグの修正待ち
 *
 * 下記が正しく遷移するURLの例
 * https://n-ats.hrmos.co/candidates/***************
 * 
 * 
 */

function firstSelection(){
  const newEventTitle = '2024新卒_1次面接';
  editDefaultHrmosEventCommon_(newEventTitle);
  SpreadsheetApp.getUi().alert(`予定の登録が完了しました。`);
}



/**
 * プロンプトの入力内容に応じた名前が記載されている予定を探し、
 * 開始時刻、終了時刻、選考官などをコピーする
 * 
 * @param  {string} newEventTitle - カレンダーのタイトル(1次面接、2次面接など)
 * 
 * 
 */
function editDefaultHrmosEventCommon_(newEventTitle) {
  const query  = showPrompt_('応募者の名前を入力', '(例)野比のび太');
  const userId = Session.getActiveUser().getUserLoginId();
  console.log(`ユーザーのログインID: ${userId}`);

  //HRMOSとGoogleカレンダー連携状態で日程を登録すると、応募者の名前が入った状態で登録される
  const events      = getInterviewDate_(query, userId);

  //苗字については、高橋、鈴木、山本など漢字2文字のケースが多いため
  //長谷川や五十嵐などのように3文字の場合も、2文字で登録されます。(仕様)

  const lastName    = query.slice(0, 2);
  const hrmosUrl    = generateHrmosUrl_(events[0].description);
  const description = `${lastName}さん\n${hrmosUrl}`;

  console.log(description);

  //予定を移したいチーム共有カレンダーのカレンダーID
  const calendar   = CalendarApp.getCalendarById('*****************');
  const stringTime = events[0].start;

  //面接の開始時刻
  const startTime  = new Date(`${events[0].date} ${stringTime}`);
  console.log(`開始時刻を修正済みの文字列${stringTime}`);
    
 //面接の終了時刻
  const endTime = new Date(`${events[0].date} ${events[0].end}`);

 //会議室や面接の参加者など
  const options = {
    description: description,
    guests: events[0].attendance //面接の参加者
  }

 //予定の登録
  calendar.createEvent(newEventTitle, startTime, endTime, options);

  //チーム共有カレンダーに登録後、HRMOS経由で登録された自分のカレンダーの予定を削除
  CalendarApp.getDefaultCalendar().getEventById(events[0].eventId).deleteEvent();
  
}



/**
*
* 入力画面を表示させる
*
* @param  {string} title - 入力画面のタイトル
* @param  {string} sample - 記入例
* @return {string} スペースを省いた文字列
*
*/
function showPrompt_(title, sample) {
 const ui       = SpreadsheetApp.getUi();
 const response = ui.prompt(title, sample, ui.ButtonSet.OK);
 let input      = response.getResponseText();

 //スペースを省く
 input.replace(/\s/, '');

 switch (response.getSelectedButton()){
   case ui.Button.OK:
     console.log(`入力内容: ${input}`);
     break;
   case ui.Button.CLOSE:
     console.log('閉じるボタンが押されました。');
     break;
   default:
     console.log('処理が中断されました。');
 }//switch
 
 return input

}



/**
 * キーワードでカレンダーの予定を検索する
 * @param  {string} query - 検索キーワード
 * @param  {string} calId - カレンダーID。
 * @return {Object} 予定名、日付、開始時刻、終了時刻等、出席者を取得
 * 
 */
function getInterviewDate_(query, calId){
  const cal = CalendarApp.getCalendarById(calId);

  //直近2か月間の面談日程を検索する
  const startTime = new Date();
  const endTime   = new Date();
  endTime.setMonth(endTime.getMonth() + 2);
  
  //日付を指定した形式に直す関数
  const formatDate = (date, number, format) => {
    date.setDate(date.getDate() + number);
    return Utilities.formatDate(date, 'JST', format);
  }
  
  //HRMOS_IDを、Google Calendarで検索する事が出来る
  const options = {search: query};
  const events  = cal.getEvents(startTime, endTime, options).map(event => ({
    title:       event.getTitle(),
    eventId:     event.getId(),
    date:        formatDate(event.getStartTime(), 0, 'yyyy/MM/dd'),
    start:       formatDate(event.getStartTime(), 0, 'HH:mm'),
    end:         formatDate(event.getEndTime(), 0, 'HH:mm'),
    attendance:  getAttendeesName_(event),
    description: event.getDescription()
  }));

  console.log(events);
  console.log(`イベント予定数: ${events.length}`);

  return events

}

一応、書いては見たものの、現状HRMOS上でGoogleカレンダーの予定を見比べたりするUIがあまり良くありません。
ドラッグで面接時間を1時間にしたり、45分にすることがまだ出来なかった気がします。

それから自分の勤め先では、カレンダー詳細欄に記載する事が割と多くテンプレが使えないと登録作業がめんどいのですよ。

自分と似たようなことを考えている人間が、世の中に10人ぐらいはいると思うので、そんな方々に、この記事が届けばいいなと思っています。


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