10 第4部 自動化 / GASで手作業をなくす

GAS入門 — Google Apps Script

スプレッドシートをJavaScriptで操作・自動化するGoogle Apps Scriptの第一歩。エディタの開き方から最初のスクリプト、SpreadsheetAppの基本、カスタム関数、承認ダイアログの意味、安全に始める心得までを丁寧に解説します。

読了 約14分 最終更新 2026.06 GASApps ScriptSpreadsheetApp自動化

関数では届かない「繰り返し作業」と「定期処理」を、プログラムに任せる入口です。 ここまでの章で扱った数式は、シートを開いている間だけ・セルの中だけで動くものでした。本章で学ぶ Google Apps Script(GAS)は、スプレッドシートそのものを JavaScript で操作し、ボタンひとつや決まった時刻に、まとめて処理を走らせる仕組みです。GAS未経験でも追えるよう、エディタを開くところから順に進めます。

本章で扱う内容は次のとおりです。

  1. GASとは — 何ができるのかを俯瞰する
  2. いつ関数でなくGASか — 使い分けの判断軸
  3. エディタを開く — 拡張機能 > Apps Script
  4. 最初のスクリプト — 実行ボタンと初回の承認ダイアログ
  5. SpreadsheetApp の基本 — シートとセルの読み書き
  6. まとめて読み書きgetValues / setValues の鉄則
  7. カスタム関数 — セルから呼べる自作関数
  8. デバッグの基本 — ログの読み方
  9. 安全に始める心得 — 原本を壊さない

GAS は JavaScript をベースにした言語です。公式の入口は Apps Script 概要(公式)、スプレッドシート操作のAPI一覧は Spreadsheet サービス(公式) にあります。迷ったら一次情報を確認してください。

1. GASとは

GAS(Google Apps Script)は、Google スプレッドシートやドキュメント、Gmail、カレンダーなどを JavaScript で操作・自動化 できる仕組みです。ブラウザ上のエディタにコードを書き、Google のサーバー上で実行します。手元に開発環境を用意する必要はありません。

スプレッドシートと組み合わせると、たとえば次のようなことができます。

定期処理

毎朝9時に集計を更新する、月初に前月分のシートを複製する——といった処理を、決まった時刻に自動実行できます(時間主導のトリガー)。

通知

在庫が発注点を下回ったらメールを送る、締切が近いタスクを知らせる、など条件に応じた連絡を自動化できます。

外部連携

Gmail やカレンダー、フォーム、外部のWebサービスとデータをやり取りできます。詳しくは第12章で扱います。

カスタム関数

=MYFUNC(A1) のように、セルから呼べる自分専用の関数を作れます。標準の関数で足りない計算を補えます。

メニュー・ボタン

シート上部に独自メニューを追加したり、図形にスクリプトを割り当ててボタン化したりできます。担当者は中身を知らなくても押すだけで使えます。

一括処理

数百行のデータを整形する、複数シートを横断して集計する、といった「手作業だと大変な反復」を一気に処理できます。

2. いつ関数でなくGASか

数式(関数)は強力ですが、できることはあくまで「セルに値を計算して表示する」範囲です。次のような場面は、関数では届きません。GAS の出番です。

やりたいこと関数でできるかGASなら
売上を集計して表示できる(SUMIFS等)不要
毎朝決まった時刻に処理を走らせるできないできる(トリガー)
条件に応じてメールを送るできないできる
外部サービスと連携するできないできる
数百行を一括で整形・転記する一部のみ得意
ボタンや独自メニューを置くできないできる

判断の目安はシンプルです。「セルの中で完結する計算」なら関数、「シートの外に働きかける」「決まったタイミングで自動的に動かす」「同じ手作業を繰り返している」ならGAS です。まずは関数で組み、手作業のコピーや定型処理が増えてきたらGASを検討する、という順序が安全です。

3. エディタを開く

GAS のコードを書くエディタは、スプレッドシートのメニューから開きます。

  1. 対象のスプレッドシートを開く
  2. メニューの 「拡張機能」>「Apps Script」 をクリック

新しいタブで Apps Script エディタが開きます。ここに書いたスクリプトは、そのスプレッドシートに紐づいた「プロジェクト」として保存されます。

エディタの構造はおおまかに次の3階層です。

  • プロジェクト — スプレッドシートに紐づくコードの入れ物。ファイルやトリガー、設定をまとめて持ちます。
  • ファイル.gs) — コードを書くファイル。最初は コード.gs(環境により Code.gs)が1つあります。
  • 関数 — 処理のまとまり。function 名前() { ... } の単位で、実行はこの関数ごとに行います。

4. 最初のスクリプト

エディタに最初からある myFunction を、次のように書き換えてみましょう。GAS は JavaScript なので、functionvar/const// コメントなどの書き方はそのまま使えます。

function myFunction() {
  console.log("こんにちは、GAS");
  Logger.log("ログにも出ます");
}

書いたら、エディタ上部の 実行ボタン(▶ 実行)を押します。実行する関数が複数あるときは、隣のドロップダウンで対象の関数を選んでから実行します。console.logLogger.log の出力は、エディタ下部の 実行ログ に表示されます(どちらも文字列をログに記録する命令で、初心者のうちは console.log だけ覚えれば十分です)。

初回の承認(OAuth)ダイアログ

スクリプトがスプレッドシートやメールなど、あなたのデータに触れる処理を含む場合、初回の実行時に「承認が必要です」というダイアログ が出ます。これは、そのスクリプトがどの範囲のデータにアクセスしてよいか(権限スコープ)を、あなたが許可するための仕組みです。

一度承認すれば、同じ権限の範囲では次回から確認は出ません。新しい種類の処理(たとえば初めてメール送信を追加した)を加えると、再び承認を求められます。

5. SpreadsheetApp の基本

スプレッドシートを操作する入口が SpreadsheetApp です。ここから「どのスプレッドシートの」「どのシートの」「どの範囲の」値を読み書きするか、を順にたどっていきます。

命令意味
SpreadsheetApp.getActiveSpreadsheet()今開いているスプレッドシート全体を取得
getSheetByName("シート名")名前を指定してシート(タブ)を取得
getActiveSheet()今アクティブなシートを取得
getRange("A1") / getRange(1, 1, 3, 2)セル範囲を取得(A1記法 | 行・列・行数・列数)
getValue() / getValues()値を読む(1セル | 範囲をまとめて)
setValue(x) / setValues(配列)値を書く(1セル | 範囲をまとめて)
appendRow([...])末尾に1行追記する

1セルの読み書き

function readWriteOneCell() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("売上");
  const a1 = sheet.getRange("A1").getValue();   // A1の値を読む
  console.log(a1);
  sheet.getRange("B1").setValue("合計");          // B1に書き込む
}

getRange には2通りの指定方法があります。getRange("A1") のような A1記法 と、getRange(行番号, 列番号, 行数, 列数) のような 数値指定 です。たとえば getRange(2, 1, 5, 3) は「2行1列目から、5行・3列ぶん」、つまり A2:C6 を表します。

appendRow で1行追記

末尾に行を足すだけなら appendRow が手軽です。日付つきの記録などに向きます。

function addLog() {
  const sheet = SpreadsheetApp.getActiveSheet();
  sheet.appendRow([new Date(), "入庫", 10]);  // 日付・区分・数量の1行を追記
}

6. まとめて読み書きが鉄則

ここが初心者と中級者の分かれ目です。複数のセルを扱うとき、getValue / setValue を1セルずつ繰り返すのではなく、getValues / setValues で範囲をまとめて読み書きする のが鉄則です。

getValues() は範囲の値を 2次元配列 で返します。[[1行目の各列], [2行目の各列], ...] という入れ子の配列です。書き込みの setValues() も、同じ形の2次元配列を渡します。

function readRange() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const values = sheet.getRange("A1:C3").getValues();
  // values は [[A1, B1, C1], [A2, B2, C2], [A3, B3, C3]]
  console.log(values[0][0]); // A1 の値
  console.log(values[1][2]); // C2 の値
}
範囲の読み書きの作法

const values = sheet.getRange("A1:C100").getValues(); — 100行ぶんを1回でまとめて読む
100回 getValue() を呼ぶループ(シートへのアクセスが1セルごとに発生し、極端に遅くなる)

シートへのアクセス1回ごとに通信コストがかかるため、1セルずつ触ると処理が一気に遅くなります。「読むときは一括で読み、JavaScript側の配列で加工し、書くときも一括で書き戻す」 が基本姿勢です。具体的な高速化のパターンは 第11章 GAS実践パターン で詳しく扱います。

7. カスタム関数

GAS で書いた関数は、シートのセルから =関数名(引数) の形で呼び出せます。これを カスタム関数 といいます。標準の関数では難しい計算を、自分で定義できます。

次は、引数の文字列を逆さまにして返す簡単な例です。

/**
 * 文字列を逆順にして返す
 * @param {string} text 入力文字列
 * @return 逆順にした文字列
 * @customfunction
 */
function REVERSETEXT(text) {
  return String(text).split("").reverse().join("");
}

これを保存すると、シートのセルで =REVERSETEXT(A1) のように使えます。A1 が「あいう」なら「ういあ」が返ります。関数名は慣例として大文字で書くと、標準関数と並べたときに自作だと分かりやすくなります。

8. デバッグの基本

思ったとおりに動かないときは、ログ を頼りに原因を絞り込みます。

  • console.log(値) を要所に入れ、変数の中身を実行ログで確認します。「ここまで来ているか」「変数に何が入っているか」を一つずつ見ていくのが基本です。
  • 実行後、エディタ下部の 実行ログ に出力が並びます。エラーが起きた場合は、エラーメッセージと、どの行で止まったかも表示されます。
  • 配列の中身が思った形か(getValues の2次元配列など)を console.log(JSON.stringify(values)) で覗くと、構造が分かりやすくなります。
function debugSample() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const values = sheet.getRange("A1:B2").getValues();
  console.log(JSON.stringify(values)); // 例: [["氏名","点数"],["山田",80]]
}

エラーメッセージは敵ではなく、最短の手がかりです。「どの関数の・何行目で・何が undefined か」を読み取れば、原因の大半は見つかります。

9. 安全に始める心得

最後に、いちばん大切なことです。スクリプトは 値を上書き・削除できてしまう ため、いきなり本番のシートで試すのは禁物です。

GAS の基本動作——シートを取得し、値を読み、加工し、書き戻す——はこれで一通りそろいました。次はこれを実務で使える形にする番です。一括処理の高速化や、トリガーによる定期実行、よくある処理の型は 第11章 GAS実践パターン で扱います。さらに Gmail やフォームとの連携・運用のコツは 第12章 連携と運用 へ。手を動かして覚えたい人は 演習で鍛える を、用語に迷ったら 用語集参考リンク を活用してください。まずは原本のコピーで、最初の1関数を動かしてみましょう。