業務効率化は、組織の競争力を左右する重要な要素です。
「何かを自動化して、時間と手間を削減したい!」という声は、開発者だけでなく、事務担当者や経営層まで幅広くあります。
そんな声に答えるのが C# です。
.NET の豊富なライブラリと、Windows だけでなく Linux もカバーするクロスプラットフォームサポートにより、デスクトップアプリから Web まで、あらゆる領域で自動化スクリプトを書きやすくしています。
2026年版として特に注目すべき、最新ライブラリや API を組み込んだ自動化スクリプトを 10 個まとめました。
まずは何を自動化すべきか―という背景を整理し、次に具体的に「どう書くか」をコード例とともに解説します。
1. ディレクトリ監視&自動アーカイブ
業務で定期的にファイルを受け取ることがある場合、ディレクトリ監視は時間を大幅に短縮します。
.NET の FileSystemWatcher を使えば、ファイルの生成・変更・削除を即座に検知できます。
using System;
using System.IO;
using System.IO.Compression;
class ArchiveWatcher
{
static void Main()
{
var watcher = new FileSystemWatcher(@"C:\DropFolder")
{
NotifyFilter = NotifyFilters.FileName | NotifyFilters.CreationTime,
Filter = "*.txt"
};
watcher.Created += OnCreated;
watcher.EnableRaisingEvents = true;
Console.WriteLine("監視中… Ctrl+C で終了");
Console.ReadKey();
}
private static void OnCreated(object sender, FileSystemEventArgs e)
{
string zipPath = Path.Combine(@"C:\Archive", $"{Path.GetFileNameWithoutExtension(e.Name)}.zip");
ZipFile.CreateFromDirectory(@"C:\DropFolder", zipPath);
File.Delete(e.FullPath);
Console.WriteLine($"【自動】{e.Name} をアーカイブしました。");
}
}
上記は単純なテキストファイルを受け取るケースですが、 Filter を拡張すれば画像・ログ・レポートなど多様なファイルを対象にできます。
2. メール送信自動化(送信済みログ付き)
週次レポートや毎朝の営業先連絡など、メール自動送信は頻繁に要求されます。
.NET の SmtpClient で簡単に送信できますが、送信ログを残すことで後から確認や再送がスムーズです。
using System;
using System.Net;
using System.Net.Mail;
using System.IO;
class MailAuto
{
private static string logFile = @"C:\Logs\maillog.txt";
static void Main()
{
SendEmail(
to: "sales@example.com",
subject: $"月次レポート {DateTime.Today:yyyy-MM-dd}",
body: "添付のレポートをご確認ください。"
);
}
static void SendEmail(string to, string subject, string body)
{
var mail = new MailMessage("noreply@mycompany.com", to, subject, body);
mail.IsBodyHtml = false;
using var client = new SmtpClient("smtp.mycompany.com")
{
Port = 587,
Credentials = new NetworkCredential("user", "pass"),
EnableSsl = true
};
try
{
client.Send(mail);
Log($"送信成功: {to} / {subject}");
}
catch (Exception ex)
{
Log($"送信失敗: {ex.Message}");
}
}
static void Log(string message)
{
var record = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} - {message}";
File.AppendAllLines(logFile, new[] { record });
Console.WriteLine(record);
}
}
ポイント
- ログファイルで送信履歴を保存 → 再送時の判断
- SMTP サーバーの設定は外部設定ファイル(
appsettings.json等)に分離すると可搬性が向上
3. データベースバックアップ自動化
データベースは定期的にバックアップを作る必要があります。SQL Server なら sqlcmd を呼び出すか、Ado.NET で直接操作できます。
using System;
using System.Data.SqlClient;
using System.IO;
class DbBackup
{
static void Main()
{
string backupPath = $@"C:\Backups\MyDb_{DateTime.Now:yyyyMMdd}.bak";
string connectionString = "Server=.;Database=MyDb;Trusted_Connection=True;";
var backupSql = $@"BACKUP DATABASE MyDb TO DISK = N'{backupPath}' WITH FORMAT, MEDIANAME = 'MyDbBackup', NAME = 'Full Backup of MyDb';";
using var conn = new SqlConnection(connectionString);
using var cmd = new SqlCommand(backupSql, conn);
try
{
conn.Open();
cmd.ExecuteNonQuery();
Console.WriteLine($"【バックアップ完了】{backupPath}");
}
catch (Exception ex)
{
Console.Error.WriteLine($"【バックアップ失敗】{ex.Message}");
}
}
}
実務上のポイント
- バックアップファイルを Azure Blob Storage へ自動アップロード(
Azure.Storage.Blobsを使う) - バックアップ失敗をメールで通知
- 7 日ごとに古いバックアップを自動削除
4. Excel マクロではなく C# でのバッチ処理
Excel VBA を使わずに C# で大量データを処理する例です。EPPlus ライブラリを使うと、Excel ファイルの読み書きが高速で安全に行えます。
using System;
using System.IO;
using OfficeOpenXml;
class ExcelBatch
{
static void Main()
{
string input = @"C:\Data\input.xlsx";
string output = @"C:\Data\output.xlsx";
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
using var package = new ExcelPackage(new FileInfo(input));
var worksheet = package.Workbook.Worksheets[0];
int rowCount = worksheet.Dimension.Rows;
for (int row = 2; row <= rowCount; row++)
{
var name = worksheet.Cells[row, 1].Text;
var score = double.Parse(worksheet.Cells[row, 2].Text);
// 例: 成績が 70 未満なら赤くハイライト
if (score < 70)
worksheet.Cells[row, 2].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
worksheet.Cells[row, 2].Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.Red);
}
package.SaveAs(new FileInfo(output));
Console.WriteLine($"【Excel処理完了】{output}");
}
}
- EPPlus は .NET Standard 2.0 以降から正式に商用版で購入が必要な場合があります。
- 大量データでも高速に処理可能(数万行でも数秒以内)
5. Web スクレイピング(Headless ブラウザ)
Web から定期的に情報を取得する必要がある場合、 Selenium と Headless Chrome を組み合わせると UI を見せないでスクレイピングできます。
using System;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System.IO;
class WebScraper
{
static void Main()
{
var options = new ChromeOptions();
options.AddArgument("--headless");
options.AddArgument("--disable-gpu");
options.AddArgument("--no-sandbox");
using var driver = new ChromeDriver(options);
driver.Navigate().GoToUrl("https://example.com/products");
// 例: 商品名と価格を取得
var items = driver.FindElements(By.CssSelector(".product-item"));
using var writer = new StreamWriter(@"C:\Data\products.txt");
foreach (var item in items)
{
var name = item.FindElement(By.CssSelector(".title")).Text;
var price = item.FindElement(By.CssSelector(".price")).Text;
writer.WriteLine($"{name}\t{price}");
}
Console.WriteLine("【スクレイピング完了】products.txt を出力");
}
}
- ポイント:
Selenium.WebDriverとSelenium.WebDriver.ChromeDriverを nuget でインストール - 定期実行は Windows Task Scheduler か Azure Functions で実行可
6. API連携自動化(WebHook 受信+処理)
外部サービス(Slack、Teams、Jira など)と連携し、イベントを受信して自動処理を行う簡易サーバーを作ります。ASP.NET Core Minimal API が手軽です。
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Hosting;
using Microsoft.AspNetCore.Http;
using System.Text.Json;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapPost("/webhook", async (HttpRequest req) =>
{
using var reader = new StreamReader(req.Body);
var body = await reader.ReadToEndAsync();
var payload = JsonSerializer.Deserialize<WebhookPayload>(body);
// 例: 受信したデータを DB に保存
SaveToDatabase(payload);
return Results.Ok("OK");
});
app.Run("http://0.0.0.0:5000");
void SaveToDatabase(WebhookPayload payload)
{
// 実装例:ファイル出力
File.AppendAllText(@"C:\Data\webhook.log",
$"{DateTime.Now:O} - {payload.Id}\n");
}
public class WebhookPayload
{
public string Id { get; set; }
public string Event { get; set; }
}
- Docker でコンテナ化すると Azure Container Apps へデプロイ容易
- HTTPS を設定し、認証(Bearer Token 等)で保護
7. CI/CD の自動化(PowerShell + dotnet CLI)
GitHub Actions でビルド・テスト・デプロイを自動化する際、C# の dotnet CLI を呼び出すスクリプトは頻繁に使われます。
#!/usr/bin/env bash
set -e
# 1. ビルド
dotnet build src/MyApp.csproj -c Release
# 2. テスト
dotnet test tests/MyApp.Tests.csproj -c Release --logger "trx;LogFileName=test-results.trx"
# 3. Docker イメージ作成
docker build -t myapp:$(git rev-parse --short HEAD) -f Dockerfile .
# 4. コンテナレジストリへ push
docker tag myapp:$(git rev-parse --short HEAD) myregistry.azurecr.io/myapp:$(git rev-parse --short HEAD)
docker push myregistry.azurecr.io/myapp:$(git rev-parse --short HEAD)
echo "CI/CD 完了"
- GitHub Secrets に Azure Container Registry の認証情報を登録
- 上記スクリプトを
ci.ymlで呼び出すことで、1 行でビルド・テスト・デプロイが完了
8. 時間ベースのタスクスケジューラ(Windows だけでなく Linux も可)
System.Threading.Timer を使った簡易スケジューラは、.NET Core でクロスプラットフォームに対応します。
using System;
using System.Threading;
class SchedulerDemo
{
private static Timer _timer;
static void Main()
{
_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromHours(1));
Console.ReadLine();
}
private static void DoWork(object state)
{
Console.WriteLine($"【定時実行】{DateTime.Now}");
// ここに処理を書く
}
}
- より複雑なジョブ(Cron 形式)を扱うには Quartz.NET を検討
- Windows Service として実行したい場合は Worker Service テンプレートを利用
9. ログ集約と通知システム
業務アプリのログを一元管理し、異常が検知されたら Slack へ通知するシンプルなサンプルです。Serilog と Serilog.Sinks.Slack を使うと設定は簡単。
using Serilog;
using Serilog.Events;
class LoggingDemo
{
static void Main()
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Information()
.WriteTo.Console()
.WriteTo.File(@"C:\Logs\app.log",
rollingInterval: RollingInterval.Day)
.WriteTo.Slack("YOUR_SLACK_WEBHOOK_URL",
restrictedToMinimumLevel: LogEventLevel.Error,
customizeMessage: (msg) => msg.Facility("MyApp"))
.CreateLogger();
Log.Information("アプリ起動");
try
{
throw new Exception("想定外のエラー");
}
catch (Exception ex)
{
Log.Error(ex, "エラーが発生しました");
}
Log.CloseAndFlush();
}
}
- Slack だけでなく Microsoft Teams 用の Webhook に置き換えることも簡単
- Azure Monitor へのエクスポートを行えば、クラウドベースのダッシュボードでリアルタイム監視が可能
10. レポート自動生成(PDF )
業務では PDF へのレポート作成が頻繁にあります。iText7 でスタイリッシュな PDF を簡単に生成
using System.IO;
using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;
class PdfReport
{
static void Main()
{
string outPath = @"C:\Reports\sales_report.pdf";
using var pdfWriter = new PdfWriter(outPath);
using var pdfDoc = new PdfDocument(pdfWriter);
var doc = new Document(pdfDoc);
doc.Add(new Paragraph("月次売上レポート")
.SetFontSize(18)
.SetBold());
doc.Add(new Paragraph($"日付: {DateTime.Today:yyyy-MM-dd}")
.SetFontSize(12));
// テーブル例
var table = new Table(3);
table.AddHeaderCell("商品");
table.AddHeaderCell("数量");
table.AddHeaderCell("売上");
// ダミーデータ
table.AddCell("A商品");
table.AddCell("120");
table.AddCell("¥120,000");
table.AddCell("B商品");
table.AddCell("80");
table.AddCell("¥80,000");
doc.Add(table);
doc.Close();
Console.WriteLine($"【PDF作成完了】{outPath}");
}
}
- CSV から自動生成する場合は CsvHelper で読み込み、上記 PDF 作成ロジックに渡すだけ
- PDF のテンプレートを iText 7 Layout で作成すると、デザインの統一感を保てます
まとめ
- ディレクトリ監視 でファイルを自動アーカイブ
- メール送信 をログ付きで自動化
- データベースバックアップ とクラウドへの自動アップロード
- Excel と Web スクレイピング で大量データ処理
- API連携 で外部サービスと自動連携
- CI/CD でビルド・テスト・デプロイを完全自動
- タスクスケジューラ で定時ジョブをクロスプラットフォーム実装
- Serilog でログ集約と異常時通知
- PDF レポートを簡易自動生成
これらのサンプルを組み合わせることで、ほぼすべての業務プロセスをコードで「自動化」できる基盤が構築できます。
まずは自社の「手間がかかっている」作業を洗い出し、上記実装例のいずれかに置き換えてみてください。
C# は「開発と維持が楽」として多くの企業で採用されています。是非、これを踏み台にさらに高度な自動化・データ化を進めてみてください。

コメント