見出し画像

【GAS】Google Apps Script 活用事例 採用イベントの参加者から応募があったら、シートにチェックするスクリプト

イメージとしては、採用イベントに参加してくれた学生の名簿が既にあって、シート上の情報とGmaiAppで取得した学生名が一致するかをチェック、加えて、チェック欄が空白かどうかも確認して空白ならチェックをつけるみたいな感じです。

さらにHRMOSの自動通知メール(HTMLメール)から名前を正規表現で抽出します。

コード全文はこんな感じ

/**
* 23卒採用_プレエントリーのメールを抽出する
* メールから抽出した名前と、シート上の名前が一致したら、E列に〇をつける
*/

function getPreEntryMail() {

 //タイトルが23卒採用_プレエントリーというメールを直近から20件検索
 const nameArray = getPreEntryName_('23卒採用_プレエントリー',0, 20);
 const sheet     = getSheetByUrl_('***********************');
 const values    = sheet.getDataRange().getDisplayValues();
 const column    = getSupportersSheetHeaderIndex_(values, 1, 0);

 for(let i = 0; i < nameArray.length; i++){
   for(let j = 0; j < values.length; j++){
     const name           = nameArray[i];
     const sheetInfo      = {name: values[j][column.name]};

     //メールから抽出した名前と、シート上の名前が一致しなかったら、スキップ
     //処理速度向上のために、この位置に置いている
     if(name !== sheetInfo.name){continue}

     const row            = j + 1;
     const preEntryColumn = column.preEntry + 1;
     const range          = sheet.getRange(row, preEntryColumn);

     if(name === sheetInfo.name && range.isBlank()){
       console.log(`行: ${row}, 名前: ${name}, ${range.getValue()}, ${range.isBlank()} `);
       console.log(`書き込む位置: ${range.getA1Notation()}`);

       range.setValue('〇');
       console.log(`空白かどうか: ${range.isBlank()}, value: ${range.getValue()}`);
     }
   }//for_j
 }//for_i
}


//検索キーワード、 検索開始点(通常は0を指定)、メールを検索したい件数
function getPreEntryName_(query, start, quantity) {
 const threads     = GmailApp.search(query, start, quantity);
 let arrayMessages = [];
 let count         = 0;
 
 //スレッドを取得する
 for (const thread of threads){
   
   const messages = thread.getMessages();
   
   //一つ一つのスレッドにある各メッセージを取得する。
   for(const message of messages){
     const date       = message.getDate();
     const plainText  = message.getPlainBody();
     const htmlText   = message.getBody();
     
     //tdタグの削除と名字と名前の間のスペースを削除する
     const name = htmlText.match(/<td.*\/td>/g)[1]
     .replace(/.*">/,'')
     .replace(/<\/.*/, '')
     .replace(/\s/,'');

     //console.log(plainText);
     //console.log(htmlText);
     
     console.log(name);

     count += 1;
     arrayMessages.push(name);
   }
 }
 console.log(`該当:${count} 件`);
 console.log(arrayMessages);
 return arrayMessages
}

独立した関数について

const column = getSupportersSheetHeaderIndex_(values, 1, 0);

こちらは、列の挿入などがあった時に、スクリプトを修正せずに済むように見出し行をindexOfで検索して、番号を返す関数です。サンプルは下記の通りです。

//1行目に見出しがある場合は、sheet.getDataRange().getValues()[0];
const array  = ['ID', '名前', '部署'];
const column = {
  id:      array.indexOf('ID'),
  name:    array.indexOf('名前'),
  section: array.indexOf('部署'),
}
console.log(column);
const sheet = getSheetByUrl_('***********************');

シートのURLから、シートオブジェクトを取得する方法です。シート名が変わった時でも挙動する点がとてもスマートです。上記のツイートみたいに無駄にイライラする事がなくなるという訳です。ただ、欠点もあって、この方法で取得するとなぜか、ActiveCellの取得がうまくいかないという欠点があります。

HRMOS関連はこちらにまとめています!!

こちらは、書類選考に回した学生の情報を元にスプレッドシートに転記するというものです。Gmailの自動化で最も活用しているスクリプトです。

こちらも理屈は同じで、HRMOS経由で届いたメールからスプレッドシート に転記するスクリプトです。

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