見出し画像

WindowsBatchファイルで社内日報作成を自動化してみた

こんにちは。スーパーソフトウェア東京オフィス技術部新入社員の伊藤です。
今回、WindowsのBatchファイルを使用して、社内日報の枠組み作成を自動化したので紹介させていただきます。


社内日報の枠組み概要

スーパーソフトウェア東京オフィスでは、毎日終業時に下記画像のような日報を提出しています。

この中で宛先、件名、本文の項目は毎日同じものを入力します。本文は業務内容等を記入するので、ここは自動化しません。
従って、今回Batchにやってもらう処理は以下になります。

1.Gmailを起動する
2.宛先(メールアドレスを入力する)
3.件名(題名、名前、日付)を入力する
4.本文の項目を入力する

Batchについて

Batch処理は、定期的な決まりきった大量の仕事を素早く正確にかつ、オフピーク時に行うことができます。従って、ヒューマンエラーを無くしたり、システムリソースを効率的に使用できるなど様々な利点があります。
現在でも、銀行システムの顧客の口座情報の更新や利息計算、財務会計システムの仕訳帳の作成など期間系のシステムで稼働している例を多く目にします。
毎日行う作業に、まさにもってこいということですね。

また、WindowsのBatchファイルを使用するために、環境構築は必要ありません。
メモ帳でもVSCodeでも、好きなテキストエディタで作成することが可能です。実行方法は定期実行と手動実行があり、定期実行はWindowsのタスクスケジューラやCronなどで実行することができます。

作成したプログラムと実行結果

以下、作成したBatchファイルと実行結果(ブラウザ、cmd、ログファイル)です。

@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion

::ログ設定
set LOGFILE=C:\batches\log.txt
set BATCHNAME=%~nx0
set ERRORLEVEL=0

echo -------------------------------- >> %LOGFILE%
echo 実行時間: %date% %time% >> %LOGFILE%
echo バッチ名: %BATCHNAME% >> %LOGFILE%

::実行するブラウザのパス指定
set BROWSER_PATH="C:\Program Files\Google\Chrome\Application\chrome.exe"

::宛先、件名、本文
set TO="example@example.com"
set month=%date:~5,2%
set day=%date:~8,2%
set fixed_Date=%month%%day%
set "name=伊藤"
set "fullname=伊藤"
set "SUBJECT=日報「%fullname%」%fixed_Date%"
set "body_sub=お疲れ様です、%name%です。本日の日報を送らせていただきます。^"
set "body_today=1.今日やったこと^^"
set "body_tomorrow=2.翌営業日にやること^^"
set "body_etc=3.その他"
set "body=!body_sub!!body_today!!body_tomorrow!!body_etc!"
set "BODY=!body:^=%%0A!"

::GmailのURLを構築
set URL="https://mail.google.com/mail/?view=cm&fs=1&to=%TO%&su=%SUBJECT%&body=%BODY%"

if not exist %BROWSER_PATH% (
    echo エラー: 指定されたブラウザのパスが存在しません。パスを確認してください。
    echo error: the path is not found. please check the path. >> %LOGFILE%
    set ERRORLEVEL=1
    goto end
)

start "" %BROWSER_PATH% %URL%

:end
if !ERRORLEVEL! neq 0 (
    echo エラー!ERRORLEVEL! 発生(ブラウザパスが不適切です) >> %LOGFILE%
    echo -------------------------------- >> %LOGFILE%
    echo エラー: 詳細は%LOGFILE%を確認してください。
) else (
    echo 処理完了 >> %LOGFILE%
    echo -------------------------------- >> %LOGFILE%
    echo 処理完了 送信ボタンを押してください。
)

pause

Batchファイルがあるディレクトリに移動し、「Batchファイル名.bat」で実行できます。(もしくはファイルをダブルクリックでも可能)

それでは実行してみましょう。

無事、自動で入力してくれました。

ログファイルにも正常に処理が行われたことが記録として残されています
(一応エラー時のログも載せておきます)。

コードの解説、ポイント

1.Batchとcmd設定

  • setlocal enabledelayedexpansion : Batchで遅延環境変数(Batchが変数を読み込むタイミングを遅らせるもの。後述します)を使うための宣言です。

2.ログファイル設定

  • 実行時間、実行ファイル名、実行結果を残す簡単なログの処理です。

3.ブラウザ、日報枠組み設定

  • ブラウザパス、日報の内容を設定します。日付の取得には、Windowsの環境変数である「date」と「time」を使用しています。

4.エラーハンドリング

  • エラーが起こる可能性が高いブラウザパスの設定にエラーハンドリングを付けています。

5.実行部分

  • startコマンドに設定したブラウザパスと日報の内容をコマンドとパラメータとして渡しています。

6.end部分

  • ERRORLEVELの中身によって分岐させ、処理が正常に終了したか確認をし、結果に応じてログを残しています。

遅延環境変数について

今回、Batchの学習で少し躓いたものを共有します。
それが「遅延環境変数」です。これは、Batchが変数を展開するタイミングを変更するものです。

分かりやすいように具体例から見ていきましょう。
以下のJavaのコードを見てください。

public class Main {
  public static void main(String[] args){
    int num = 5;
    if (num ==5) {
      num = num + 5;
      System.out.println(num);
    }
  }
}

最初に整数型の変数numを定義し、「5」を代入しています。その後で、「もしnumが5ならnumに5を加えてnumを出力する」という処理になっています。
実行結果はもちろん「10」です。

では、このコードをBatchに置きかえてみます。
また、Batchでは変数を「%変数%」の形で表記します。

@echo off
set num=5
if %num%==5 (
  set /a num+=5
  echo %num%
)

この実行結果は「5」になります。

「10にならないの?」と思いますよね。ここがBatchのひっかけポイントです。

では、Batchはどのように変数を展開しているのでしょうか。

Batchは変数がある「行」に到達した瞬間に変数を展開する、さらに「括弧」はその行数に関わらず、ひとまとまりで展開されます。
この例に当てはめると、if文の行に入った瞬間に行末に「 ( 」がありますから、括弧内全てが、この瞬間に展開されます。
この時点で変数numには格納されているのは「5」です。なので、括弧内で足し算を行っても(厳密には足し算は行われている)、出力結果は「5」になるわけですね。
このような変数の展開方法を「即時展開」といいます。

「いやいや、Javaみたいに変数を扱いたいよ!」と思いますよね。
これを解決してくれるのが「遅延環境変数」です(即時展開と対比して、「遅延展開」ともいいます)。
遅延環境変数を使うためには、「setlocal enabledelayedexpansion」と宣言する必要があります。宣言することで、それ以降どこでも遅延展開が使用できるので、先頭で宣言することが一般的です(遅延展開のスコープが絡んでくると括弧内のみで宣言する場合もあるようです)。

こうすることで、変数を展開するタイミングを「変数がある行に入った瞬間」から「変数を使用するコマンドに辿り着いた瞬間」に遅らせることができます。
また、変数の表記方法が遅延展開の場合は「!変数!」の形になります。
コードを修正すると以下のようになります。

@echo off
setlocal enabledelayedexpansion
set num=5
if %num%==5 (
  set /a num+=5
  echo !num!
)

これでnumを展開するタイミングは「echo !num! に辿り着いた瞬間」なので、足し算の結果が反映された「10」が出力されます。

これで変数をJavaの例のように扱うことができます。

まとめ

本記事では、Batch初心者なりにアウトプットを兼ねて簡単な自動化処理を紹介しました。
今回作成したBatchは定期実行で、個人的にこれから利用していこうと思います。
みなさんもBatchを利用して、業務の効率化を図ってみてはいかがでしょうか。


▼採用情報

▼新卒情報はWantedlyで

いいなと思ったら応援しよう!