GAS入門 — Google Apps Script
スプレッドシートをJavaScriptで操作・自動化するGoogle Apps Scriptの第一歩。エディタの開き方から最初のスクリプト、SpreadsheetAppの基本、カスタム関数、承認ダイアログの意味、安全に始める心得までを丁寧に解説します。
関数では届かない「繰り返し作業」と「定期処理」を、プログラムに任せる入口です。 ここまでの章で扱った数式は、シートを開いている間だけ・セルの中だけで動くものでした。本章で学ぶ Google Apps Script(GAS)は、スプレッドシートそのものを JavaScript で操作し、ボタンひとつや決まった時刻に、まとめて処理を走らせる仕組みです。GAS未経験でも追えるよう、エディタを開くところから順に進めます。
本章で扱う内容は次のとおりです。
- GASとは — 何ができるのかを俯瞰する
- いつ関数でなくGASか — 使い分けの判断軸
- エディタを開く — 拡張機能 > Apps Script
- 最初のスクリプト — 実行ボタンと初回の承認ダイアログ
- SpreadsheetApp の基本 — シートとセルの読み書き
- まとめて読み書き —
getValues/setValuesの鉄則 - カスタム関数 — セルから呼べる自作関数
- デバッグの基本 — ログの読み方
- 安全に始める心得 — 原本を壊さない
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 のコードを書くエディタは、スプレッドシートのメニューから開きます。
- 対象のスプレッドシートを開く
- メニューの 「拡張機能」>「Apps Script」 をクリック
新しいタブで Apps Script エディタが開きます。ここに書いたスクリプトは、そのスプレッドシートに紐づいた「プロジェクト」として保存されます。
エディタの構造はおおまかに次の3階層です。
- プロジェクト — スプレッドシートに紐づくコードの入れ物。ファイルやトリガー、設定をまとめて持ちます。
- ファイル(
.gs) — コードを書くファイル。最初はコード.gs(環境によりCode.gs)が1つあります。 - 関数 — 処理のまとまり。
function 名前() { ... }の単位で、実行はこの関数ごとに行います。
4. 最初のスクリプト
エディタに最初からある myFunction を、次のように書き換えてみましょう。GAS は JavaScript なので、function・var/const・// コメントなどの書き方はそのまま使えます。
function myFunction() {
console.log("こんにちは、GAS");
Logger.log("ログにも出ます");
}
書いたら、エディタ上部の 実行ボタン(▶ 実行)を押します。実行する関数が複数あるときは、隣のドロップダウンで対象の関数を選んでから実行します。console.log と Logger.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関数を動かしてみましょう。