GASで業務自動化する5つの方法
Google Apps Script(GAS)を使った業務自動化の方法を5つ紹介。メール自動送信、スプレッドシート更新、Slack通知など、コピペで使えるコード付きで解説します。
GASで業務自動化する5つの方法
こんな悩みありません?
- 毎日同じメールを送るのがダルい
- スプレッドシートのデータ更新を手でやっている
- 週次レポート作成に時間を取られすぎ
- ファイル整理が追いつかない
- チームへの連絡を忘れがち
これ、全部GASで自動化できます。
プログラミングに詳しくなくても大丈夫。この記事のコードをコピペするだけで、けっこういろいろできるようになります。
GASって何?
Google Apps Script(GAS)は、Googleが提供している無料のスクリプト言語です。JavaScriptベースで、Gmail、スプレッドシート、カレンダー、Driveなど、Google Workspaceのサービスと連携できます。
特徴:
- 無料で使える
- サーバー不要(クラウドで動く)
- 時刻指定やイベントトリガーで自動実行
- Google Workspaceとの連携が簡単
方法1: 定期メール自動送信
何ができる?
毎週月曜日に定例会議のリマインドメールを自動で送る、みたいなことができます。
毎週30分かかっていたメール作成作業が、0分になります。送信忘れもなくなります。
設定手順
- Google スプレッドシートを開く
- メニュー「拡張機能」→「Apps Script」を選択
- 以下のコードを貼り付け
/**
* 定期メール自動送信
*/
function sendWeeklyReminder() {
const recipients = "team@example.com";
const subject = "【リマインド】週次定例会議";
const body = `
チームの皆様
本日10:00から週次定例会議です。
下記のMeetリンクからご参加ください。
【会議URL】
https://meet.google.com/xxx-xxxx-xxx
【アジェンダ】
1. 先週の振り返り
2. 今週の目標
3. 課題共有
よろしくお願いします。
`.trim();
GmailApp.sendEmail(recipients, subject, body);
Logger.log(`メール送信完了: ${recipients}`);
}
トリガー設定
- スクリプトエディタ左の「トリガー」アイコンをクリック
- 「トリガーを追加」
- 設定:
- 実行する関数:
sendWeeklyReminder - イベントのソース: 時間主導型
- タイプ: 週ベースのタイマー
- 曜日: 毎週月曜日
- 時刻: 午前9時〜10時
- 実行する関数:
応用: 個別メール送信
スプレッドシートのリストから個別にメールを送る場合:
function sendPersonalizedEmails() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("メール送信リスト");
const data = sheet.getDataRange().getValues();
for (let i = 1; i < data.length; i++) {
const email = data[i][0]; // A列: メールアドレス
const name = data[i][1]; // B列: 名前
const message = data[i][2]; // C列: メッセージ
GmailApp.sendEmail(email, `${name}様へのお知らせ`, `${name}様\n\n${message}`);
}
}
方法2: スプレッドシート自動更新
何ができる?
複数のシートからデータを集めて、サマリーを自動で更新します。
毎日1時間かかっていたデータ更新作業が、0分になります。人的ミスもなくなります。
コード
/**
* 日次サマリー自動更新
*/
function updateDailySummary() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const salesSheet = ss.getSheetByName("売上データ");
const summarySheet = ss.getSheetByName("日次サマリー");
// 売上集計
const salesData = salesSheet.getDataRange().getValues();
let totalSales = 0;
for (let i = 1; i < salesData.length; i++) {
totalSales += salesData[i][2]; // C列: 売上金額
}
// サマリーに書き込み
const today = new Date();
const row = summarySheet.getLastRow() + 1;
summarySheet.getRange(row, 1).setValue(today);
summarySheet.getRange(row, 2).setValue(totalSales);
Logger.log(`更新完了: 売上=${totalSales}`);
}
毎日深夜1時に自動実行する場合は、トリガーで「日タイマー」を選んで設定します。
応用: 外部APIからデータ取得
function fetchExternalData() {
const url = "https://api.example.com/data";
const response = UrlFetchApp.fetch(url);
const json = JSON.parse(response.getContentText());
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("APIデータ");
sheet.clear();
sheet.getRange(1, 1, 1, 3).setValues([["ID", "名前", "値"]]);
json.forEach((item, index) => {
sheet.getRange(index + 2, 1, 1, 3).setValues([[item.id, item.name, item.value]]);
});
}
方法3: Slack通知
何ができる?
スプレッドシートの条件を満たしたら、Slackに通知を飛ばします。
重要な更新をリアルタイムでチームに共有できます。通知忘れがなくなります。
設定手順
- Slackで「Incoming Webhooks」を追加
- 通知先チャンネルを選択
- Webhook URLをコピー
コード
function notifyToSlack() {
const webhookUrl = "https://hooks.slack.com/services/YOUR/WEBHOOK/URL";
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("売上データ");
const lastRow = sheet.getLastRow();
const salesAmount = sheet.getRange(lastRow, 3).getValue();
// 売上が100万円超えたら通知
if (salesAmount > 1000000) {
const message = {
"text": `:tada: 売上が100万円突破! 本日の売上: ¥${salesAmount.toLocaleString()}`
};
UrlFetchApp.fetch(webhookUrl, {
"method": "post",
"contentType": "application/json",
"payload": JSON.stringify(message)
});
}
}
応用: エラー通知
function sendErrorNotification(errorMessage) {
const webhookUrl = "https://hooks.slack.com/services/YOUR/WEBHOOK/URL";
const message = {
"text": `:warning: エラー発生\n\`\`\`${errorMessage}\`\`\``
};
UrlFetchApp.fetch(webhookUrl, {
"method": "post",
"contentType": "application/json",
"payload": JSON.stringify(message)
});
}
// try-catchでエラーを捕捉して通知
function safeExecute() {
try {
updateDailySummary();
} catch (error) {
sendErrorNotification(error.toString());
}
}
方法4: Google Drive自動整理
何ができる?
30日以上更新されていないファイルを自動でアーカイブフォルダに移動します。
ファイル検索時間が80%くらい減ります。
コード
function organizeFiles() {
const sourceFolderId = "YOUR_SOURCE_FOLDER_ID";
const archiveFolderId = "YOUR_ARCHIVE_FOLDER_ID";
const sourceFolder = DriveApp.getFolderById(sourceFolderId);
const archiveFolder = DriveApp.getFolderById(archiveFolderId);
// 30日前の日付
const cutoffDate = new Date();
cutoffDate.setDate(cutoffDate.getDate() - 30);
const files = sourceFolder.getFiles();
let movedCount = 0;
while (files.hasNext()) {
const file = files.next();
if (file.getLastUpdated() < cutoffDate) {
file.moveTo(archiveFolder);
movedCount++;
}
}
Logger.log(`${movedCount}個のファイルをアーカイブ`);
}
応用: ファイル名の自動リネーム
function renameFiles() {
const folderId = "YOUR_FOLDER_ID";
const folder = DriveApp.getFolderById(folderId);
const files = folder.getFiles();
while (files.hasNext()) {
const file = files.next();
const currentName = file.getName();
const createdDate = file.getDateCreated();
const dateStr = Utilities.formatDate(createdDate, "JST", "yyyyMMdd");
// 日付プレフィックスがなければ追加
if (!currentName.match(/^\d{8}_/)) {
file.setName(`${dateStr}_${currentName}`);
}
}
}
方法5: 定期レポート自動作成
何ができる?
週次データを集計して、PDFレポートを作成し、メールで送信します。
週2時間かかっていたレポート作成が、完全自動になります。
コード
function createWeeklyReport() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const dataSheet = ss.getSheetByName("週次データ");
const reportSheet = ss.getSheetByName("週次レポート");
// 今週のデータを集計
const data = dataSheet.getDataRange().getValues();
let weeklyTotal = 0;
let weeklyCount = 0;
const today = new Date();
const oneWeekAgo = new Date(today.getTime() - 7 * 24 * 60 * 60 * 1000);
for (let i = 1; i < data.length; i++) {
const recordDate = new Date(data[i][0]);
if (recordDate >= oneWeekAgo) {
weeklyTotal += data[i][2];
weeklyCount++;
}
}
// レポート作成
reportSheet.clear();
reportSheet.getRange("A1").setValue("週次レポート");
reportSheet.getRange("A2").setValue(`期間: ${oneWeekAgo.toLocaleDateString()} ~ ${today.toLocaleDateString()}`);
reportSheet.getRange("A4").setValue("合計:");
reportSheet.getRange("B4").setValue(weeklyTotal);
reportSheet.getRange("A5").setValue("件数:");
reportSheet.getRange("B5").setValue(weeklyCount);
// PDF出力してメール送信
const pdf = DriveApp.createFile(reportSheet.getAs('application/pdf'))
.setName(`週次レポート_${today.toLocaleDateString()}.pdf`);
GmailApp.sendEmail(
"manager@example.com",
"週次レポート",
"今週のレポートです。",
{ attachments: [pdf.getAs(MimeType.PDF)] }
);
}
毎週金曜17時に実行するなら、トリガーで「週ベースのタイマー」を設定します。
まとめ
5つの自動化で、週5時間以上の削減が見込めます。年間だと約250時間。
| 自動化 | 削減時間/週 |
|---|---|
| メール自動送信 | 30分 |
| スプレッドシート更新 | 1時間 |
| Slack通知 | 15分 |
| Drive整理 | 1時間 |
| レポート作成 | 2時間 |
始め方
- この記事のコードを1つ選んでコピペ
- メールアドレスやフォルダIDを自分用に変更
- テスト実行してみる
- 動いたらトリガー設定
まずは1つ動かしてみるのがおすすめです。
関連記事: