GASでスプレッドシートにつけた勤怠から日報メールを送れるようにした


初投稿でなんだか緊張してます、、

## 背景
私が所属しているのはとっても小さな会社なので、日報はメール、勤怠はスプレッドシートでつけると言うことをやっています。
勤怠は良いのですが、日報は忘れることが多々あり、、

日報はこんな感じ
■ 業務日報
担当：name
日付：yyyy/mm/dd
勤務時間：hh:mm-hh:mm 控除時間：hh:mm

■ 業務内容
・project1
・project2

■ その他
etc..
こんな感じ。

同じようなことを、スプレッドシートにも書いて月次で管理しています。

## 問題点
主に３つ
・勤怠をスプレッドシートに入力するときと、日報メールを打つ時とで二重に同じことを入力している。
・日報には日報の、勤怠には勤怠のフォーマットがある
・メールは忘れがち
と、なんだかあんまりスマートじゃなく、、


## 解決法
### GASを利用して送信することにした
せっかく新年なので、勤怠管理で使ってるシートに送信ボタンつけてGAS(Google App Script)でスクリプトを書いて、メール飛ばせるようにすれば楽じゃないかと思いたち、やってみました。しかも多分すぐできる。

### シートの内容
今のシートはこんな感じです。
<img width="902" alt="スクリーンショット 0001-12-31 16.22.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242478/c3fe9068-253a-7af8-44d9-ccfae4bdcedb.png">

黄色の部分に報告者とメールアドレス（送信元）を入力するように欄を設けました。
案件リストに案件名を入れると、プルダウンリストと右側の案件ごとの時間集計に案件名が入ります。
スクショからははみ出てますが、毎日のコメントやその他メモを入れる欄も設けています。
これを任意の１行ずつ求めればいいですね。

### メールのエイリアスの設定

GASのスクリプトを書いていく前に、メールのエイリアスの設定をします。Gmailの設定→アカウントとインポートから、送信メールを追加します。これに登録されてないメールアドレスでGASから送ることはできません。
他のメールアドレスを追加から、SMTPサーバの情報を追加します。

<img width="924" alt="スクリーンショット 0001-12-26 17.27.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242478/26b8a15c-315b-1edb-3eec-390f3ed43248.png">

###  GASでスクリプトをかく

送信ボタンをおす→スクリプトを実行→ダイアログボックスが開いて日付を指定
としたいので、まずはダイアログボックスを開かせます。

```js
senddr.gs

function senddr() {  
  var sheet = SpreadsheetApp.getActiveSheet();
  var inputdate = Browser.inputBox('日報提出の日付を入力してください(m/d ex.1/7 10/2)');
  var inputrow = findRow2(sheet,inputdate,21)
}

```


findrow2と言うのは、入力された語を含む行数を取得する関数で、こちらを参考にしました。ファイルは分けずそのまま書いてあります。
https://tonari-it.com/gas-spreadsheet-find/



```js

findrow2.gs
function findRow2(sheet,val,col){ 
  var lastRow=sheet.getDataRange().getLastRow(); //対象となるシートの最終行を取得

  for(var i=1;i<=lastRow;i++){
    if(sheet.getRange(i,col).getValue() === val){
      return i;
    }
  }
  return 0;
}

```



簡単にif elseで内容が入力されているか確かめた後、 `  GmailApp.sendEmail()  ` で送信します。


```js

  if (inputrow == 0){
    Browser.msgBox("日付の入力が間違っています。");
  }
  else if (sheet.getRange(inputrow,4).isBlank()){
    Browser.msgBox("開始時間が入力されてません。");
  }
  else if (sheet.getRange(inputrow,5).isBlank()){
    Browser.msgBox("終了時間が入力されてません。");
  }
  else if (sheet.getRange(inputrow,6).isBlank()){
    Browser.msgBox("控除時間が入力されてません。0時間の場合は0:00を入力してください。");
  }
  else if (sheet.getRange(inputrow,19).isBlank()){
    Browser.msgBox("作業内容が未入力です。");
  }
  else if (sheet.getRange(inputrow,20).isBlank()){
    Browser.msgBox("コメントが未入力です。");
  }
  else{
 
  var date = sheet.getRange(inputrow, 1).getValue();
  var fordate = Utilities.formatDate(date,'Asia/Tokyo', 'yyyyMMdd');
  var hiduke = Utilities.formatDate(date,'Asia/Tokyo', 'yyyy年MM月dd日');
  var name =  sheet.getRange(1, 3).getValue();
  var subtitle = "日報_" + fordate + "_" + name ;
  var mail = sheet.getRange(1, 8).getValue();
 
  var client =  sheet.getRange(inputrow,3).getValue();
  var start = Utilities.formatDate(sheet.getRange(inputrow,4).getValue(),'Asia/Tokyo', 'HH:mm');
  var fin = Utilities.formatDate(sheet.getRange(inputrow, 5).getValue(),'Asia/Tokyo', 'HH:mm');
  var koujo = Utilities.formatDate(sheet.getRange(inputrow, 6).getValue(),'Asia/Tokyo', 'HH:mm');
  var gyoumu = sheet.getRange(inputrow, 19).getValue();
  var com = sheet.getRange(inputrow, 20).getValue();
  var body = 
      "■ 業務日報\n担当：" + name
      + "\n日付：" + hiduke
      +"\n勤務時間："+start + "-"+ fin
      +"\n控除時間："+ koujo
      +"\n案件："+client
      +"\n■ 業務内容\n"+gyoumu
      +"\n■ その他\n"+com;
    
    GmailApp.sendEmail('送り先のメールアドレス', 
                     subtitle, 
                     body, 
                     {
                         from: mail, 
                       name: name
                     });
  
  Browser.msgBox(inputdate + "の日報を送信しました。");
  }
}


```

## やってみて
思ったよりも簡単にできました、、
GASって便利ですね。
これからもいろいろ投稿できるよう頑張ります！