GASを使ってスプレッドシートやドキュメントの操作を始めると、最初は単純な処理でも、だんだんと「もっと複雑なことをしたい」「もっと効率よくデータを扱いたい」と感じるようになるかと思います。例えば、複数の関連する情報(社員の名前、部署、年齢など)をまとめて管理したり、今日の日付を自動でセルに入力したり、特定の計算をスクリプトに任せたりしたい場面が出てくるでしょう。
そんな時に非常に役立つのが、今回解説する「クラス」と「オブジェクト」という考え方です。これらを理解すると、データを構造的に管理しやすくなり、コードが格段に整理されます。難しそうに聞こえるかもしれませんが、クラスは「設計図」、オブジェクトは「設計図から作られたモノ」とイメージすれば大丈夫です。
さらに、GASには最初から便利な機能が詰め込まれた「組み込みオブジェクト」というものが用意されています。この記事では、特に使用頻度の高い、数学的な計算を担当する「Math」オブジェクトや、日付・時刻を扱う「Date」オブジェクトに焦点を当て、具体的な使い方をサンプルコードと共に分かりやすくご紹介します。
この記事を読み終えれば、GASで扱えるデータの幅が広がり、より高度な自動化への第一歩を踏み出せるはずです。
クラスとオブジェクト
クラスとオブジェクトとは?
GASでのプログラミング学習を進めると、「クラス」と「オブジェクト」という言葉に出会います。これは、関連するデータ(情報)と処理(動作)をひとまとめにするための非常に強力な仕組みです。
少し分かりにくいかもしれませんが、以下のようにイメージしてください。
- クラス: 設計図(例:「商品」の設計図)
- オブジェクト: 設計図をもとに作られた実体(例:「リンゴ」や「バナナ」という個々の商品)
例えば、スプレッドシートで在庫管理をする場合、「商品名」「価格」「在庫数」といったデータと、「税込価格を計算する」「在庫情報を表示する」といった処理は常セットで扱われます。
これらをバラバラに管理するとコードが複雑になりがちですが、「商品」という一つの「設計図(クラス)」を作っておけば、そこから「リンゴ」や「バナナ」といった具体的な「実体(オブジェクト)」を簡単に、かつ必要な数だけ作れるようになります 。
GASでクラスを定義する方法
GAS(JavaScript)では、classというキーワードを使って「設計図」を定義します 。
ここでは例として、商品の「商品名(name)」と「価格(price)」を管理する Product というクラス(設計図)を作ってみましょう。
// 「Product」クラス(設計図)の定義
class Product {
// 1. コンストラクタ (初期設定)
constructor(name, price) {
this.name = name;
this.price = price;
}
// 2. メソッド (処理・動作)
// 商品情報を表示する
getInfo() {
return '商品名: ' + this.name + '、価格: ' + this.price + '円';
}
// 税込価格(10%)を計算する
getTaxIncludedPrice() {
return Math.floor(this.price * 1.1);
}
}
この設計図には、大きく分けて2つの要素が含まれています。
1. コンストラクタ (初期設定を行う特別なメソッド)
constructor という名前の特別なメソッド(関数)です 。
これは、このクラス(設計図)から新しいオブジェクト(実体)を作る際に、一度だけ自動的に呼び出されます 。主な役割は、受け取った初期データ(この例では name と price)を、オブジェクト内部の保管場所(プロパティ)にセットすることです 。
this.name = name; という記述は、「このオブジェクト(this)の name という保管場所に、引数で受け取った name を代入する」という意味になります 。
2. メソッド (オブジェクトの「動作」を定義)
コンストラクタ以外に定義された関数を「メソッド」と呼びます 。これは、そのオブジェクト(実体)が行える「動作」や「処理」を定義するものです。
getInfo():
this.name や this.price を使って、そのオブジェクトが持つ情報を文字列として返します 。
getTaxIncludedPrice(): そのオブジェクトが持つ this.price を使って、税込価格を計算して返します。
オブジェクト(インスタンス)の生成と利用
クラス(設計図)を定義しただけでは、まだ実体はありません。new というキーワードを使って、クラスからオブジェクト(実体)を生成します 。このオブジェクトのことを「インスタンス」と呼ぶこともあります。
以下の関数を実行して、実際にオブジェクトを作ってみましょう。
function createProduct() {
// Productクラスから「リンゴ」オブジェクトを1つ作る
// new 実行時にコンストラクタが呼ばれる
const apple = new Product('リンゴ', 150);
// オブジェクトそのものを表示
console.log(apple);
// オブジェクトのメソッド(getInfo)を実行
console.log(apple.getInfo());
// オブジェクトのメソッド(getTaxIncludedPrice)を実行
console.log('税込価格: ' + apple.getTaxIncludedPrice() + '円');
}
実行結果
{ name: 'リンゴ', price: 150 }
商品名: リンゴ、価格: 150円
税込価格: 165円
new Product('リンゴ', 150) と記述した瞬間に constructor が実行され、name に「リンゴ」、price に 150 が設定されたオブジェクト(apple)が生成されます 。
生成されたオブジェクトは { name: 'リンゴ', price: 150 } というデータを持っていることが分かります。
その後は apple.getInfo() や apple.getTaxIncludedPrice() のように、ドット(.)で繋げてメソッドを呼び出すことで、そのオブジェクト固有の動作(計算や情報表示)を実行できます 。
クラス(設計図)のメリット:複数のオブジェクトを簡単に作成
クラス(設計図)を使う最大の利点は、同じ構造を持つオブジェクト(実体)を簡単に複数作れることです 。
function createMultipleProducts() {
// 設計図(Product)は1つ
const apple = new Product('リンゴ', 150);
const banana = new Product('バナナ', 100);
// appleの情報を表示
console.log(apple.getInfo());
console.log('税込価格: ' + apple.getTaxIncludedPrice() + '円');
// bananaの情報を表示
console.log(banana.getInfo());
console.log('税込価格: ' + banana.getTaxIncludedPrice() + '円');
}
実行結果
商品名: リンゴ、価格: 150円
税込価格: 165円
商品名: バナナ、価格: 100円
税込価格: 110円
Product という設計図は1つですが、new を使って「リンゴ」オブジェクトと「バナナ」オブジェクトという、異なるデータ(プロパティ)を持つ実体を2つ作れました。
apple.getInfo() を呼べばリンゴの情報が、banana.getInfo() を呼べばバナナの情報が返ってくるように、各オブジェクトは独立して動作します 。
このように、クラスを使うとデータの管理が非常に整理され、効率的なコーディングが可能になります。
組み込みオブジェクト
組み込みオブジェクトとは?
GASでのプログラミングを効率化するために、最初から用意されている便利な「クラス(設計図)」や「オブジェクト(実体)」がたくさんあります。これらを「組み込みオブジェクト」または「標準ビルトインオブジェクト」と呼びます 1。
先ほどは Product というクラスを自分で一から定義しましたが、組み込みオブジェクトは私たちが定義しなくても、すぐに呼び出して使うことができます。
GASでよく使われる代表的な組み込みオブジェクトには、以下のようなものがあります 2。
- String: 文字列を操作するためのオブジェクト(すでに
lengthプロパティなどで使っています) - Array: 配列を操作するためのオブジェクト
- Date: 日付や時刻を扱うためのオブジェクト
- Math: 数学的な計算や定数(円周率など)を扱うためのオブジェクト
これらを使いこなすことで、複雑な処理も短いコードで実現できます。今回は、その中でも特に便利な Math オブジェクトと Date オブジェクトについて見ていきましょう。
Mathオブジェクト:数学的処理のスペシャリスト
Math オブジェクトは、その名の通り、数学的な計算を行うための機能(メソッド)や、決まった値(定数)を提供してくれるオブジェクトです 3。
Mathオブジェクトの大きな特徴
Math オブジェクトの最も大きな特徴は、new を使ってオブジェクト(実体)を生成する必要がない、という点です 4。
Product クラスの時は new Product() と書きましたが、Math オブジェクトはGASのシステム内に最初から実体として存在しています。
そのため、私たちは Math.メソッド名() や Math.プロパティ名 のように、Math に直接ドット(.)を繋げて使います 5。このような使い方をするオブジェクトを「静的オブジェクト」と呼ぶこともあります。
よく使われるMathオブジェクトの機能
Math オブジェクトの便利な機能を、具体的なコード例と共に紹介します。
1. 数値の丸め処理(切り捨て・四捨五入・切り上げ)
小数点以下の数値を、指定した方法で整数に丸める処理です。
Math.floor(x): 小数点以下を「切り捨て」ます 6。Math.round(x): 小数点以下を「四捨五入」します 7。Math.ceil(x): 小数点以下を「切り上げ」ます 8。
function roundingExample() {
const value = 100.8;
const value2 = 100.2;
// 切り捨て
console.log('切り捨て (100.8): ' + Math.floor(value)); // 結果: 100
console.log('切り捨て (100.2): ' + Math.floor(value2)); // 結果: 100
// 四捨五入
console.log('四捨五入 (100.8): ' + Math.round(value)); // 結果: 101
console.log('四捨五入 (100.2): ' + Math.round(value2)); // 結果: 100
// 切り上げ
console.log('切り上げ (100.8): ' + Math.ceil(value)); // 結果: 101
console.log('切り上げ (100.2): ' + Math.ceil(value2)); // 結果: 101
}
実行結果
切り捨て (100.8): 100
切り捨て (100.2): 100
四捨五入 (100.8): 101
四捨五入 (100.2): 100
切り上げ (100.8): 101
切り上げ (100.2): 101
2. 乱数(ランダムな数値)の生成
Math.random() メソッドは、0以上1未満(0.00… から 0.99…)のランダムな小数点数の値を返します 9。
このままでは使いにくいことが多いですが、Math.floor() と組み合わせることで、特定の範囲のランダムな「整数」を作ることができます。
例えば、「0から9までのランダムな整数」を作るには以下のように書けます。
function randomIntegerExample() {
// Math.random() は 0 以上 1 未満の数値を返す
const randomValue = Math.random();
console.log('そのままの値: ' + randomValue);
// 0〜9 のランダムな整数
// 1. Math.random() * 10 -> 0.0... から 9.9... の値になる
// 2. Math.floor() で切り捨て -> 0 から 9 の整数になる
const randomInt = Math.floor(Math.random() * 10);
console.log('0〜9の整数: ' + randomInt);
// 応用: 1〜10までのランダムな整数
const randomInt_1_to_10 = Math.floor(Math.random() * 10) + 1;
console.log('1〜10の整数: ' + randomInt_1_to_10);
}
実行結果(実行するたびに結果は変わります)
そのままの値: 0.76345...
0〜9の整数: 7
1〜10の整数: 8
3. 最大値・最小値の取得
複数の数値の中から、最も大きい値(最大値)や最も小さい値(最小値)を見つけ出すのに使います 10。
Math.max(a, b, c, ...): 引数の中で最大の値を返します。Math.min(a, b, c, ...): 引数の中で最小の値を返します。
function findMinMax() {
// 複数の数値を直接引数として渡す
const maxVal = Math.max(5, 2, 10, 8);
const minVal = Math.min(5, 2, 10, 8);
console.log('最大値: ' + maxVal); // 結果: 10
console.log('最小値: ' + minVal); // 結果: 2
// 配列の中の最大値・最小値を見つける
const scores = [80, 95, 72, 100, 68];
// ... (スプレッド構文) で配列の要素を展開して渡す
const maxScore = Math.max(...scores);
const minScore = Math.min(...scores);
console.log('最高点: ' + maxScore); // 結果: 100
console.log('最低点: ' + minScore); // 結果: 68
}
実行結果
最大値: 10
最小値: 2
最高点: 100
最低点: 68
配列の最大値・最小値を調べる際の ...scores という書き方は、配列の [] を外して中身の要素だけを Math.max() に渡すための便利な記法です 11111111。
4. 定数(円周率)
Math オブジェクトは、円周率( $\pi$ )のような数学的な定数もプロパティとして持っています 12。
Math.PI: 円周率 (約 3.14159…) を返します。
function circleArea() {
const radius = 5; // 半径 5
// 円の面積 = 半径 * 半径 * 円周率
const area = radius * radius * Math.PI;
console.log('半径5の円の面積: ' + area);
// 小数点以下を四捨五入して見やすくする
console.log('半径5の円の面積 (四捨五入): ' + Math.round(area));
}
実行結果
半径5の円の面積: 78.53981633974483
半径5の円の面積 (四捨五入): 79
Dateオブジェクト:日付と時刻のスペシャリスト
Math オブジェクトと並んで非常によく使われるのが、日付と時刻を専門に扱う Date オブジェクトです。
スプレッドシートに「今日の日付を自動で入力する」、GASの実行ログに「実行時刻を記録する」など、自動化処理において日付と時刻の扱いは欠かせません。
Dateオブジェクトの生成 (インスタンス化)
Math オブジェクトと違い、Date オブジェクトは new キーワードを使ってオブジェクト(実体)を生成する必要があります。new Date() と書くことで、特定の日時情報を持ったオブジェクトが作られます。
1. 現在の日時でオブジェクトを作る
最も簡単な使い方は、引数を何も指定せずに new Date() を呼び出す方法です。これにより、実行した「今」の日時情報を持ったオブジェクトが生成されます。
function getCurrentTime() {
// 引数なしで new Date() を実行
const now = new Date();
// オブジェクトをそのまま表示
console.log(now);
}
実行結果(実行する日時によって結果は異なります)
Tue Nov 18 2025 14:15:30 GMT+0900 (JST)
GMT+0900 とは、世界標準時(GMT)から9時間進んでいることを意味し、日本の標準時(JST)を表しています。
2. 特定の日時を指定してオブジェクトを作る
任意の日時を指定してオブジェクトを作ることもできます。主な方法は2つあります。
A. 数値で指定する方法
new Date(年, 月, 日, 時, 分, 秒) のように、数値を順番に指定します。
function getSpecificDateByNumber() {
// 2026年5月1日 10時30分0秒 を指定
// 注意! 月は「0」から始まります (0=1月, 1=2月, ..., 11=12月)
// そのため、5月を指定する場合は「4」を入力します。
const d = new Date(2026, 4, 1, 10, 30, 0);
console.log(d);
}
実行結果
Fri May 01 2026 10:30:00 GMT+0900 (JST)
B. 文字列で指定する方法
new Date('YYYY-MM-DD HH:MM:SS') のように、日付と時刻を表す文字列を指定します。
function getSpecificDateByString() {
// 2026年5月1日 10時30分0秒 を指定
// 文字列の場合、月は「1」から始まる(1=1月, 5=5月)ので直感的です。
const d = new Date('2026-05-01 10:30:00');
console.log(d);
}
実行結果
Fri May 01 2026 10:30:00 GMT+0900 (JST)
数値で指定する場合は「月が0始まり」という重要なルールがありますが、文字列で指定する場合は直感的に「1月は1」として扱えるため、間違いが少なくおすすめです。
日時情報(年・月・日など)の取得
new Date() で作ったオブジェクトは、日時情報をひとまとめに持っています。そこから「年だけ」「月だけ」「曜日だけ」を取り出すための専用のメソッドが用意されています。
function getDateParts() {
const d = new Date('2026-05-01 10:30:45');
const year = d.getFullYear(); // 年 (2026)
const month = d.getMonth() + 1; // 月 (0〜11 で返るため +1 する) (4 + 1 = 5)
const day = d.getDate(); // 日 (1)
const hour = d.getHours(); // 時 (10)
const min = d.getMinutes(); // 分 (30)
const sec = d.getSeconds(); // 秒 (45)
const weekDay = d.getDay(); // 曜日 (0〜6 で返る。0=日, 1=月, ..., 6=土) (5)
console.log('年: ' + year);
console.log('月: ' + month);
console.log('日: ' + day);
console.log('時: ' + hour);
console.log('分: ' + min);
console.log('秒: ' + sec);
// 曜日を日本語に変換する
const weekDayNames = ['日曜日', '月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日'];
console.log('曜日: ' + weekDayNames[weekDay]);
}
実行結果
年: 2026
月: 5
日: 1
時: 10
分: 30
秒: 45
曜日: 金曜日
getMonth()(月)と getDay()(曜日)の2つは、数値が0から始まる点に注意が必要です。特に月は +1 しないとズレてしまうため気をつけましょう。
日時の比較と計算(タイムスタンプ)
Dateオブジェクトは、内部的に「タイムスタンプ」という一つの数値で日時を管理しています。
タイムスタンプとは、基準となる日時(1970年1月1日0時0分0秒の世界標準時)から、対象の日時までに何ミリ秒(1000分の1秒)が経過したかを示す、非常に大きな数値です。
タイムスタンプの取得
getTime() メソッドを使うと、Dateオブジェクトからこのタイムスタンプ(ミリ秒)を取得できます。
function getTimestamp() {
const d = new Date('2026-01-01 00:00:00');
// 1970/1/1 から 2026/1/1 までの経過ミリ秒
console.log(d.getTime());
}
実行結果
1767222000000
時間差の計算
タイムスタンプ(数値)に変換することで、日時の足し算や引き算が簡単に行えます。
例えば、「イベント当日まであと何日か」を計算してみましょう。
function calculateDaysRemaining() {
// 1. 今日の日付
const today = new Date();
// 2. イベントの日付
const eventDate = new Date('2026-12-25');
// 3. タイムスタンプの差(ミリ秒)を計算
const diffMs = eventDate.getTime() - today.getTime();
// 4. ミリ秒を「日数」に変換
// ミリ秒 -> 秒 (1000で割る)
// 秒 -> 分 (60で割る)
// 分 -> 時 (60で割る)
// 時 -> 日 (24で割る)
const diffDays = diffMs / (1000 * 60 * 60 * 24);
// 5. 小数点以下を切り捨てて表示
console.log('イベントまであと ' + Math.floor(diffDays) + ' 日');
}
実行結果(2025年11月18日に実行した場合)
イベントまであと 402 日
日付の大小比較
Dateオブジェクトは、タイムスタンプを基準にしているため、大小比較演算子(> や <)を使って、どちらの日付が新しいか(未来か)を直接比較することも可能です。
function compareDates() {
const dateA = new Date('2026-01-01');
const dateB = new Date('2026-01-31');
console.log(dateA < dateB); // dateA は dateB より過去(小さい)か?
}
実行結果
true
日時を指定の書式で出力する
console.log(new Date()) の実行結果 Tue Nov 18 2025 ... (JST) は、人間にとっては少し読みにくい形式です。
日報やログをスプレッドシートに書き出す際は、「2025/11/18」や「14:30」といった分かりやすい書式に変換したいはずです。
そのために、GASに標準で用意されている Utilities という別の組み込みオブジェクトを使います。
Utilities.formatDate(Dateオブジェクト, タイムゾーン, フォーマット) メソッドを使うと、Dateオブジェクトを好きな書式の文字列に変換できます。
Dateオブジェクト:new Date()で作ったオブジェクトタイムゾーン: 日本の場合は'JST'を指定しますフォーマット:yyyy(年)やMM(月)などの記号を組み合わせて書式を指定します
function formatDateTime() {
const d = new Date('2026-05-01 10:30:45');
// 例1: スラッシュ区切りの日付
// yyyy: 4桁の年 (2026)
// MM: 2桁の月 (05)
// dd: 2桁の日 (01)
const format1 = Utilities.formatDate(d, 'JST', 'yyyy/MM/dd');
console.log(format1);
// 例2: 日本語表記の日時
// H: 1桁の時 (10) ※24時間表記
// mm: 2桁の分 (30)
// ss: 2桁の秒 (45)
const format2 = Utilities.formatDate(d, 'JST', 'yyyy年MM月dd日 H時mm分ss秒');
console.log(format2);
// 例3: 現在時刻をフォーマット
const now = new Date();
const format3 = Utilities.formatDate(now, 'JST', 'yyyy-MM-dd HH:mm');
console.log('現在時刻: ' + format3);
}
実行結果
2026/05/01
2026年05月01日 10時30分45秒
現在時刻: 2025-11-18 14:20
よく使うフォーマット指定文字
| 指定文字 | 説明 | 例 |
yyyy | 西暦 (4桁) | 2026 |
MM | 月 (2桁、0埋め) | 05 |
M | 月 (1桁) | 5 |
dd | 日 (2桁、0埋め) | 01 |
d | 日 (1桁) | 1 |
HH | 時 (24時間制, 2桁) | 10 |
mm | 分 (2桁) | 30 |
ss | 秒 (2桁) | 45 |
EEE | 曜日 (省略形) | Fri |
Date オブジェクトと Utilities.formatDate を使いこなせれば、GASでの日付・時刻処理は万全です。
まとめ
お疲れ様でした。今回は、GASプログラミングを次のレベルへ引き上げるために不可欠な「クラスとオブジェクト」の概念について学びました。クラスが「設計図」であり、オブジェクトがそこから作られる「実体」であるというイメージを掴んでいただけたかと思います。この仕組みを使うことで、関連するデータと処理をひとまとめにでき、コードが格段に整理され、再利用しやすくなります。
さらに、GASに最初から用意されている強力な助っ人、「組み込みオブジェクト」についてもご紹介しました。特に「Math」オブジェクトを使えば、面倒な数値計算(四捨五入や乱数など)を一行で実行できます。また、「Date」オブジェクトと「Utilities.formatDate」を組み合わせることで、スプレッドシートへの日付の自動入力や、実行ログの記録といった実用的な処理が驚くほど簡単になります。
今回学んだ内容は、GASでより高度な自動化を実現するための基盤となります。ぜひ、これらの知識を活用して、ご自身のスプレッドシートやドキュメント操作に応用してみてください。














