【GAS】自動メール送信作ってみた。

## はじめに
自社業務でメンバーの勤務状況メールの送信状況をチェックして、送信していない人に個別で催促連絡するのが難儀だったため、以前から気になっていたGASを使って自動化してみた。
※GASの使い方などは、ここでは記載しない

#### ルール
・勤怠報告
　金曜日から月曜日までの間に、勤務連絡メールを提出すること

・メールチェック
　月曜の18時に自動実行させて、メール送信していないメンバーに対して、催促のメールを送る
　※GASの実行時間の設定方法もここでは記載しない

#### 実装

```js
function mailSend(e) {    
  
  // メールタイトル 
  let mailSubject = "【勤務連絡未提出】";  
  
  // スプレッドシートの情報
  let ss = SpreadsheetApp.getActiveSheet();  
  let dr = ss.getDataRange();  
  let lr = dr.getLastRow();  
  let values = dr.getValues();  
  
  // メール送信フラグ
  let bMailSend = false;  
  // 送信対象フラグ
  let isMailSend = false;  
  // 受信メールを取得
  const messagesForThreads = searchContactMail();
  // 未送信者へのメール内容を取得
  const mailBody = getMailBody();
  
  // 実施日を記述
  let now = new Date(); 
  //取得した現在日時を指定した表示形式に変換
  var time = Utilities.formatDate(now, "Asia/Tokyo", "yyyy/MM/dd HH:mm:ss");　
  // 現在日時を取得
  ss.getRange(1, 4).setValue(time);
  
  for (let i = 2; i < lr; i++) {  
    // values[i][1]←の0～3の数字はスプレッドシートの列数。A列が0,B列が1...  
    // 対象者のメールアドレス
    let TargetAddress = values[i][1];
    // 初期化
    isMailSend = false;
    
    for(const messages of messagesForThreads){
      // 対象者が4日以内に勤務連絡を送信しているか判定
      if ( messages[0].getFrom().match(TargetAddress)) {
        // スプレットに記述
        ss.getRange(i + 1, 3).setValue('送信済');
        isMailSend = true;
        break;
      } 
    }
    
    // メール送信処理
    if (!isMailSend) {
      // スプレットに記述
      ss.getRange(i + 1, 3).setValue('送信していない！');
      
      // 名前  
      let name = values[i][0];  
      // 対象者のメールアドレス
      let ToAddress = values[i][1];
      //メール内容  
      let mailhed = name + " さん\n\n";
      // 送信
      MailApp.sendEmail(ToAddress, mailSubject, mailhed + mailBody);
      bMailSend = true; 
    }
    
    // シートの処理完了を待つ 
    Utilities.sleep(5 * 1000); 
  }  
  
  if(bMailSend){  
    Browser.msgBox("メールを送信しました。");  
  }else{  
    Browser.msgBox("送信対象がいませんでした。");  
  }    
}  

function searchContactMail() {
  // 検索条件　※4日以内に週報を出していない人を条件に指定
  const query = 'newer_than:4d  subject:【勤務連絡】 ';
  const start = 0;
  const max = 20;
  
  const threads = GmailApp.search(query, start, max);
  const messagesForThreads = GmailApp.getMessagesForThreads(threads);
  
  // 取得したメール情報
  return messagesForThreads;
}

function getMailBody() {
  // メールの記載内容を記載
  return "勤務連絡の提出期限日です。\n";
}
```
#### スプレッドシート 
・A列にチェック対象者を記載
・B列に対象者のメールアドレスを記載
・C列はチェック時のメール提出状況（自動）
・D1は実行時間（自動）

![スクリーンショット 2021-05-02 13.34.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015999/bdf545e4-1159-80d8-db0f-e57501f8cd81.png)

#### おまけ
スプレッドシートのタブから実行出来るように、
以下を実行し、functionを登録？することで
スプレッドシートのタブにメールタブが生成され、メールタブの中に「勤務連絡確認」が生成されます。
　


```js
function onOpen() {  
  let ss = SpreadsheetApp.getActiveSpreadsheet();  
  let menuEntries = [];  
  
  //スプレッドシートのタブに表示される文字です。  
  ss.addMenu("メール", menuEntries);  
  
  //スプレッドシートのタブ内に表示される文字です。  
  menuEntries.push({name: "勤務連絡確認", functionName: "mailSend"});  
}  

```


## おわりに
GASを初めて触りましたが、Gmailとの連携も簡単で、
もっといろいろ出来そうだなーなんて思いました。
GASの実行時間の設定方法とかも時間出来れば記事にしようかと考え中です。
検索したらかなり出てくるのでわざわざ書くことでもないかと思ってますが・・・


## 参考
> ・[[GAS]Gmailで、定期的(1時間ごと)にメールを送信する方法]
(https://qiita.com/sew_sou19/items/583fdd0953b7d5634f65)