【完全ガイド】GASでスプレッドシートを自動化する方法
「毎月の集計作業、もっとラクにできないかな…」
そんな悩みを抱えている方に朗報です。Google Apps Script(GAS)を使えば、スプレッドシートの面倒な作業を無料で自動化できます。
この記事では、プログラミング未経験の方でも理解できるよう、GASによるスプレッドシート自動化の基本から実践的なテクニックまでを丁寧に解説します。
この記事で学べること:
- GASの基本的な使い方
- セルの読み書き操作
- 実務で使える自動化パターン5選
- トリガーを使った完全自動化の方法
GASとスプレッドシート連携でできること
GAS(Google Apps Script)は、Googleが提供する無料のスクリプト環境です。JavaScriptをベースにしており、Googleのサービス(スプレッドシート、Gmail、カレンダーなど)を自動操作できます。
GAS × スプレッドシートで実現できる自動化の例
| 自動化の種類 | 具体例 | 削減できる時間(目安) |
|---|---|---|
| データ入力 | フォーム回答の自動転記 | 月5時間 |
| レポート作成 | 日次・週次レポートの自動生成 | 月10時間 |
| 通知・連絡 | 条件に応じた自動メール送信 | 月3時間 |
| データ整理 | 重複削除、フォーマット統一 | 月4時間 |
| 外部連携 | Slack、LINE、ChatGPTとの連携 | 月8時間 |
「プログラミングは難しそう…」と思う方もいるかもしれません。
しかし、GASはExcelのVBAよりもシンプルな文法で書けます。また、コピペで動くコードをこの記事で多数紹介しますので、まずは動かしてみることから始めましょう。
準備:GASエディタの開き方
GASを使うには、まずエディタ(コードを書く画面)を開く必要があります。手順はとても簡単です。
手順1:スプレッドシートを開く
Googleドライブから任意のスプレッドシートを開きます。新規作成でも、既存のファイルでも構いません。
[画像: Googleドライブでスプレッドシートを新規作成する画面]
手順2:拡張機能からApps Scriptを開く
スプレッドシートのメニューから、以下の順にクリックします。
拡張機能 > Apps Script
[画像: スプレッドシートのメニューからApps Scriptを選択する画面]
手順3:エディタが開く
新しいタブでGASエディタが開きます。最初は以下のような画面が表示されます。
function myFunction() {
}
このmyFunctionの中にコードを書いていきます。
[画像: GASエディタの初期画面]
手順4:名前を変更して保存
画面左上の「無題のプロジェクト」をクリックし、分かりやすい名前に変更しましょう(例:「スプレッドシート自動化」)。
ポイント: GASのファイルはGoogleドライブに自動保存されますが、明示的に保存するにはCtrl + S(Mac: Cmd + S)を押します。
基本編:セルの読み書き
GASでスプレッドシートを操作するには、まず「どのシートの、どのセルを操作するか」を指定する必要があります。
基本的な流れ
// 1. スプレッドシートを取得
const ss = SpreadsheetApp.getActiveSpreadsheet();
// 2. シートを取得
const sheet = ss.getSheetByName('シート1');
// 3. セルを操作
const value = sheet.getRange('A1').getValue();
この3ステップが基本形です。覚えておきましょう。
データの取得(getValue, getValues)
セルからデータを読み取る方法を見ていきましょう。
単一セルの値を取得:getValue()
function getSingleValue() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('シート1');
// A1セルの値を取得
const value = sheet.getRange('A1').getValue();
// ログに出力(確認用)
console.log(value);
}
実行方法:
- 上記コードをエディタに貼り付け
- 関数名「getSingleValue」を選択(ドロップダウンから選ぶ)
- 「▶ 実行」ボタンをクリック
[画像: GASエディタで関数を実行する画面]
初回実行時は「承認が必要です」と表示されます。「権限を確認」→「許可」をクリックして進めてください。
複数セルの値を一括取得:getValues()
範囲のデータをまとめて取得するにはgetValues()を使います。
function getMultipleValues() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('シート1');
// A1:C10の範囲を取得(10行×3列)
const values = sheet.getRange('A1:C10').getValues();
// 結果は2次元配列
// values[0][0] → A1の値
// values[0][1] → B1の値
// values[1][0] → A2の値
console.log(values);
}
パフォーマンスのコツ: getValue()を何度も呼ぶより、getValues()で一括取得する方が処理速度が大幅に向上します。100行のデータなら、100回のgetValue()より1回のgetValues()の方が約10倍速いです。
データの書き込み(setValue, setValues)
セルにデータを書き込む方法です。
単一セルへの書き込み:setValue()
function setSingleValue() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('シート1');
// A1セルに「Hello GAS!」と書き込み
sheet.getRange('A1').setValue('Hello GAS!');
}
複数セルへの一括書き込み:setValues()
function setMultipleValues() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('シート1');
// 書き込むデータ(2次元配列)
const data = [
['名前', '部署', '売上'],
['田中', '営業', 1000000],
['佐藤', '開発', 800000],
['鈴木', '人事', 600000]
];
// A1:C4に一括書き込み
sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
}
注意点: setValues()で書き込む2次元配列のサイズと、指定する範囲のサイズは一致させる必要があります。
実践編:よく使う自動化パターン5選
ここからは、実務で即使える自動化パターンを5つ紹介します。すべてコピペで動作しますので、ぜひ試してみてください。
1. 日次レポートの自動生成
毎日のデータを集計し、レポートシートに自動出力するスクリプトです。
function generateDailyReport() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const dataSheet = ss.getSheetByName('売上データ');
const reportSheet = ss.getSheetByName('日次レポート');
// 今日の日付を取得
const today = new Date();
const todayStr = Utilities.formatDate(today, 'Asia/Tokyo', 'yyyy/MM/dd');
// 売上データを取得(A列:日付, B列:商品名, C列:金額)
const data = dataSheet.getDataRange().getValues();
// 今日のデータだけフィルタリング
let todayTotal = 0;
let todayCount = 0;
for (let i = 1; i < data.length; i++) { // 1行目はヘッダーなのでスキップ
const rowDate = Utilities.formatDate(new Date(data[i][0]), 'Asia/Tokyo', 'yyyy/MM/dd');
if (rowDate === todayStr) {
todayTotal += data[i][2]; // 金額を加算
todayCount++;
}
}
// レポートシートに書き込み
const lastRow = reportSheet.getLastRow() + 1;
reportSheet.getRange(lastRow, 1, 1, 3).setValues([
[todayStr, todayCount, todayTotal]
]);
console.log(`${todayStr}のレポートを生成しました: ${todayCount}件, ${todayTotal}円`);
}
使い方:
- 「売上データ」シートを作成(A列:日付, B列:商品名, C列:金額)
- 「日次レポート」シートを作成
- スクリプトを実行
2. フォーム回答の自動集計
Googleフォームの回答を自動で集計するスクリプトです。
function aggregateFormResponses() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const responseSheet = ss.getSheetByName('フォームの回答 1');
const summarySheet = ss.getSheetByName('集計');
// 回答データを取得(1行目はヘッダー)
const data = responseSheet.getDataRange().getValues();
const headers = data[0];
// 各質問の回答を集計(例: 2列目の回答を集計)
const targetColumn = 1; // 集計したい列(0始まり)
const counts = {};
for (let i = 1; i < data.length; i++) {
const answer = data[i][targetColumn];
counts[answer] = (counts[answer] || 0) + 1;
}
// 集計結果を書き込み
summarySheet.clear();
summarySheet.getRange(1, 1, 1, 2).setValues([['回答', '件数']]);
let row = 2;
for (const [answer, count] of Object.entries(counts)) {
summarySheet.getRange(row, 1, 1, 2).setValues([[answer, count]]);
row++;
}
console.log('集計が完了しました');
}
ポイント: Googleフォームの回答は自動的にスプレッドシートに記録されます。そのシート名は通常「フォームの回答 1」です。
3. メール送信の自動化
スプレッドシートのデータを使って自動でメールを送信します。
function sendAutomaticEmails() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('送信リスト');
// データ取得(A列:メールアドレス, B列:名前, C列:送信済みフラグ)
const data = sheet.getDataRange().getValues();
for (let i = 1; i < data.length; i++) {
const email = data[i][0];
const name = data[i][1];
const sent = data[i][2];
// 既に送信済みならスキップ
if (sent === '送信済み') continue;
// メール本文を作成
const subject = '【お知らせ】今月のレポートのご案内';
const body = `${name} 様
いつもお世話になっております。
今月のレポートが完成しましたので、ご確認ください。
何かご不明点がございましたら、お気軽にお問い合わせください。
よろしくお願いいたします。`;
// メール送信
GmailApp.sendEmail(email, subject, body);
// 送信済みフラグを立てる
sheet.getRange(i + 1, 3).setValue('送信済み');
console.log(`送信完了: ${email}`);
}
}
注意: GmailAppを使用するには、初回実行時にGmailへのアクセス許可が必要です。また、1日の送信上限(無料アカウントは100通/日)があります。
4. 定期バックアップ
スプレッドシートを定期的にバックアップするスクリプトです。
function backupSpreadsheet() {
// バックアップ元のスプレッドシート
const sourceId = SpreadsheetApp.getActiveSpreadsheet().getId();
const sourceFile = DriveApp.getFileById(sourceId);
// バックアップ先フォルダのID(Googleドライブのフォルダを指定)
// フォルダのURLから取得: https://drive.google.com/drive/folders/XXXXX ← このXXXXX部分
const backupFolderId = 'YOUR_FOLDER_ID_HERE'; // ← 実際のフォルダIDに置き換えてください
const backupFolder = DriveApp.getFolderById(backupFolderId);
// バックアップファイル名(日付入り)
const today = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyyMMdd_HHmmss');
const backupName = `backup_${sourceFile.getName()}_${today}`;
// コピーを作成
sourceFile.makeCopy(backupName, backupFolder);
console.log(`バックアップ完了: ${backupName}`);
}
設定手順:
- Googleドライブにバックアップ用フォルダを作成
- フォルダのURLからIDをコピー
YOUR_FOLDER_ID_HEREを実際のIDに置き換え
5. Slack通知連携
スプレッドシートの更新をSlackに通知します。
function sendSlackNotification() {
// SlackのWebhook URL(Slack Appから取得)
const webhookUrl = 'YOUR_SLACK_WEBHOOK_URL'; // ← 実際のURLに置き換えてください
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('タスク管理');
// 未完了タスクをカウント
const data = sheet.getDataRange().getValues();
let pendingCount = 0;
for (let i = 1; i < data.length; i++) {
if (data[i][2] !== '完了') { // C列がステータスと仮定
pendingCount++;
}
}
// Slackに送信するメッセージ
const message = {
text: `📊 *タスク管理レポート*\n未完了タスク: ${pendingCount}件\n<${ss.getUrl()}|スプレッドシートを開く>`
};
// HTTP POSTリクエストを送信
const options = {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify(message)
};
UrlFetchApp.fetch(webhookUrl, options);
console.log('Slack通知を送信しました');
}
Webhook URLの取得方法:
- Slackの「App」から「Incoming Webhooks」を追加
- 通知先チャンネルを選択
- 発行されるWebhook URLをコピー
トリガー設定で完全自動化
ここまでのスクリプトは、手動で「実行」ボタンを押す必要がありました。トリガーを設定すれば、指定した時間や条件で自動実行できます。
トリガーの種類
| トリガー種類 | 説明 | 使用例 |
|---|---|---|
| 時間主導型 | 指定した間隔で実行 | 毎日9時にレポート生成 |
| スプレッドシートから | 編集時やフォーム送信時に実行 | 新規回答があったら集計 |
| カレンダーから | イベント更新時に実行 | 予定変更をSlack通知 |
トリガーの設定手順
手順1:トリガー画面を開く
GASエディタの左メニューから「トリガー」(時計アイコン)をクリックします。
[画像: GASエディタのトリガーメニュー]
手順2:トリガーを追加
右下の「+ トリガーを追加」ボタンをクリックします。
手順3:設定を入力
例として、毎日午前9時にgenerateDailyReportを実行する設定:
| 設定項目 | 値 |
|---|---|
| 実行する関数 | generateDailyReport |
| イベントのソース | 時間主導型 |
| 時間ベースのトリガータイプ | 日付ベースのタイマー |
| 時刻を選択 | 午前9時〜10時 |
[画像: トリガー設定画面]
手順4:保存
「保存」をクリックすれば設定完了です。
トリガー利用時の注意点
- 実行時間の誤差: 指定した時間の前後15分程度で実行されます
- 実行制限: 無料アカウントは1日90分まで(有料のWorkspaceは6時間)
- エラー通知: 実行エラーが発生するとメールで通知されます
よくあるエラーと解決法
GASを使っていると、いくつかのエラーに遭遇することがあります。代表的なものと解決方法を紹介します。
エラー1:「権限がありません」
原因: スクリプトが初めてGoogleサービスにアクセスしようとしている
解決法:
- 「権限を確認」をクリック
- Googleアカウントを選択
- 「詳細」→「〇〇(安全ではないページ)に移動」をクリック
- 「許可」をクリック
[画像: 権限の承認画面]
エラー2:「範囲のサイズが一致しません」
原因: setValues()で指定した範囲と、データの配列サイズが異なる
解決法:
// ❌ 間違い: 範囲とデータサイズが不一致
sheet.getRange('A1:C3').setValues([[1, 2]]); // 2列のデータを3列の範囲に入れようとしている
// ✅ 正しい: 動的に範囲を指定
const data = [[1, 2], [3, 4]];
sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
エラー3:「1日の実行時間を超えました」
原因: 無料アカウントの実行上限(90分/日)に達した
解決法:
- 処理を最適化する(
getValueよりgetValuesを使う) - 不要なトリガーを削除する
- Google Workspaceアカウントへのアップグレードを検討
エラー4:「サービスがタイムアウトしました」
原因: 1回の実行が6分(360秒)を超えた
解決法:
- 処理を分割する
- バッチ処理を導入する(100件ずつ処理など)
// バッチ処理の例
function processBatch() {
const BATCH_SIZE = 100;
const properties = PropertiesService.getScriptProperties();
let startRow = parseInt(properties.getProperty('startRow') || '1');
// 100件処理
// ... 処理ロジック ...
// 次の開始位置を保存
properties.setProperty('startRow', String(startRow + BATCH_SIZE));
}
まとめ・次のステップ
この記事では、GASを使ったスプレッドシート自動化の基本から実践テクニックまでを解説しました。
この記事のポイント
✅ GASはJavaScriptベースで初心者にも学びやすい
✅ セルの読み書きはgetValue/getValuesとsetValue/setValuesが基本
✅ 実務で使える5つの自動化パターンを紹介
- 日次レポート自動生成
- フォーム回答の自動集計
- メール送信の自動化
- 定期バックアップ
- Slack通知連携
✅ トリガーを使えば完全自動化が可能
次のステップ
GASの基本を理解したら、次は以下のトピックに挑戦してみましょう。
- Gmail連携を深掘り: メールの自動振り分け、定型文の自動返信
- Googleカレンダー連携: スケジュールとスプレッドシートの同期
- 外部API連携: ChatGPT、LINE、各種Webサービスとの連携
- Webアプリ化: GASでシンプルなWebアプリケーションを作成
おすすめ学習リソース:
- Google Apps Script公式ドキュメント
- Udemy「GAS入門講座」(セール時1,200円〜)
最初は小さな自動化から始めて、徐々にスキルアップしていきましょう。毎月の手作業が数時間減るだけでも、年間では大きな効果になります。
この記事が役に立ったら、ぜひブックマークしてお使いください。
コメント