見出し画像

【GAS】Google Apps Script 活用事例 正規表現を駆使してメールを抽出して、Schooの番組表をSpreadsheetで作ろう

新しい職場では、採用系のお仕事の事務サポートをやっています。採用管理システム(HRMOS)とSpreadsheetを行き来しながら、コピペを延々と繰り返す仕事がありまして.....「マジか、コレ......(泣)」と思いながら働いています。

前職では、ジョブカンWFから送られてくるメールをSpreadsheetに書き出して、ダブルチェックなどに使っていたので、現職でもその仕組みを応用しようと思って過去のエントリーを読み直したら、スクリプトが、めっちゃ酷い事に気付きリライトしました。(裏を返せば、成長の軌跡でもある.....。)

最終的には、採用計画などに使われるSpreadsheetに書き込む事を想定しているため、漏れなく、確実にデータを反映させる必要があります。

職場のデータには、貸与パソコンでしかアクセス出来ない事から、今回は、自分のGmailアカウントから、練習に使えるいい素材は無いかなと探したら、Schooから届くメールがありました。

スクリーンショット 2020-08-22 8.39.51

上記のメールから、講義日程を抽出し、カレンダーに登録する作業を自動化しようと思いました。1通につき、新着授業が3つあります。この授業を正規表現で全て取り出してみたいと思います。

GmailからSchooの新着授業を抽出するスクリプト


function Schoo() {
 const spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
 const exportSheet = spreadSheet.getSheetByName('Schoo');
 const values      = getGmail();
 
 //貼り付けシートのステータスをクリアする
 exportSheet.getRange(2, 6, exportSheet.getLastRow()-1, 1).clearContent();
 
 if(0 < values.length){
   exportSheet.getRange(2, 1, values.length, values[0].length).setValues(values);
 }//if
}//end


function getGmail(sheetName, searchWords) {
 
 const query       ='("新着授業のお知らせ")';
 const threads     = GmailApp.search(query, 0, 7);
 
 let arrayMessages = [];
 console.log(threads);
 
 
 //スレッドを取得する
 for (const thread of threads){
   
   const messages = thread.getMessages();
   
   //一つ一つのスレッドにある各メッセージを取得する。
   for(const message of messages){
     
     const startDate   = message.getPlainBody().match(/.*:00/g);
     const lessons     = message.getPlainBody().match(/▼.*/g);
     const lessonsUrl  = message.getPlainBody().match(/https.*/g);
     
     console.log(lessons.length);
     console.log(`${lessons}\n`);
     
     //処理がコケるため、正規表現にマッチしない場合は、スキップ
     if(lessons === null){continue};
     
     for(let i = 0; i < lessons.length; i++){
       //日付を分ける
       if(!startDate[i]){continue}
       
       const d    = startDate[i].split(' ');
       const date = d[0];//授業開始日
       const time = d[2];//放送時間
       const day  = d[1];//曜日
       
       const lesson     = lessons[i].replace('▼','');
       const lessonUrl  = lessonsUrl[i];
       
       arrayMessages.push([date, time, day, lesson, lessonsUrl]);
       
     }//for
   }//for
 }//for
 return arrayMessages
}//end

matchはgフラグをつけると、正規表現でヒットしたフレーズを全て抽出します。

threads(スレッド)の中にメッセージがあって、それを取り出しています。

スクリーンショット 2020-08-22 9.38.53

こんな感じで、書き出す事が出来ます!!

カレンダー登録のスクリプト

function registerCal() {
 const calendar    = CalendarApp.getCalendarById('***********');
 const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
 const sheet       = spreadsheet.getSheetByName('Schoo');
 const values      = sheet.getDataRange().getValues();
 
 
 for(let i = 1; i < values.length; i++){
   //二重登録防止のため A列が空白以外かつ、ステータスが空白のイベントのみを登録
   if(values[i][0] !== '' && values[i][5] === ''){
     
     //開始時刻
     const calTitle  = values[i][3];
     const startTime = new Date(values[i][0]);//イベント予定日
     startTime.setHours(values[i][1].getHours());
     startTime.setMinutes(values[i][1].getMinutes());
     
     //終了時刻
     const endTime = new Date(startTime);
     endTime.setHours(values[i][1].getHours() + 1);
     endTime.setMinutes(values[i][1].getMinutes());
     
     //詳細
     const options = {
       location:    values[i][5],
       guests:      values[i][6],
       description: values[i][7],
       sendInvites: false
     }
     
     console.log('catTitle %s startTime %s endTime %s',calTitle,startTime,endTime);
     console.log('options %s', options.description);
     calendar.createEvent(calTitle, startTime, endTime, options);
     
     const row = i + 1;
     sheet.getRange(row, 6).setValue('登録済');
   }//if
 }//for
}//end

Schooの講義カレンダーを作りました。

リライトした過去エントリー

ポップアップ通知を加える

人によってはポップアップ通知がうざいと思う人もいると思うのですが、自分的には、あってもいいかなと思ったので、ポップアップ通知をつけてみました。

function addPopupReminder() {
 const cal  = CalendarApp.getCalendarById('******************');
 
 //今日から2週間後の予定を取得
 const today      = new Date();
 const targetDate = new Date();
 targetDate.setDate(targetDate.getDate() + 7);//1週間後
 
 const events = cal.getEvents(today, targetDate);
 console.log(events);
 
 for(const event of events){
   event.addPopupReminder(5);
 }
 
 const stringDate = (date, format) =>{
   return Utilities.formatDate(date, 'JST', format)
 }
 
 //ログ確認用
 const startTime = stringDate(today,'yyyy/MM/dd');
 const endTime   = stringDate(targetDate,'yyyy/MM/dd');
 console.log(`取得開始日: ${startTime}\n取得終了日: ${endTime}`);
}

カレンダーの予定取得や、予定登録のスクリプトはこちら。


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