【2026年版】GAS入門ガイド|スプレッドシート自動化の始め方を完全解説

VBAユーザーなら、GASは2時間で使えるようになります。無料で業務自動化を始めましょう!
- GASの基本概念と連携サービス一覧
- 環境構築不要で5分で始められるGASの使い方
- スプレッドシート操作の基本コード
- 業務自動化の実践例3つ(完成品コード付き)
- Excel VBAユーザーのためのGAS移行ガイド
- トリガー設定で完全自動化する方法
GAS(Google Apps Script)とは?3分で理解する基礎知識
Google Apps Script(GAS)は、Googleが提供する無料のスクリプト環境です。Gmail、Googleスプレッドシート、Googleドライブなど、Googleサービス全体をJavaScriptベースのコードで自動化できます。
ExcelのVBAがMicrosoft Office製品を操作するように、GASはGoogleサービスを操作するプログラミング環境と考えるとわかりやすいでしょう。
GASの概要と3つの特徴(無料・環境不要・JavaScript互換)
GASが多くのビジネスパーソンに支持される理由は、次の3つの特徴にあります。
Googleアカウントさえあれば、追加費用ゼロで利用できます。VBAのようにMicrosoft Officeのライセンスは不要です。個人のGmailアカウントでもGoogle Workspaceアカウントでも使えます。
開発環境のインストールは一切不要です。ブラウザ(Chrome推奨)でスプレッドシートを開き、「拡張機能」→「Apps Script」を選ぶだけでコードを書き始められます。5分で最初のスクリプトを実行できます。
GASの文法はJavaScriptとほぼ同じです。Web開発の経験がある方はもちろん、VBAの経験があれば文法の違いはわずかです。ChatGPTにコード生成を頼む際も、JavaScript系は最も精度が高い言語の一つです。
VBAではExcelの起動が必要ですが、GASはブラウザさえあればどこからでも実行できます。また、JavaScriptの知識はWeb開発にも応用できるため、学習コストの投資効率が非常に高いのも魅力です。
GASでできること一覧(連携サービスマップ)
GASは単体のツールではなく、Googleの各サービスを橋渡しする自動化基盤です。以下の表で、GASが連携できるサービスと具体的にできることを一覧にまとめました。
| 連携サービス | GASクラス名 | できること(例) |
|---|---|---|
| スプレッドシート | SpreadsheetApp | セル読み書き、自動集計、データ整形、帳票生成 |
| Gmail | GmailApp | メール自動送信、一斉送信、添付ファイル処理、ラベル付け |
| Googleドライブ | DriveApp | ファイル作成・移動・共有、フォルダ管理、PDF変換 |
| Googleフォーム | FormApp | 回答収集の自動化、回答内容に応じたメール通知 |
| Googleカレンダー | CalendarApp | 予定の自動登録、リマインダー送信、スケジュール一覧出力 |
| Googleスライド | SlidesApp | テンプレートから自動生成、データ差し込み |
| Googleドキュメント | DocumentApp | 請求書・報告書の自動生成、テキスト置換 |
| 外部API | UrlFetchApp | ChatGPT連携、X(旧Twitter)投稿、Slack通知、LINE通知 |
このように、GASはGoogleサービス同士を繋げる「接着剤」として機能します。単独のサービスでは手作業が必要な処理も、GASで自動化すれば手間がなくなります。
料金と制限(Google Workspace プラン別比較表)
GASは無料のGoogleアカウントでも利用可能です。ただし、プランによって1日の実行制限に差があります。
| 制限項目 | 無料(Gmail) | Google Workspace |
|---|---|---|
| スクリプト実行時間(1回) | 6分 | 6分(※30分に拡張可) |
| トリガー合計実行時間/日 | 90分 | 6時間 |
| メール送信数/日 | 100通 | 1,500通 |
| UrlFetch呼び出し/日 | 20,000回 | 100,000回 |
| トリガー数 | 20個/ユーザー | 20個/ユーザー |
| スプレッドシートの作成/日 | 250件 | 250件 |
個人の業務自動化であれば、無料プランの制限で十分です。1日100通のメール送信や20,000回のAPI呼び出しが可能なので、大半の自動化ニーズをカバーできます。大量処理が必要な場合はGoogle Workspaceの導入を検討しましょう。
「▶ 実行」ボタンを押すと、GASの動作をシミュレーション体験できます(JavaScript不使用・CSS-onlyアニメーション)。
2 const sheet = SpreadsheetApp.getActiveSheet();
3 sheet.getRange(“A1”).setValue(“Hello GAS!”);
4 sheet.getRange(“B1”).setValue(100);
5 sheet.getRange(“C1”).setValue(new Date());
6}
| A | B | C | |
|---|---|---|---|
| 1 | (空白) Hello GAS! | (空白) 100 | (空白) 2026/03/02 9:00 |
| 2 | |||
| 3 |
☝ GASならスプレッドシートのセル操作を自動化できます
2 GmailApp.sendEmail(
3 “example@gmail.com”,
4 “【自動送信】月次レポート”,
5 “今月の売上データを添付します。”
6 );
7}
☝ トリガーと組み合わせれば毎日自動でレポート送信できます
Excel VBAユーザーのためのGAS入門
ExcelのVBAを使ったことがある方なら、GASの習得は非常にスムーズです。ここでは、VBAとGASの文法の違いを比較しながら、最短ルートでGASを理解できるように解説します。
VBAとGASの文法比較表(7つの対応例)
以下の表で、VBAの基本構文がGASではどう書くかを一覧にしました。
| 操作 | VBA | GAS(JavaScript) |
|---|---|---|
| プロシージャ定義 | Sub 名前() | function 名前() {} |
| 変数宣言 | Dim x As String | const x = “” / let x = “” |
| メッセージ表示 | MsgBox “テキスト” | Browser.msgBox(“テキスト”) |
| セルの値を取得 | Range(“A1”).Value | getRange(“A1”).getValue() |
| ループ処理 | For Each item In col | array.forEach(item => {}) |
| アクティブシート取得 | ActiveSheet | SpreadsheetApp.getActiveSheet() |
| ワークシート関数 | WorksheetFunction.Sum() | JavaScriptで直接計算 |
| ファイルパス取得 | ThisWorkbook.Path | DriveApp.getFileById(id) |
VBAのSubがGASのfunctionに対応し、Range("A1").ValueがGASのgetRange("A1").getValue()に対応するなど、概念はほぼ同じです。JavaScriptの文法に慣れるだけで、すぐにGASを書けるようになります。
VBAの○○はGASではこう書く(7つのコード比較)
ここからは、VBAの代表的な処理がGASではどう書くかを、実際のコードで比較します。すべてのコードはコピーしてそのまま使えます。
1. プロシージャの定義(Sub → function)
VBAの書き方:
Sub SayHello()
MsgBox "Hello!"
End Sub
GASの書き方:
function sayHello() {
Browser.msgBox("Hello!");
}
VBAではSubとEnd Subでプロシージャを囲みますが、GASではfunctionと{}(波括弧)で囲みます。関数名はキャメルケース(先頭小文字)が推奨です。
2. セルの値を取得(Range → getRange)
VBAの書き方:
Dim val As String
val = Range("A1").Value
GASの書き方:
const val = SpreadsheetApp.getActiveSheet().getRange("A1").getValue();
GASではシートオブジェクトを経由してセルにアクセスします。VBAのRangeプロパティに直接アクセスする方法とは異なり、SpreadsheetApp.getActiveSheet()でシートを取得してから操作します。
3. 繰り返し処理(For Each → forEach)
VBAの書き方:
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
Debug.Print ws.Name
Next ws
GASの書き方:
const sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
sheets.forEach(sheet => {
Logger.log(sheet.getName());
});
GASではJavaScriptのforEachメソッドを使って配列をループします。アロー関数(=>)を使うと、VBAのFor Eachよりも簡潔に書けます。
4. アクティブシートの取得(ActiveSheet → getActiveSheet)
VBAの書き方:
Dim ws As Worksheet
Set ws = ActiveSheet
ws.Range("A1").Value = "テスト"
GASの書き方:
const sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange("A1").setValue("テスト");
5. ワークシート関数の利用(WorksheetFunction → JavaScript計算)
VBAの書き方:
Dim total As Double
total = Application.WorksheetFunction.Sum(Range("A1:A10"))
GASの書き方:
const values = SpreadsheetApp.getActiveSheet().getRange("A1:A10").getValues();
const total = values.flat().reduce((sum, v) => sum + (Number(v) || 0), 0);
GASにはWorksheetFunctionに相当するものがないため、JavaScriptの配列メソッド(reduce, filter, mapなど)を使って計算します。慣れるとVBAより柔軟に書けます。
6. ファイルパスの取得(ThisWorkbook.Path → DriveApp)
VBAの書き方:
Dim filePath As String
filePath = ThisWorkbook.Path
GASの書き方:
const fileId = SpreadsheetApp.getActiveSpreadsheet().getId();
const file = DriveApp.getFileById(fileId);
const folders = file.getParents();
if (folders.hasNext()) {
Logger.log("フォルダ: " + folders.next().getName());
}
GASはクラウド上で動作するため、ローカルのファイルパスという概念がありません。代わりにDriveAppを使ってGoogleドライブ上のファイル位置を取得します。
7. メッセージボックスの確認ダイアログ(MsgBox → Browser.msgBox)
VBAの書き方:
Dim result As VbMsgBoxResult
result = MsgBox("続行しますか?", vbYesNo)
If result = vbYes Then
MsgBox "実行します"
End If
GASの書き方:
const result = Browser.msgBox("続行しますか?", Browser.Buttons.YES_NO);
if (result === "yes") {
Browser.msgBox("実行します");
}
VBAのvbYesNoがGASではBrowser.Buttons.YES_NOに対応します。戻り値は文字列("yes"/"no")で返される点に注意してください。
VBAのプロシージャの基本(Sub/Function)について詳しく知りたい方は、VBAのSubとFunctionの違いをご覧ください。また、VBAの変数宣言(Dim)の使い方はVBAのDim宣言の使い方で詳しく解説しています。
VBAからGASに移行するメリット・デメリット
VBAからGASへの移行を検討する際は、以下のメリット・デメリットを把握しておきましょう。
- 完全無料:Excelのライセンス費用が不要(Microsoft 365の契約不要)
- 環境不要:ブラウザだけで開発・実行が完結(PCにExcelがなくてもOK)
- 自動実行:トリガー機能でPCを起動していなくてもサーバー側で実行される
- 共有が簡単:Googleアカウントがあれば誰でもスクリプトを共有・共同編集できる
- 外部連携が豊富:Gmail、Googleドライブ、外部APIとの連携が標準サポート
- 実行速度:VBAの方がローカル実行のため処理速度が速い場合がある
- 実行時間制限:1回の実行が6分まで(VBAは時間制限なし)
- Excel固有機能:ピボットテーブル操作やActiveXコントロールなど一部未対応
- オフライン非対応:インターネット接続が必須(VBAはオフラインでも動作)
- 学習コスト:JavaScript文法を新たに覚える必要がある(ただしVBA経験者なら短期間で習得可能)
結論:社内でGoogleスプレッドシートを主に使っている環境であれば、GASへの移行メリットは大きいです。一方、Excelファイルでの配布が必須な業務では、引き続きVBAの方が適しています。両方使えるようになるのが理想的です。
GASの始め方【環境構築〜Hello World】
GASを始めるのに必要な準備は、Googleアカウントだけです。ソフトウェアのインストールは一切不要で、ブラウザから直接コードを書いて実行できます。
スクリプトエディタの開き方(コンテナバインド型 / スタンドアロン型)
GASには2つの作成方法があります。用途に応じて使い分けましょう。
方法1:コンテナバインド型(スプレッドシートに紐づけ)
スプレッドシートに紐づいたスクリプトで、最もよく使われる方法です。
- Googleスプレッドシートを開く
- メニューから「拡張機能」→「Apps Script」をクリック
- スクリプトエディタが新しいタブで開く
コンテナバインド型はSpreadsheetApp.getActiveSpreadsheet()で紐づいたスプレッドシートに直接アクセスできるため、スプレッドシートの操作に最適です。
方法2:スタンドアロン型(独立したスクリプト)
特定のファイルに紐づかない独立したスクリプトです。
- Googleドライブを開く
- 「新規」→「その他」→「Google Apps Script」をクリック
- スクリプトエディタが開く
スタンドアロン型は複数のスプレッドシートやサービスをまたいで処理する場合に適しています。また、script.google.comから直接アクセスすることもできます。
最初のスクリプト(スプレッドシートのセルに「Hello World」を書き込む)
では、実際にGASを動かしてみましょう。スプレッドシートのA1セルに「Hello, GAS!」と書き込むスクリプトです。
function myFirstFunction() {
const sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange("A1").setValue("Hello, GAS!");
Browser.msgBox("セルA1に書き込みました!");
}
実行手順:
- スプレッドシートから「拡張機能」→「Apps Script」を開く
- 既存のコードを削除し、上記のコードを貼り付ける
- 上部の「実行」ボタン(▶)をクリック
- 初回は承認画面が表示されるので「許可」をクリック
- スプレッドシートに戻ると、A1セルに「Hello, GAS!」が入力されている
GASを初めて実行する際、「このアプリは確認されていません」という警告が表示されます。これは自分で作成したスクリプトでは正常な動作です。「詳細」→「(プロジェクト名)に移動」をクリックして承認してください。
2 SpreadsheetApp.getActiveSheet()
3 .getRange(“A1”).setValue(“Hello World!”);
4}
| A | B | C | |
|---|---|---|---|
| 1 | (空白) Hello World! | ||
| 2 |
デバッグとログの確認方法(Logger.log / console.log)
GASでのデバッグには、Logger.logとconsole.logの2つの方法があります。
function debugExample() {
const sheet = SpreadsheetApp.getActiveSheet();
const value = sheet.getRange("A1").getValue();
// 方法1: Logger.log(実行ログに表示)
Logger.log("A1の値: " + value);
// 方法2: console.log(Cloud Loggingに記録)
console.log("A1の値:", value);
// 変数の型を確認する
Logger.log("型: " + typeof value);
}
ログの確認方法:
- Logger.log:スクリプトエディタの「実行ログ」パネルに表示される(軽量で手軽)
- console.log:左メニューの「実行数」から確認可能(Cloud Loggingに記録、永続的)
VBAのDebug.Printに相当するのがLogger.logです。開発中はLogger.logを使い、本番運用ではconsole.logでエラーを追跡すると効率的です。
2 const data = SpreadsheetApp.getActiveSheet()
3 .getRange(“A1”).getValue();
4 Logger.log(“取得した値: “ + data);
5 console.log(“コンソール出力: “ + data);
6}
スプレッドシート操作の基本【コピペOKコード付き】
GASでスプレッドシートを操作するには、SpreadsheetAppクラスを使います。ここでは、実務で頻出する操作パターンをそのままコピーして使えるコードで紹介します。
セルの読み書き(getValue / setValue)
最も基本となるセルの読み取りと書き込みのコードです。
function readWriteCell() {
const sheet = SpreadsheetApp.getActiveSheet();
// セルの値を読み取り
const value = sheet.getRange("A1").getValue();
Logger.log("A1の値: " + value);
// セルに値を書き込み
sheet.getRange("B1").setValue("書き込みテスト");
// 数値を書き込み
sheet.getRange("C1").setValue(12345);
// 数式を書き込み
sheet.getRange("D1").setFormula("=SUM(A1:C1)");
// 日付を書き込み
sheet.getRange("E1").setValue(new Date());
}
VBAのRange("A1").ValueがGASではgetRange("A1").getValue()に対応します。getter/setterメソッドを使うのがGASの特徴です。
2 const sheet = SpreadsheetApp.getActiveSheet();
3 const val = sheet.getRange(“A1”).getValue(); // “りんご”
4 sheet.getRange(“B1”).setValue(val + ” は果物です”);
5}
| A | B | C | |
|---|---|---|---|
| 1 | りんご | (空白) りんご は果物です | |
| 2 |
範囲操作(getValues / setValues)
複数のセルをまとめて操作する場合は、getValues()/setValues()を使います。1セルずつ読み書きするより大幅に高速です。
function rangeOperations() {
const sheet = SpreadsheetApp.getActiveSheet();
// 範囲の値を一括取得(2次元配列)
const data = sheet.getRange("A1:C10").getValues();
Logger.log("取得したデータ: " + JSON.stringify(data));
// 特定の値にアクセス(0始まりのインデックス)
Logger.log("A1の値: " + data[0][0]); // 1行目1列目
Logger.log("B3の値: " + data[2][1]); // 3行目2列目
// 範囲に一括書き込み(行数・列数を一致させる)
const output = [
["名前", "部署", "売上"],
["田中", "営業", 500000],
["佐藤", "開発", 450000]
];
sheet.getRange("A1:C3").setValues(output);
}
GASではgetValue()/setValue()を1セルずつ繰り返し呼ぶと非常に遅くなります。必ずgetValues()/setValues()でまとめて読み書きしましょう。1,000行のデータでも一括操作なら数秒で完了します。
2 const sheet = SpreadsheetApp.getActiveSheet();
3 const data = sheet.getRange(“A1:C2”).getValues();
4 sheet.getRange(“E1:G2”).setValues(data);
5}
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | 商品名 | 数量 | 単価 | (空白) 商品名 | (空白) 数量 | (空白) 単価 | |
| 2 | りんご | 10 | 150 | (空白) りんご | (空白) 10 | (空白) 150 |
シートの追加・削除・コピー
シートの管理もGASで自動化できます。月次レポートのテンプレート自動生成などに活用できるパターンです。
function sheetManagement() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
// 新しいシートを追加
const newSheet = ss.insertSheet("売上データ_2026");
// シートをコピー(同じスプレッドシート内)
const original = ss.getSheetByName("テンプレート");
if (original) {
const copied = original.copyTo(ss);
copied.setName("テンプレートのコピー");
}
// シートを削除(確認なしで即削除されるため注意)
const oldSheet = ss.getSheetByName("古いシート");
if (oldSheet) {
ss.deleteSheet(oldSheet);
}
// 全シート名を一覧表示
const sheets = ss.getSheets();
sheets.forEach(sheet => {
Logger.log(sheet.getName());
});
}
insertSheet()でシートを追加し、copyTo()でコピー、deleteSheet()で削除します。deleteSheet()は確認ダイアログなしで即座に削除されるため、実行前にシート名を必ず確認しましょう。
2 const ss = SpreadsheetApp.getActiveSpreadsheet();
3 const newSheet = ss.insertSheet();
4 newSheet.setName(“売上データ”);
5 newSheet.copyTo(ss).setName(“売上データ(コピー)”);
6}
| A | B | C | |
|---|---|---|---|
| 1 | (シートが追加されます) | ||
| 2 |
データのフィルタリングと並び替え
スプレッドシートのデータを条件でフィルタリングしたり、並び替えたりする方法です。JavaScriptの配列メソッドを活用します。
function filterAndSort() {
const sheet = SpreadsheetApp.getActiveSheet();
const data = sheet.getDataRange().getValues();
const header = data[0]; // 1行目をヘッダーとして保持
const rows = data.slice(1); // 2行目以降がデータ
// フィルタリング: C列(インデックス2)が80以上のデータ
const filtered = rows.filter(row => row[2] >= 80);
// 並び替え: C列の値で降順ソート
filtered.sort((a, b) => b[2] - a[2]);
// 結果を別シートに出力
const ss = SpreadsheetApp.getActiveSpreadsheet();
const outputSheet = ss.getSheetByName("結果") || ss.insertSheet("結果");
outputSheet.clear();
// ヘッダーを書き込み
outputSheet.getRange(1, 1, 1, header.length).setValues([header]);
// フィルタ結果を書き込み
if (filtered.length > 0) {
outputSheet.getRange(2, 1, filtered.length, filtered[0].length)
.setValues(filtered);
}
Logger.log(filtered.length + "件のデータを出力しました");
}
JavaScriptのfilter()とsort()メソッドを使えば、Excelのフィルター機能やVBAのAutoFilterと同等の処理がシンプルに書けます。getDataRange()を使うとデータが存在する範囲を自動検出するため、行数を気にする必要がありません。
2 const sheet = SpreadsheetApp.getActiveSheet();
3 const range = sheet.getRange(“A1:C5”);
4 range.createFilter(); // フィルタを設定
5 range.sort({column: 2, ascending: false}); // B列降順
6}
| A 商品名 | B 数量▼ | C 単価 | |
|---|---|---|---|
| 1 | みかん | 30 | 80 |
| 2 | ぶどう | 25 | 300 |
| 3 | りんご | 10 | 150 |
| 4 | バナナ | 5 | 120 |
GASで業務を自動化する【3つの実践ユースケース】
GASの基本操作を覚えたら、次は実務で使える自動化スクリプトを作ってみましょう。ここでは、そのままコピペで使える完成品コードを3つ紹介します。
ユースケース1: メール自動送信(完成品コード)
スプレッドシートに宛先リストを用意し、テンプレート変数を差し込んでGmailから一斉送信するスクリプトです。A列にメールアドレス、B列に名前、C列に会社名を入力して実行するだけで、全員にパーソナライズされたメールを送れます。
function sendBulkEmails() {
const sheet = SpreadsheetApp.getActiveSheet();
const data = sheet.getRange("A2:C" + sheet.getLastRow()).getValues();
data.forEach(function(row) {
const email = row[0]; // A列: メールアドレス
const name = row[1]; // B列: 名前
const company = row[2]; // C列: 会社名
const subject = name + "様へのご案内";
const body = name + "様\n\n"
+ "いつもお世話になっております。\n"
+ company + "の件についてご連絡いたします。\n\n"
+ "よろしくお願いいたします。";
MailApp.sendEmail(email, subject, body);
});
Browser.msgBox("メール送信が完了しました!");
}
- 第1引数: 宛先メールアドレス(文字列)
- 第2引数: 件名(文字列)
- 第3引数: 本文(文字列)
- HTML形式で送る場合は第4引数にオプション
{htmlBody: '<h1>HTML</h1>'}を指定
1日あたりのメール送信上限は、無料のGoogleアカウントで100通、Google Workspaceで1,500通です。大量送信する場合は上限に注意してください。
2 const sheet = SpreadsheetApp.getActiveSheet();
3 const data = sheet.getDataRange().getValues();
4 for (let i = 1; i < data.length; i++) {
5 const [name, email, subject] = data[i];
6 GmailApp.sendEmail(email, subject,
7 `${name} 様、ご連絡ありがとうございます。`);
8 }
9}
☝ スプレッドシートのリストから宛先を取得し、全員に自動送信できます
ユースケース2: フォーム回答の自動集計+通知
Googleフォームに回答が届くたびに、自動で管理者にメール通知を送るスクリプトです。アンケートや問い合わせフォームの管理に最適で、回答を見逃す心配がなくなります。
function onFormSubmit(e) {
const responses = e.values;
const timestamp = responses[0];
const name = responses[1];
const email = responses[2];
const message = responses[3];
// 管理者に通知メール送信
const adminEmail = "admin@example.com";
const subject = "【フォーム回答】" + name + "さんから新しい回答";
const body = "回答日時: " + timestamp + "\n"
+ "名前: " + name + "\n"
+ "メール: " + email + "\n"
+ "内容: " + message;
MailApp.sendEmail(adminEmail, subject, body);
}
設定手順: スクリプトエディタの「トリガー」画面から、onFormSubmit を「フォーム送信時」に設定します。以降、フォームに回答が届くたびに自動でメール通知が送信されます。
2 const response = e.response;
3 const answers = response.getItemResponses();
4 const name = answers[0].getResponse();
5 const email = answers[1].getResponse();
6 GmailApp.sendEmail(email,
7 “回答を受け付けました”, `${name} 様`);
8}
| A: 名前 | B: メール | C: 内容 | |
|---|---|---|---|
| 1 | (見出し) | (見出し) | (見出し) |
| 2 | (空白) 山田 花子 | (空白) yamada@example.com | (空白) GASの導入につ… |
☝ onFormSubmit トリガーで、フォーム回答を受けた瞬間に処理できます
ユースケース3: SNS予約投稿
スプレッドシートに投稿スケジュールを管理し、GASとAPIを組み合わせてSNSへの予約投稿を自動化するワークフローです。X(旧Twitter)やThreadsなどのSNSに対応できます。
GASからX APIを使って自動投稿する仕組みは、トリガーと組み合わせることで完全自動化が実現できます。詳しい設定方法は以下の記事を参考にしてください。
関連: X APIのキー取得方法
トリガー設定で完全自動化する
GASのトリガー機能を使えば、スクリプトを手動で実行する必要がなくなります。「毎朝9時にレポート送信」「フォーム回答が届いたら即通知」など、完全自動のワークフローを構築できます。
時間主導型トリガー(毎日/毎週/毎月/分単位)
指定した時間間隔や特定の時刻にスクリプトを自動実行します。日次レポートの送信、定期的なデータバックアップなどに最適です。
function createTimeTrigger() {
// 毎日午前9時に実行
ScriptApp.newTrigger("dailyReport")
.timeBased()
.atHour(9)
.everyDays(1)
.create();
}
function createMinuteTrigger() {
// 5分ごとに実行
ScriptApp.newTrigger("checkUpdates")
.timeBased()
.everyMinutes(5)
.create();
}
注意: トリガー設定関数は1回だけ実行すればOKです。2回実行すると同じトリガーが重複登録されるので気をつけてください。
2 ScriptApp.newTrigger(“sendBulkEmails”)
3 .timeBased()
4 .everyHours(1)
5 .create();
6 Logger.log(“トリガー作成完了”);
7}
☝ ScriptApp.newTrigger() で様々な実行スケジュールを設定できます
イベント主導型トリガー(スプシ編集時/フォーム送信時)
スプレッドシートの編集やフォームの送信などのイベントをきっかけに、スクリプトを自動実行します。リアルタイムな自動化に最適です。
function createEditTrigger() {
const ss = SpreadsheetApp.getActive();
ScriptApp.newTrigger("onSheetEdit")
.forSpreadsheet(ss)
.onEdit()
.create();
}
function onSheetEdit(e) {
const range = e.range;
const sheet = range.getSheet();
Logger.log(sheet.getName() + "の" + range.getA1Notation() + "が編集されました");
}
- シンプルトリガー(onEdit, onOpen): 関数名を予約名にするだけで動作。ただしメール送信やUrlFetchAppなど一部の機能が使えない
- インストーラブルトリガー: ScriptApp.newTrigger() で明示的に登録。全ての機能が利用可能で、エラー通知メールも受け取れる
- 外部APIの呼び出しやメール送信が必要な場合は、インストーラブルトリガーを使いましょう
2 const ss = SpreadsheetApp.getActiveSpreadsheet();
3 ScriptApp.newTrigger(“onSheetEdit”)
4 .forSpreadsheet(ss)
5 .onEdit()
6 .create();
7}
☝ onEdit トリガーで、セルを変更した瞬間にコードを実行できます
トリガーの管理と監視
登録済みのトリガーは、スクリプトエディタの「トリガー」(時計アイコン)から一覧を確認できます。コードからも管理が可能です。
function listTriggers() {
const triggers = ScriptApp.getProjectTriggers();
triggers.forEach(function(trigger) {
Logger.log("関数: " + trigger.getHandlerFunction() + " / 種別: " + trigger.getEventType());
});
}
function deleteAllTriggers() {
const triggers = ScriptApp.getProjectTriggers();
triggers.forEach(function(trigger) {
ScriptApp.deleteTrigger(trigger);
});
}
不要なトリガーが溜まるとエラーの原因になるため、定期的に listTriggers() で確認し、使わないトリガーは削除しておきましょう。
2 const triggers = ScriptApp.getProjectTriggers();
3 triggers.forEach(t => {
4 Logger.log(
5 t.getHandlerFunction() +
6 ” / “ + t.getEventType()
7 );
8 });
9}
☝ getProjectTriggers() でトリガーの管理・削除も行えます
トリガーの注意点(6分制限、同時実行数)
トリガーで自動実行するスクリプトにはいくつかの制限があります。知らないとエラーで止まる原因になるため、以下を押さえておきましょう。
- 1回の実行時間: 通常アカウント6分、Google Workspace 30分
- 1日の総実行時間: 通常アカウント90分/日
- 同時実行数: 最大30
- トリガー上限: 20個/プロジェクト/ユーザー
- 6分制限を超える処理は、PropertiesServiceで処理位置を記録し、複数回に分けて実行する「チャンク処理」で回避できます
外部API連携とChatGPT連携
GASの真価は外部APIとの連携にあります。UrlFetchApp を使えば、あらゆるWebサービスのAPIをスプレッドシートから呼び出せます。ここでは基本パターンから、X API、ChatGPT APIとの連携方法まで解説します。
UrlFetchAppの基本(REST API呼び出し)
UrlFetchAppは、GASから外部のWeb APIにHTTPリクエストを送るための組み込みクラスです。GET / POST / PUT / DELETE すべてのHTTPメソッドに対応しています。
function fetchWeatherData() {
const url = "https://api.example.com/weather?city=Tokyo";
const response = UrlFetchApp.fetch(url);
const data = JSON.parse(response.getContentText());
Logger.log("天気: " + data.weather);
}
UrlFetchApp.fetch() はGETリクエストがデフォルトです。POSTやPUTの場合は第2引数に {method: 'post'} を指定します。muteHttpExceptions: true を追加すると、エラーレスポンスでも例外が発生せず、レスポンスコードで判定できます。
2 const url = “https://api.weather.example.com/tokyo”;
3 const res = UrlFetchApp.fetch(url);
4 const json = JSON.parse(res.getContentText());
5 const sheet = SpreadsheetApp.getActiveSheet();
6 sheet.getRange(“B2”).setValue(json.weather);
7 sheet.getRange(“C2”).setValue(json.temp);
8}
“weather”: “晴れ”,
“temp”: 22,
“humidity”: 45,
“city”: “Tokyo”
}
| A | B: 天気 | C: 気温 | D: 湿度 | |
|---|---|---|---|---|
| 1 | 取得日時 | 天気 | 気温(℃) | 湿度(%) |
| 2 | 2026/03/03 9:00 | — ☀ 晴れ | — 22°C | — 45% |
☝ UrlFetchApp.fetch() でHTTP通信が可能。時間トリガーと組み合わせれば定期取得も
X API連携(投稿の自動化)
GASからX(旧Twitter)のAPIを呼び出して、投稿を自動化できます。OAuth 2.0認証が必要ですが、一度設定すればスプレッドシートから自動投稿が可能です。
function postToX() {
const url = "https://api.x.com/2/tweets";
const payload = { text: "GASからの自動投稿テスト" };
const options = {
method: "post",
headers: {
"Authorization": "Bearer YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
},
payload: JSON.stringify(payload)
};
const response = UrlFetchApp.fetch(url, options);
Logger.log(response.getContentText());
}
X APIのキー取得・設定方法は以下の記事で詳しく解説しています。
2 const token = PropertiesService.getScriptProperties()
3 .getProperty(“BEARER_TOKEN”);
4 const options = {
5 method: “post”,
6 headers: { Authorization: `Bearer ${token}` },
7 payload: JSON.stringify({ text: “GASで自動投稿!” })
8 };
9 UrlFetchApp.fetch(“https://api.twitter.com/2/tweets”, options);
10}
☝ PropertiesService でAPIキーを安全に管理でき、時間トリガーと組み合わせれば定期投稿も実現できます
ChatGPT API連携(スプシからAIを呼び出す)
OpenAIのChatGPT APIをGASから呼び出せば、スプレッドシートの中でAIによるテキスト生成・要約・翻訳が実現できます。GPT-4o対応の完成品コードを紹介します。
function askChatGPT(prompt) {
const apiKey = PropertiesService.getScriptProperties().getProperty("OPENAI_API_KEY");
const url = "https://api.openai.com/v1/chat/completions";
const payload = {
model: "gpt-4o",
messages: [
{ role: "system", content: "あなたは親切なアシスタントです。" },
{ role: "user", content: prompt }
],
temperature: 0.7
};
const options = {
method: "post",
headers: {
"Authorization": "Bearer " + apiKey,
"Content-Type": "application/json"
},
payload: JSON.stringify(payload)
};
const response = UrlFetchApp.fetch(url, options);
const result = JSON.parse(response.getContentText());
return result.choices[0].message.content;
}
function processChatGPTBatch() {
const sheet = SpreadsheetApp.getActiveSheet();
const lastRow = sheet.getLastRow();
for (let i = 2; i <= lastRow; i++) {
const question = sheet.getRange("A" + i).getValue();
if (question && !sheet.getRange("B" + i).getValue()) {
const answer = askChatGPT(question);
sheet.getRange("B" + i).setValue(answer);
Utilities.sleep(1000); // API制限対策
}
}
}
- PropertiesServiceでAPIキー管理: スクリプトエディタの「プロジェクトの設定」→「スクリプトプロパティ」にキーを保存すれば、コード内にAPIキーを直書きせずに済みます
- GPT-4oの料金目安: 入力$2.50/100万トークン、出力$10.00/100万トークン(2024年時点)。1回の要約で約0.1〜0.5円程度です
- コスト節約: テスト時は
gpt-4o-mini(約1/10の料金)を使い、本番でGPT-4oに切り替えるのがおすすめです - 月額上限設定: OpenAIダッシュボードの「Usage limits」で上限額を設定しておけば、想定外の課金を防げます
2 const apiKey = PropertiesService.getScriptProperties()
3 .getProperty("OPENAI_API_KEY");
4 const body = {
5 model: "gpt-4o-mini",
6 messages: [{ role: "user", content: prompt }]
7 };
8 const res = UrlFetchApp.fetch(
9 "https://api.openai.com/v1/chat/completions",
10 { method: "post", payload: JSON.stringify(body), ... }
11 );
12 return JSON.parse(res.getContentText())
13 .choices[0].message.content;
14}
☝ GASとAIを組み合わせれば、スプレッドシートへの自動要約・翻訳・分類なども実現できます
よくあるエラーと対処法
GAS開発でつまずきやすいエラーと、その解決策をまとめました。エラーメッセージが表示されたら、まずこのセクションを確認してください。
実行時間の制限(6分/30分)と回避策
エラーメッセージ: 「起動時間の最大値を超えました」
無料アカウントでは1回の実行が6分、Google Workspaceでは30分で強制停止されます。大量のデータ処理やAPI呼び出しで発生しやすいエラーです。
回避策: バッチ処理(チャンク処理)パターンを使い、PropertiesServiceで処理位置を記録して複数回に分けて実行します。Utilities.sleep() で適度な待機を入れることも有効です。
API呼び出し制限(日次クォータ)
エラーメッセージ: 「Service invoked too many times」
GASには各サービスごとに1日の呼び出し回数上限があります。主な制限値は以下のとおりです。
- Gmail(MailApp.sendEmail): 100通/日(無料)、1,500通/日(Workspace)
- UrlFetchApp.fetch: 20,000回/日(無料)、100,000回/日(Workspace)
- PropertiesService: 50,000回/日(無料)、500,000回/日(Workspace)
対策: Utilities.sleep() でリクエスト間隔を空ける、CacheService でAPI結果をキャッシュする、バッチ処理で1回のAPI呼び出しにまとめるなどの方法が有効です。
権限エラー(OAuth認証画面)の解決方法
初めてスクリプトを実行すると「このアプリはGoogleで確認されていません」という警告が表示されます。これは正常な動作で、自分で作成したスクリプトの場合は安全に承認できます。
解決手順:
- 警告画面で「詳細」をクリック
- 「(プロジェクト名)(安全ではないページ)に移動」をクリック
- 権限の一覧を確認し「許可」をクリック
他人から共有されたスクリプトの場合は、必ずコードの内容を確認してから承認してください。
「このスクリプトを実行する権限がありません」対処法
エラーメッセージ: 「You do not have permission to call〜」
スクリプトが利用するGoogleサービス(Gmail、Drive、Calendarなど)へのアクセス権が不足している場合に発生します。
対処法:
- appsscript.json の oauthScopes を確認し、必要なスコープを明示的に追加する
- トリガーの再作成: 古いトリガーを削除し、新しいトリガーを作成すると権限が再設定される
- シンプルトリガーの制限: onEdit等ではMailAppやUrlFetchAppが使えないため、インストーラブルトリガーに変更する
- V8ランタイム: プロジェクト設定で「Chrome V8ランタイム」が有効になっているか確認する
よくある質問(FAQ)
Q. GASにプログラミング経験は必要ですか?
いいえ、プログラミング未経験でも始められます。GASはJavaScriptベースですが、スプレッドシートのセルを読み書きするだけなら数行のコードで実現できます。この記事のサンプルコードをコピーして、値を自分の用途に変えるところから始めるのがおすすめです。Excel VBAの経験がある方なら、文法の違いを覚えるだけですぐに書けるようになります。
Q. GASは無料で使えますか?制限はありますか?
はい、Googleアカウントがあれば完全無料で利用できます。主な制限として、1回の実行時間が6分まで、メール送信が1日100通まで、トリガーが1スクリプトあたり20個までなどがあります。Google Workspaceプランに加入すると、実行時間が30分に拡大されるなど制限が緩和されます。個人の業務自動化であれば、無料枠で十分対応可能です。
Q. VBAからGASに移行するべきですか?
「完全移行」より「併用」がおすすめです。GASはクラウドベースで環境構築不要、Gmail・カレンダー・フォームとの連携が強力という利点があります。一方、デスクトップExcelの高度な書式制御やCOM操作が必要な業務ではVBAの方が適しています。チーム共有・定期実行・API連携が多いならGAS、ローカルのExcel操作が中心ならVBAを使い分けるのがベストです。
Q. GASでスクレイピングはできますか?
はい、UrlFetchApp でWebページのHTMLを取得し、正規表現や XmlService でパースすることで簡易的なスクレイピングは可能です。ただし、JavaScriptで動的に生成されるページの取得はできません。また、対象サイトの利用規約やrobots.txtを必ず確認し、アクセス頻度にも配慮してください。本格的なスクレイピングにはPythonの方が向いています。
Q. GASとPythonのどちらを学ぶべきですか?
目的によります。Googleサービスの自動化(スプレッドシート、Gmail、カレンダー等)が主目的ならGASが最適です。環境構築不要で、ブラウザだけで開発・実行できる手軽さが強みです。データ分析・機械学習・大規模なスクレイピングにはPythonが向いています。業務自動化から始めるならGAS、より幅広いプログラミングスキルを身につけたいならPythonを選びましょう。
まとめ
この記事では、Google Apps Script(GAS)の基礎から実践的な自動化テクニックまでを解説しました。
- GASはGoogleアカウントがあれば無料で使え、環境構築も不要
- メール一斉送信・フォーム集計通知・SNS予約投稿がコピペで実現できる
- トリガー機能で完全自動化(手動実行が不要に)
- UrlFetchAppで外部API連携、ChatGPT APIでAI機能も追加可能
- 6分制限やAPI日次クォータなど制限を理解し、チャンク処理で回避
まずはこの記事のサンプルコードをコピーして、スクリプトエディタで実行してみてください。1つ動くものを作れば、応用範囲はどんどん広がっていきます。
「自分でGASを書くのは大変...」「もっと本格的な自動化をしたい」という方へ。GAS開発代行・自動化コンサルティングを承っています。
LINEでExcelを気軽に学べる
