GASでスプレッドシートを操作する方法|簡単な自動処理の作り方
Google Apps Script(GAS)を使うと、スプレッドシートの読み取り・書き込み・整形・自動実行をまとめて扱えます。請求一覧の集計、問い合わせ管理のステータス更新、毎朝の定型レポート作成のような作業を、手作業ではなくスクリプトで回せるのが強みです。
特に最初の一歩では、getValue() や getValues() で値を読み、setValue() や setValues() でまとめて書き戻す流れを押さえると実務に直結します。単発の操作だけでなく、編集時の自動処理や定期実行までつなげやすいからです。
- できること: セルの取得、複数行の一括更新、条件分岐、トリガーでの自動実行
- 向いている場面: 日次集計、入力チェック、担当者別の振り分け、ステータス更新
- 前提環境: Google スプレッドシート + Apps Script
- 確認時点: 2026年4月時点で公開されている Google 公式ドキュメントを参照
ここがポイント: 最初は「1セル操作」よりも、2次元配列でまとめて読み書きする書き方を覚えたほうが、あとで遅くなりにくく、実務でも使い回しやすくなります。
まず押さえたい前提
GASでスプレッドシートを触るときは、主に SpreadsheetApp を使います。バインドされたスクリプトなら、シート側の「拡張機能」→「Apps Script」から開いて、そのファイルに対して直接コードを書けます。
公式リファレンスでは SpreadsheetApp がスプレッドシート全体への入口、Sheet が個別シート、Range がセルや範囲を表します。実務ではこの3つを行き来する形が基本です。
よく使うオブジェクト
SpreadsheetApp: スプレッドシート全体を開くSpreadsheet: ブック本体を扱うSheet: シート単位で操作するRange: セルや範囲の取得・更新を行う
最小構成の流れ
- スプレッドシートを取得する
- シートを選ぶ
- 範囲を指定する
- 値を読む、または書く
function sampleBasicReadWrite() {
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet = spreadsheet.getSheetByName('売上管理');
const currentValue = sheet.getRange('B2').getValue();
sheet.getRange('C2').setValue(currentValue);
}
この例では、B2 の値を読み取って C2 に書き込んでいます。まずはここが出発点です。
GASでスプレッドシートを操作する基本の書き方
最初に覚えるべきなのは、単一セルと複数セルで書き方が変わることです。
1セルだけ読む・書く
function singleCellExample() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('売上管理');
const value = sheet.getRange('A2').getValue();
sheet.getRange('D2').setValue(value);
}
getValue(): 1セルの値を取得setValue(): 1セルに値を書き込む
ちょっとした転記やフラグ更新ならこれで十分です。ただし、行数が増えると1セルずつの処理は遅くなりやすくなります。
複数セルをまとめて読む・書く
function multiCellExample() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('売上管理');
const values = sheet.getRange('A2:C4').getValues();
sheet.getRange('E2:G4').setValues(values);
}
getValues(): 2次元配列で取得setValues(): 2次元配列で一括反映
setValues() は、指定した範囲の行数・列数と配列の形が一致している必要があります。ここが初心者が最もつまずきやすい点です。
実務で使いやすいサンプル
ここでは「未処理の売上データに対して、金額に応じてステータスを自動で入れる」例を扱います。毎回フィルターや目視で確認している作業を置き換えるイメージです。
例のシート構成
- A列: 日付
- B列: 顧客名
- C列: 金額
- D列: ステータス
入力例
2026/04/22, 株式会社A, 120000,2026/04/22, 株式会社B, 30000,2026/04/22, 株式会社C, 80000,
50,000円以上なら「確認対象」を入れるコード
function updateStatusByAmount() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('売上管理');
const lastRow = sheet.getLastRow();
if (lastRow < 2) return;
const dataRange = sheet.getRange(2, 1, lastRow - 1, 4);
const values = dataRange.getValues();
for (let i = 0; i < values.length; i++) {
const amount = values[i][2];
if (amount >= 50000) {
values[i][3] = '確認対象';
} else {
values[i][3] = '通常';
}
}
dataRange.setValues(values);
}
出力イメージ
2026/04/22, 株式会社A, 120000, 確認対象2026/04/22, 株式会社B, 30000, 通常2026/04/22, 株式会社C, 80000, 確認対象
この書き方の利点は、シートへのアクセス回数が少ないことです。公式のベストプラクティスでも、読み取りと書き込みはまとめて行うほうが速いと案内されています。
編集をきっかけに自動処理する方法
手動実行だけでなく、セルが編集された瞬間に動かすと、運用がかなり楽になります。
onEdit(e) の最小例
function onEdit(e) {
const sheet = e.range.getSheet();
if (sheet.getName() !== '売上管理') return;
if (e.range.getColumn() !== 3 || e.range.getRow() === 1) return;
const amount = e.range.getValue();
const statusCell = sheet.getRange(e.range.getRow(), 4);
if (amount >= 50000) {
statusCell.setValue('確認対象');
} else {
statusCell.setValue('通常');
}
}
C列の金額を編集したら、その行のD列に自動でステータスを書き込みます。入力担当者が複数いても、更新ルールを揃えやすいのが利点です。
この方法が向く場面
- 入力直後に判定したい
- 手動実行を忘れたくない
- シート利用者にボタン操作をさせたくない
注意点
- シンプルトリガーには制約があり、実行時間は最大30秒です
- シンプルトリガーは、権限が必要な一部サービスを使えません
- イベント情報は
eオブジェクトから受け取ります
定期実行したいならインストール型トリガー
毎朝9時に集計したい、1時間ごとにステータスを更新したい、という用途ならインストール型トリガーが向いています。
シンプルトリガーより柔軟で、時間主導トリガーも使えます。公式ドキュメントでも、定期実行や権限を伴う処理にはインストール型トリガーが案内されています。
例: 1時間ごとに更新するトリガーを作る
function createHourlyTrigger() {
ScriptApp.newTrigger('updateStatusByAmount')
.timeBased()
.everyHours(1)
.create();
}
インストール型トリガーで知っておきたい点
- 作成者のアカウント権限で動く
- 編集イベントだけでなく、時間ベースでも実行できる
- 失敗時はメール通知される場合がある
- トリガー数や実行回数には上限がある
よくある失敗と対処
実際につまずきやすいポイントは、だいたい決まっています。
setValues() でエラーになる
原因は、範囲サイズと配列サイズの不一致がほとんどです。
NGになりやすい例:
sheet.getRange('A1:B2').setValues([[1, 2, 3]]);
A1:B2 は2行2列ですが、配列は1行3列です。この形では反映できません。
改善例:
sheet.getRange('A1:B2').setValues([
[1, 2],
[3, 4]
]);
シート名違いで取得できない
getSheetByName('売上管理') は、名前が1文字でも違うと null になります。
対処の基本:
- シート名の全角・半角を確認する
- 改名予定があるなら定数にまとめる
if (!sheet) return;のような防御を書く
1セルずつ更新して遅くなる
件数が増えたときに目立つ失敗です。ループの中で setValue() を何度も呼ぶより、配列にまとめて最後に setValues() で書くほうが速くなります。
上限に引っかかる
Apps Script には各種クォータがあり、アカウント種別によっても上限が違います。しかも一部の上限は変更される可能性があります。処理が増えてきたら、公式のクォータ一覧を確認しながら、実行頻度と対象範囲を見直す必要があります。
実務での使いどころ
GASでシートを触る価値は、単なる自動化よりも「運用ルールをコードに固定できること」にあります。
使いどころの例
- 問い合わせ管理表で、期限切れ案件に自動で注意フラグを付ける
- 売上台帳で、条件に応じて担当者レビュー対象を振り分ける
- フォーム連携シートで、受信後に整形して別シートへ転記する
- 朝の定期実行で、集計結果だけをレポート用シートに出す
人によって書き方や判断がぶれやすい作業ほど、GASとの相性が良くなります。
関連ツールと使い分け
GASは便利ですが、常に最適とは限りません。用途によっては別の選択肢もあります。
GASが向くケース
- Google スプレッドシートをそのまま使っている
- Google Workspace の運用に寄せたい
- シート更新をきっかけに自動処理したい
関数だけで十分なケース
- 単純な整形だけで済む
- 保守担当がコードに触れない
IF、FILTER、ARRAYFORMULAで完結できる
PythonやNode.jsが向くケース
- 外部API連携が多い
- 複雑なデータ加工が多い
- バージョン管理やテストを厳密にしたい
まずはGASで小さく自動化し、処理量や保守要件が増えたら外部実行環境に寄せる、という進め方が現実的です。
まず試すならこの手順
迷ったら、次の順で触ると理解しやすくなります。
- スプレッドシートに「売上管理」シートを作る
- A列からD列まで見出しを入れる
singleCellExample()を動かして1セル更新を確認するupdateStatusByAmount()に切り替えて一括更新を試す- 必要なら
onEdit(e)や時間トリガーを追加する
最初から大きな自動化を組むより、1回で動く最小例を確認してから自動実行へ広げるほうが失敗しにくいです。
まとめ
GASでスプレッドシートを操作する基本は、SpreadsheetApp でシートを開き、Range で値を読み書きすることです。実務で使うなら、1セル操作より getValues() と setValues() を中心に覚えたほうが伸びやすく、編集時の自動処理や定期実行にもつなげやすくなります。
次に見るべきポイントは2つです。
- 処理件数が増えても遅くならないよう、一括読み書きに寄せる
- 単発実行で十分か、
onEdit(e)や時間トリガーが必要かを早めに決める
この2点を押さえるだけでも、日々のシート作業はかなり減らせます。
