Google Apps Scriptで「毎週やっている作業」を消す:スプレッドシート自動化の実践パターン5選
GASはサーバーもランニングコストも不要で、Google Workspaceをそのままコードで操れる。エンジニアが知っておくべき自動化パターンを、実際に使っているコード付きで解説する。
「毎週月曜日にスプレッドシートを集計してメールで送る」──そういう作業を手でやっているなら、それは自動化できる。しかもサーバー不要で、無料で、今すぐ。
Google Apps Script(GAS)はGoogleが提供するJavaScriptベースのスクリプト環境だ。Gmail・スプレッドシート・カレンダー・ドライブ・フォームをAPIではなくオブジェクトとして直接操作できる点が他のツールとまったく違う。AWS LambdaやCloudFunctionsを立てるまでもないルーティンなら、GASで完結する。
GASの基本:「どこで動くか」を理解する
GASは3つのトリガーで動く。
| トリガー | 説明 |
|---|---|
| 時間ベース | 毎日8時、毎週月曜など |
| スプレッドシートイベント | 編集時・フォーム送信時 |
| 手動実行 | メニューからボタンで起動 |
スクリプトはスプレッドシートに紐付ける「コンテナバインド型」と、単独で動く「スタンドアロン型」がある。業務自動化は前者が多い。拡張機能 → Apps Script で開くだけで書き始められる。
パターン1:スプレッドシートの集計結果をメールで送る
最も基本的な自動化。毎週の売上サマリーや進捗レポートを、手動でコピペせず定時送信する。
function sendWeeklyReport() {
const sheet = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName("集計");
const total = sheet.getRange("B2").getValue();
const date = Utilities.formatDate(new Date(), "Asia/Tokyo", "M月d日");
GmailApp.sendEmail(
"team@example.com",
`【週次レポート】${date} 売上サマリー`,
`今週の売上合計: ¥${total.toLocaleString()}\n\nシート: ${SpreadsheetApp.getActiveSpreadsheet().getUrl()}`
);
}
トリガーを「毎週月曜 午前8時」に設定すれば、以後は完全無人化される。
パターン2:フォーム回答を自動でSlackに通知する
Googleフォームに回答が来たとき、SlackのIncoming Webhookに即時通知する。問い合わせ対応やアンケート収集の見逃し防止に効く。
function onFormSubmit(e) {
const responses = e.values; // フォーム回答の配列
const name = responses[1];
const message = responses[2];
const webhookUrl = PropertiesService.getScriptProperties()
.getProperty("SLACK_WEBHOOK_URL"); // シークレットは Script Properties に保存
const payload = JSON.stringify({
text: `📬 新しい問い合わせ\n*名前:* ${name}\n*内容:* ${message}`,
});
UrlFetchApp.fetch(webhookUrl, {
method: "post",
contentType: "application/json",
payload,
});
}
APIキーをコードに直書きせず PropertiesService に保存するのは必須の作法だ。
パターン3:スプレッドシートをPDFに変換してドライブに保存する
請求書・報告書を定期的にPDF化してフォルダに保管する処理。エクセル管理から脱却するきっかけになる。
function exportToPdf() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const fileId = ss.getId();
const sheetId = ss.getSheetByName("請求書").getSheetId();
const url = `https://docs.google.com/spreadsheets/d/${fileId}/export`
+ `?format=pdf&gid=${sheetId}&portrait=true&fitw=true`;
const token = ScriptApp.getOAuthToken();
const blob = UrlFetchApp.fetch(url, {
headers: { Authorization: `Bearer ${token}` },
}).getBlob().setName(`請求書_${Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyyMM")}.pdf`);
DriveApp.getFolderById("YOUR_FOLDER_ID").createFile(blob);
}
パターン4:特定セルが変更されたら承認フローを起動する
スプレッドシートが「簡易ワークフローツール」として機能する構成。ステータス列が「承認依頼」に変わったら担当者にメールを飛ばす。
function onEdit(e) {
const range = e.range;
if (range.getColumn() !== 5) return; // E列だけ監視
if (range.getValue() !== "承認依頼") return;
const row = range.getRow();
const sheet = e.source.getActiveSheet();
const itemName = sheet.getRange(row, 2).getValue();
const requester = sheet.getRange(row, 3).getValue();
GmailApp.sendEmail(
"approver@example.com",
`【承認依頼】${itemName}`,
`${requester} さんから承認依頼が届いています。\n内容: ${itemName}`
);
}
onEdit はシンプルトリガーのため、インストーラブルトリガーと違いOAuth不要で動く。ただしGmailの送信はインストーラブルが必要なので注意。
パターン5:外部APIからデータを取得してスプレッドシートに書き込む
為替レートや株価など、外部APIのレスポンスを定期的にシートに追記する。UrlFetchApp さえあれば任意のREST APIを叩ける。
function fetchExchangeRate() {
const res = UrlFetchApp.fetch("https://api.exchangerate-api.com/v4/latest/USD");
const data = JSON.parse(res.getContentText());
const jpy = data.rates.JPY;
const sheet = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName("為替ログ");
sheet.appendRow([new Date(), "USD/JPY", jpy]);
}
トリガーを1時間ごとに設定すれば、無料で簡易レートロガーの完成だ。
使うときの3つの注意点
1. 実行時間は最大6分 長い処理はチャンクに分けてトリガーを連鎖させる。
2. 1日のURL Fetch上限は20,000回 外部APIを叩く処理は回数を意識する。
3. onEdit と インストーラブルトリガーの違いを理解する Gmail送信・外部API呼び出しはインストーラブルが必要。シンプルトリガー(onEdit・onOpen)でできることは限られている。
まとめ
GASの強みはゼロコストで始められ、Google Workspaceをそのまま操れる点だ。複雑なインフラなしに「毎週やっている作業を消す」という目的に特化している。
まずパターン1のメール送信だけ動かしてみる。それだけで「自動化の感触」をつかめる。感触をつかんだら、あとは組み合わせていくだけだ。
