• 作成日 : 2025年9月22日

スプレッドシートのマクロとは?記録・編集・実行方法から活用例まで解説

毎日同じような作業を繰り返していませんか?Googleスプレッドシートのマクロ機能を使えば、繰り返し作業を自動化できます。データ整形やレポート作成、定型的な書式設定など、普段の作業を記録しておけば次回からワンクリックで再現できます。

エクセルのVBAと違い、オンライン環境があればどの端末からでも利用できるため、チーム共有にも適しています。

本記事では、スプレッドシートのマクロの基本概念、記録・編集・実行の手順から実際の活用例、注意点までを幅広く解説します。

スプレッドシートにおけるマクロとは

マクロの基本概念と仕組み

マクロとは、スプレッドシートで行う一連の操作を記録し、後から何度でも自動実行できるようにする機能です。例えば、「データの並べ替え→不要な列の削除→条件付き書式の適用→グラフの作成」といった複数の手順を、マクロとして記録しておけば、次回からはボタン一つですべての操作を自動的に実行できます。

Googleスプレッドシートのマクロは、実際にはGoogle Apps Script(GAS)というプログラミング言語で記述されています。しかし、プログラミングの知識がなくても、「マクロの記録」機能を使うことで、実際の操作を記録してマクロを作成できます。記録されたマクロは後から編集することも可能で、より高度な自動化を実現できます。

エクセルのVBAマクロとは異なり、GoogleスプレッドシートのマクロはGoogle Apps Scriptを通じてクラウド上で実行されます。スプレッドシート自体はオフライン編集も可能ですが、マクロ(Apps Script)はインターネット接続がないと実行できません。これにより、どのデバイスからアクセスしても同じマクロを使用でき、チーム内での共有も簡単に行えます。

マクロが解決する業務課題

バックオフィス業務では、以下のような繰り返し作業が多く発生します。

  • 経理部門:月次の売上データの集計、請求書の作成、経費精算書のフォーマット統一
  • 人事部門:勤怠データの整形、給与計算の前処理、組織図の更新
  • 総務部門:備品管理表の更新、会議室予約状況の集計、各種申請書の処理

これらの作業は、手順は決まっているものの、手作業で行うと時間がかかり、ミスも発生しやすくなります。マクロを使用することで、これらの定型作業を自動化し、作業時間を大幅に削減できます。また、操作手順が統一されるため、誰が実行しても同じ結果が得られ、品質の安定化にもつながります。

マクロとGoogle Apps Scriptの関係

マクロの記録機能で作成されたマクロは、内部的にはGoogle Apps Script(GAS)のコードとして保存されます。GASはJavaScriptをベースとした言語で、Googleの各種サービスと連携できる強力な機能を持っています。

マクロの記録では基本的な操作しか記録できませんが、生成されたGASコードを編集することで、以下のような高度な処理も可能になります。

  • 条件分岐(IF文)による動的な処理
  • 繰り返し処理(ループ)による大量データの処理
  • 他のGoogleサービス(Gmail、カレンダー、ドライブ)との連携
  • 外部APIとの連携によるデータの取得・送信

プログラミング経験がない方でも、まずはマクロの記録から始めて、徐々にコードの編集に挑戦することで、段階的にスキルアップできます。

スプレッドシートでのマクロの記録・編集方法

マクロの記録を開始する手順

マクロの記録を始める前に、実行したい操作の手順を明確にしておくことが重要です。準備ができたら、以下の手順でマクロの記録を開始します。

  1. メニューバーの「拡張機能」→「マクロ」→「マクロを記録」を選択
  2. 記録方法を選択するダイアログが表示されます
    • 絶対参照:セルの位置を固定して記録(A1、B2など)
    • 相対参照:現在の位置からの相対的な移動を記録

一般的には、特定のセルで常に同じ処理を行う場合は「絶対参照」、選択したセルを起点に処理を行う場合は「相対参照」を選択します。例えば、月次レポートのテンプレートで決まった位置にデータを入力する場合は絶対参照、選択した範囲に対して書式を適用する場合は相対参照が適しています。

実際の操作を記録する

記録を開始すると、画面下部に「記録中」というバーが表示されます。この状態で、自動化したい操作を順番に実行していきます。記録される操作には以下のようなものがあります。

  • セルの選択、データの入力、削除
  • コピー、貼り付け、切り取り
  • 書式設定(フォント、色、罫線など)
  • 並べ替え、フィルター
  • 数式の入力
  • グラフの作成

ただし、すべての操作が記録できるわけではありません。マウスの右クリックメニューからの操作や、一部の高度な機能は記録されない場合があります。記録中は、必要最小限の操作を心がけ、無駄な動きを避けることで、効率的なマクロを作成できます。

マクロの保存と命名

操作が完了したら、記録バーの「保存」ボタンをクリックします。マクロの名前を入力するダイアログが表示されるので、わかりやすい名前を付けます。

命名のポイント
  • 日本語でも英語でも使用可能ですが、後で編集する可能性がある場合は英数字が推奨
  • 処理内容がわかる具体的な名前(例:「月次売上集計」「請求書フォーマット」)
  • バージョン管理が必要な場合は日付を含める(例:「売上集計_202412」)

また、ショートカットキーを割り当てることもできます。Ctrl + Alt + Shift + 数字キーの組み合わせで、最大10個のマクロにショートカットを設定できます。頻繁に使用するマクロには、覚えやすい番号を割り当てておくと便利です。

マクロの編集方法

記録したマクロを編集するには、「拡張機能」→「Apps Script」を選択します。スクリプトエディタが開き、記録されたコードが表示されます。

基本的な編集例:

セル参照の変更:

// 変更前

sheet.getRange(‘A1’).setValue(‘売上データ’);

// 変更後(別のセルに変更)

sheet.getRange(‘B2’).setValue(‘売上データ’);

繰り返し処理の追加:

// 10行分同じ処理を繰り返す

for (let i = 1; i <= 10; i++) {

sheet.getRange(i, 1).setValue(‘項目’ + i);}

条件分岐の追加:

// セルの値に応じて処理を変える

let value = sheet.getRange(‘A1’).getValue();

if (value > 100000) {

sheet.getRange(‘B1’).setBackground(‘#00FF00’); // 緑} else {

sheet.getRange(‘B1’).setBackground(‘#FF0000’); // 赤}

デバッグとテスト

編集したマクロは、実行前に必ずテストすることが重要です。スクリプトエディタには、以下のデバッグ機能があります。

  • 実行ボタン:マクロを実行して動作を確認
  • デバッグボタン:ステップ実行で処理を1行ずつ確認
  • ログ出力:Logger.log() を使って変数の値を確認できます(公式推奨)。また、V8ランタイム環境では console.log() も利用可能ですが、標準的には Logger.log() を使うのが安全です。

テスト時は、本番データではなくテスト用のシートで実行することをお勧めします。また、重要なデータを扱う場合は、実行前にバックアップを取っておくことも大切です。

スプレッドシートでのマクロの実行方法

メニューからの実行

最も基本的なマクロの実行方法は、メニューから選択する方法です。「拡張機能」→「マクロ」を選択すると、作成したマクロの一覧が表示されます。実行したいマクロをクリックするだけで、記録した操作が自動的に実行されます。

初回実行時には、承認画面が表示されます。これは、マクロがスプレッドシートのデータにアクセスする権限を求めているためです。「承認」をクリックし、Googleアカウントでログインして、必要な権限を付与します。一度承認すれば、次回からは承認なしで実行できます。

ショートカットキーでの実行

マクロ作成時に設定したショートカットキー(Ctrl + Alt + Shift + 数字)を使用すれば、メニューを開かずに直接マクロを実行できます。頻繁に使用するマクロには、必ずショートカットキーを設定しておきましょう。

ショートカットキーの変更は、「拡張機能」→「マクロ」→「マクロを管理」から行えます。既存のマクロのショートカットキーを変更したり、新たに割り当てたりすることができます。チーム内で共有する場合は、ショートカットキーの一覧を文書化しておくと便利です。

カスタムメニューの作成

より使いやすくするために、独自のメニューを作成してマクロを実行することもできます。以下のコードをスクリプトエディタに追加します。

function onOpen() {

let ui = SpreadsheetApp.getUi();

ui.createMenu(‘業務効率化ツール’)

.addItem(‘月次売上集計’, ‘monthlySalesReport’)

.addItem(‘請求書作成’, ‘createInvoice’)

.addSeparator()

.addItem(‘データクリーンアップ’, ‘cleanupData’)

.addToUi();}

このコードにより、スプレッドシートを開いた際に「業務効率化ツール」というメニューが追加され、各マクロを簡単に実行できるようになります。

ボタンからの実行

視覚的にわかりやすくするため、シート上にボタンを配置してマクロを実行することもできます。

  1. 「挿入」→「図形描画」でボタンを作成
  2. ボタンにテキスト(例:「売上集計実行」)を入力
  3. 作成したボタンを右クリック→「スクリプトを割り当て」
  4. 実行したいマクロ(関数)の名前を入力

これにより、ボタンをクリックするだけでマクロが実行されるようになります。複数の担当者が使用するシートでは、ボタン方式が最も直感的で使いやすい方法です。

定期実行の設定

定型的な処理を自動化する場合、時間ベースのトリガーを設定して定期実行することも可能です。

  1. スクリプトエディタで「編集」→「現在のプロジェクトのトリガー」
  2. 「トリガーを追加」をクリック
  3. 実行する関数、実行タイミング(毎日、毎週、毎月など)を設定

例えば、毎朝9時に前日の売上データを集計するマクロを自動実行したり、毎月1日に月次レポートを作成したりすることができます。これにより、完全な自動化が実現します。

スプレッドシートでのマクロの活用例

月次レポートの自動作成

経理部門でよく使用される月次売上レポートの自動作成マクロの例:

function createMonthlyReport() {

let sheet = SpreadsheetApp.getActiveSheet();

let lastRow = sheet.getLastRow();

// データの並べ替え(日付順)

sheet.getRange(2, 1, lastRow – 1, 10).sort(1);

// 月ごとの集計

let summarySheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(‘月次集計’);

summarySheet.clear();

// ヘッダー作成

summarySheet.getRange(‘A1:D1’).setValues([[‘月’, ‘売上高’, ‘前月比’, ‘累計’]]);

summarySheet.getRange(‘A1:D1’).setBackground(‘#4285F4’).setFontColor(‘#FFFFFF’);

// 集計処理(省略)

// グラフの作成

let chart = summarySheet.newChart()

.setChartType(Charts.ChartType.COLUMN)

.addRange(summarySheet.getRange(‘A1:B13’))

.setPosition(5, 5, 0, 0)

.build();

summarySheet.insertChart(chart);}

このマクロは、生データから月次集計を作成し、グラフまで自動生成します。手作業では30分かかる作業が、1クリックで完了します。

データクレンジングの自動化

外部システムから取り込んだデータの整形を自動化する例:

function cleanupData() {

let sheet = SpreadsheetApp.getActiveSheet();

let range = sheet.getDataRange();

let values = range.getValues();

for (let i = 0; i < values.length; i++) {

for (let j = 0; j < values[i].length; j++) {

// 全角数字を半角に変換

values[i][j] = values[i][j].toString().replace(/[0-9]/g, function(s) {

return String.fromCharCode(s.charCodeAt(0) – 0xFEE0);});

// 前後の空白を削除

values[i][j] = values[i][j].toString().trim();

// 空白セルを0に置換

if (values[i][j] === ”) {

values[i][j] = 0;}}}

range.setValues(values);}

請求書の一括作成

顧客リストから請求書を一括作成するマクロ:

function createInvoices() {

const ss = SpreadsheetApp.getActiveSpreadsheet();

const templateSheet = ss.getSheetByName(‘請求書テンプレート’);

const customerSheet = ss.getSheetByName(‘顧客リスト’);

const customers = customerSheet.getDataRange().getValues();

// シート名を安全に生成するユーティリティ

const sanitize = (name) =>

String(name)

.replace(/[:/?*[]]/g, ‘_’)  // 禁止文字を置換

.trim();

const toUniqueSheetName = (base) => {

const MAX = 100;

let name = base.slice(0, MAX);

let n = 1;

while (ss.getSheetByName(name)) {

const suffix = `_${n++}`;

name = (base.slice(0, MAX – suffix.length) + suffix);}

return name;};

for (let i = 1; i < customers.length; i++) {

const company = sanitize(customers[i][0] || ‘無名顧客’);

const baseName = `請求書_${company}`;

const sheetName = toUniqueSheetName(baseName);

// テンプレートをコピーして安全な名前を設定

const newSheet = templateSheet.copyTo(ss);

newSheet.setName(sheetName);

// 顧客情報を入力

newSheet.getRange(‘B3’).setValue(customers[i][0]); // 会社名

newSheet.getRange(‘B4’).setValue(customers[i][1]); // 担当者

newSheet.getRange(‘B5’).setValue(customers[i][2]); // 住所

// 請求金額の計算(必要に応じて実装)}}

勤怠データの集計

タイムカードデータから月次勤怠集計を作成:

function summarizeAttendance() {

const ss = SpreadsheetApp.getActiveSpreadsheet();

const sheet = ss.getActiveSheet();

const data = sheet.getDataRange().getValues();

const employees = {};

// データを社員ごとに集計

for (let i = 1; i < data.length; i++) {

const empId = data[i][0];

const empName = data[i][1];

const rawHours = data[i][3];

const workHours = Number(rawHours) || 0;  // 数値変換+不正値は0扱い

if (!employees[empId]) {

employees[empId] = {

name: empName,

totalHours: 0,

days: 0};}

employees[empId].totalHours += workHours;

employees[empId].days++;}

// 既存の「勤怠集計」シートがあれば削除

const oldSheet = ss.getSheetByName(‘勤怠集計’);

if (oldSheet) ss.deleteSheet(oldSheet);

// 新しいシートを作成

const summarySheet = ss.insertSheet(‘勤怠集計’);

// ヘッダー

summarySheet.getRange(‘A1:C1’).setValues([[‘社員ID’, ‘氏名’, ‘総労働時間’]]);

// 集計結果を出力

const output = [];

for (const empId in employees) {

output.push([

empId,

employees[empId].name,

employees[empId].totalHours]);}

summarySheet.getRange(2, 1, output.length, 3).setValues(output);}

スプレッドシートでのマクロのメリット

作業時間の大幅削減

マクロ導入の最大のメリットは、作業時間の劇的な削減です。例えば、毎日30分かけていたデータ整形作業が、マクロなら数秒で完了します。月間で考えると、30分×20営業日=10時間の削減になります。この時間を、より付加価値の高い分析業務や戦略立案に充てることができます。

実際の導入事例では、経理部門で月次決算資料の作成時間が大幅に短縮された例や、人事部門で勤怠集計の作業時間が週5時間から30分に削減された例があります。これらの時間削減効果は、残業時間の削減や業務の質の向上につながります。

ヒューマンエラーの削減

手作業では避けられない入力ミスや計算ミスも、マクロを使用することで大幅に削減できます。特に以下のようなミスを防げます。

  • コピー&ペーストの範囲間違い
  • 数式の入力ミス
  • 書式設定の適用漏れ
  • データの重複や欠落

マクロは設定された通りに正確に動作するため、一度正しく設定すれば、毎回同じ品質の結果が得られます。これは、監査対応や品質管理の観点からも重要なメリットです。

業務の標準化と属人化の解消

マクロを使用することで、業務手順が明確化され、誰が実行しても同じ結果が得られるようになります。これにより、以下のような効果があります。

  • 新人でもベテランと同じ品質の作業が可能
  • 担当者の休暇や異動時もスムーズに業務継続
  • 業務手順の文書化が容易
  • チーム全体のスキルレベルの向上

特に、属人化しやすい複雑な集計作業や、特定の担当者しか知らない「暗黙知」的な処理をマクロ化することで、組織全体の業務継続性が向上します。

スケーラビリティの向上

データ量が増えると処理時間は長くなりますが、最適化すれば比較的安定した速度で実行できます。手作業に比べれば圧倒的に早いですが、処理内容によって実行時間は大きく変動します。これにより、事業の成長に伴うデータ量の増加にも柔軟に対応できます。

また、一度作成したマクロは、類似の処理に転用できます。例えば、売上データ集計のマクロを少し修正すれば、仕入データの集計にも使用できます。このような再利用性も、大きなメリットです。

スプレッドシートでのマクロの注意点

セキュリティとアクセス権限

マクロはスプレッドシートのデータに自由にアクセスできるため、セキュリティには十分な注意が必要です。

権限管理の重要性
  • マクロの編集権限は信頼できる担当者のみに限定
  • 重要なデータを扱うマクロは、実行権限も制限
  • 定期的な権限の見直しと棚卸し
外部スクリプトへの注意
  • 不明なソースからのマクロは使用しない
  • 共有されたマクロは、コードを確認してから実行
  • 外部APIと連携する場合は、APIキーの管理を徹底

パフォーマンスへの配慮

複雑なマクロや大量のデータを扱う場合、実行時間が長くなることがあります。

最適化のポイント
  • 不要な画面更新を抑制:SpreadsheetApp.flush()の適切な使用
  • バッチ処理の活用:セルへの書き込みはまとめて実行
  • 適切なデータ範囲の指定:必要最小限の範囲で処理

実行時間制限: Google Apps Scriptの実行には通常6分間の制限(Workspaceエディションにより変動あり)があります。長時間かかる処理は、分割実行やバッチ処理を検討する必要があります。

メンテナンスと文書化

マクロを長期的に運用するには、適切なメンテナンスが不可欠です。

コードの可読性
  • わかりやすい関数名と変数名の使用
  • 適切なコメントの記載
  • 処理の流れを明確にする構造化
文書化の重要性
  • マクロの目的と機能の説明
  • 使用方法と注意事項
  • 更新履歴とバージョン管理
定期的な見直し
  • 業務プロセスの変更に合わせた更新
  • 不要になったマクロの削除
  • パフォーマンスの改善

エラー処理とリカバリー

マクロ実行中にエラーが発生する可能性を考慮し、適切なエラー処理を実装することが重要です。

function safeExecution() {

try {

// メイン処理

mainProcess();

} catch (err) {

// 1) ログ出力(両方に残すと安心)

Logger.log(‘Error: %s’, err && (err.stack || err.message) || err);

console.error(err);

// 2) UIコンテキストならユーザー通知(トースト or アラート)

try {

SpreadsheetApp.getActive().toast(‘エラーが発生しました: ‘ + (err && err.message || err), ‘実行結果’, 10);

SpreadsheetApp.getUi().alert(‘エラーが発生しました: ‘ + (err && err.message || err));

} catch (e) {

// トリガー等の非UI実行ではここに来る(無視してOK)}

// 3) 任意:メール等での通知(コメントアウトを外して使用)

// MailApp.sendEmail(‘[email protected]’, ‘スクリプトエラー’,

//                   (err && (err.stack || err.message)) || String(err));

// 4) 失敗を呼び出し元/トリガーに伝える

throw err;}}

また、重要なデータを扱う場合は、実行前のバックアップや、処理の途中経過を保存する仕組みを組み込むことも検討しましょう。

マクロを使いこなして業務自動化のエキスパートに

Googleスプレッドシートのマクロは、日々の定型作業を自動化できる強力な機能です。記録機能を使えばプログラミング知識がなくても簡単に導入でき、保存後はGoogle Apps Scriptとして編集・拡張することも可能です。

レポート作成や勤怠集計、請求書の一括生成など、幅広い業務に応用でき、作業時間を大幅に短縮します。また、手作業のミスを防ぎ、誰が実行しても同じ品質の結果が得られるため、業務の標準化と属人化解消にも効果的です。

ただし、セキュリティ権限や実行時間制限には注意が必要です。

小さなタスクの自動化から始めれば、チーム全体の生産性向上につながります。


※ 掲載している情報は記事更新時点のものです。

※本サイトは、法律的またはその他のアドバイスの提供を目的としたものではありません。当社は本サイトの記載内容(テンプレートを含む)の正確性、妥当性の確保に努めておりますが、ご利用にあたっては、個別の事情を適宜専門家にご相談いただくなど、ご自身の判断でご利用ください。

関連記事