テーブル操作(DuckDB_03)

この連載では、DuckDBについて学んでいきます。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は実際にDuckDBを起動して、データベースファイルの作成、テーブルの作成、CSVファイルの読み込みまで試してみました。

今回は、テーブル操作です。作成したテーブルを操作します。

テーブル情報の取得

前回作成したデータベースファイル「my_database.duckdb」を使用してテーブル操作をしてみようと思います。ファイルの内容を確認してみましょう。 「SHOW TABLES;」と入力すると、テーブルの一覧が表示されます。

my_database D SHOW TABLES;
┌──────────┐
│   name   │
│ varchar  │
├──────────┤
│ my_table │
│ users    │
└──────────┘

テーブルの構造を確認するには「DESCRIBE テーブル名」と入力します。

my_database D DESCRIBE my_table;
┌──────────────┐
│   my_table   │
│              │
│ 名前 varchar │
│ 性別 varchar │
│ 部署 varchar │
│ 収入 bigint  │
└──────────────┘
my_database D DESCRIBE users;
┌──────────────┐
│    users     │
│              │
│ id   integer │
│ 名前 varchar │
│ 日付 date    │
└──────────────┘

my_tableには3件のデータがあります。usersにはデータがありません。

my_database D SELECT * FROM my_table;
┌─────────┬─────────┬─────────┬────────┐
│  名前   │  性別   │  部署   │  収入  │
│ varchar │ varchar │ varchar │ int64  │
├─────────┼─────────┼─────────┼────────┤
│ 田中    │ 男      │ 営業    │ 300000 │
│ 鈴木    │ 男      │ 開発    │ 400000 │
│ 佐藤    │ 女      │ 営業    │ 350000 │
└─────────┴─────────┴─────────┴────────┘

テーブルの複写

テーブルを複写する例をご紹介します。

my_database D CREATE TABLE new_table AS SELECT * FROM my_table;
my_database D SHOW TABLES;
┌───────────┐
│   name    │
│  varchar  │
├───────────┤
│ my_table  │
│ new_table │
│ users     │
└───────────┘
my_database D SELECT * FROM new_table;
┌─────────┬─────────┬─────────┬────────┐
│  名前   │  性別   │  部署   │  収入  │
│ varchar │ varchar │ varchar │ int64  │
├─────────┼─────────┼─────────┼────────┤
│ 田中    │ 男      │ 営業    │ 300000 │
│ 鈴木    │ 男      │ 開発    │ 400000 │
│ 佐藤    │ 女      │ 営業    │ 350000 │
└─────────┴─────────┴─────────┴────────┘

コピーする範囲を絞るには、取得するデータを絞ります。以下は、テーブルの構造(定義)だけをコピーする例です。

CREATE TABLE new_table AS SELECT * FROM my_table LIMIT 0;

レコードの追加・削除

レコードの追加には、INSERT文を使用します。以下はレコード追加の例です。

my_database D INSERT INTO new_table (名前, 性別, 部署, 収入)
              VALUES ('伊藤', '女', '製造', 380000);

レコードの削除には、DELETE文を使用します。以下はレコード削除の例です。レコードの指定はWHERE句を使用します。

my_database D DELETE FROM new_table WHERE 性別 = '男';

WHERE句を指定しないと、テーブル内のすべてのレコードが削除されます。

列の追加・削除

列の追加・削除はALTER TABLE文を使います。追加にはADD COLUMN句を使います。

my_database D ALTER TABLE new_table ADD COLUMN 役職 INTEGER;

列は一番右に追加されます。削除にはDROP COLUMN句を使います。

my_database D ALTER TABLE new_table DROP COLUMN 部署;

テーブルの削除

ここまでの処理を実行すると、new_tableの内容は以下のようになります。

my_database D SELECT * FROM new_table;
┌─────────┬─────────┬────────┬───────┐
│  名前   │  性別   │  収入  │ 役職  │
│ varchar │ varchar │ int64  │ int32 │
├─────────┼─────────┼────────┼───────┤
│ 佐藤    │ 女      │ 350000 │  NULL │
│ 伊藤    │ 女      │ 380000 │  NULL │
└─────────┴─────────┴────────┴───────┘

テーブルの削除はDROP TABLE文を使います。

my_database D DROP TABLE new_table;
my_database D SHOW TABLES;
┌──────────┐
│   name   │
│ varchar  │
├──────────┤
│ my_table │
│ users    │
└──────────┘

テーブルが削除されました。

次回は表示モード

いかがでしょうか。今後DuckDBの挙動を確認していく中で、テーブル操作の基本を確認しました。結論から言うと、テーブル操作は他のデータベースシステムと同様のSQLで操作できます。次回は表示モードです。DuckDBの表示モードについて見ていきます。お楽しみに!!

DuckDB学習記事のまとめですはこちらから

使ってみる(DuckDB_02)

この連載では、DuckDBについて学んでいきます。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回はDuckDBの概要について触れました。DuckDBとは、SQLite3と同様にローカル環境で使用できるデータベースシステムです。

今回は、DuckDBを実際に起動して、使ってみようと思います。

データベースファイルを作る

DuckDBのデータベースファイルには、決められた拡張子はありません。しかしながら、他のファイルと区別がつかないと不便なので、「.duckdb」としようと思います。データベースファイルを作るには以下のように記述します。

duckdb ファイル名

実際の使用例を見てみましょう。

PS > duckdb my_database.duckdb
DuckDB v1.5.5 (Variegata)
Enter ".help" for usage hints.
my_database D 

このように表示され、データベースに接続されます。指定したファイルが存在しない場合は、新しいデータベースファイルが作成されます。プロンプトの先頭には、接続しているデータベース名が表示されています。

テーブルを作成する

データベースファイルにテーブルを作成してみましょう。他のデータベースシステム同様、SQLのCREATE TABLE文を使ってテーブルを作成できます。

my_database D CREATE TABLE users (id INT, 名前 VARCHAR, 日付 DATE);
my_database D SELECT * FROM users;
┌───────┬─────────┬──────┐
│  id   │  名前   │ 日付 │
│ int32 │ varchar │ date │
└───────┴─────────┴──────┘
          0 rows 

作成したテーブルの内容は、SQLのSELECT文を使用して確認できます。空のテーブルが作成されました。

CSVファイルを読み込む

CSVファイルを読み込み、その内容からテーブルを作成することもできます。今回は、以下のCSVファイル「Member.csv」を読み込んでみましょう。

名前,性別,部署,収入
田中,男,営業,300000
鈴木,男,開発,400000
佐藤,女,営業,350000
my_database D CREATE TABLE my_table AS SELECT * FROM read_csv_auto('Member.csv');
my_database D SELECT * FROM my_table;
┌─────────┬─────────┬─────────┬────────┐
│  名前   │  性別   │  部署   │  収入  │
│ varchar │ varchar │ varchar │ int64  │
├─────────┼─────────┼─────────┼────────┤
│ 田中    │ 男      │ 営業    │ 300000 │
│ 鈴木    │ 男      │ 開発    │ 400000 │
│ 佐藤    │ 女      │ 営業    │ 350000 │
└─────────┴─────────┴─────────┴────────┘

各列のデータ型は自動的に判定できています。

データ型

DuckDBで使用されるデータ型のうち、よく使うデータ型をいくつかご紹介します。

分類 データ型 説明 具体例
整数 integer, bigint 整数(実行結果では int32, int64と表示される) 1, 42, -100
浮動小数点 float, double 小数点を含む数値 3.14, -0.005
固定小数点 decimal(p, s) 固定精度で扱う誤差のない高精度な数値(通貨や売上など) 10500.50
文字列 varchar, text 可変長のテキストデータ(どちらも同じ扱い) 'Taro', 'こんにちは'
真偽値 boolean 真(正しい)または 偽(間違い) true, false
バイナリ blob バイナリデータ(画像やファイルなど) \x00\x01\x02
日付 date 日付のみ '2026-09-04'
時刻 time 時刻のみ '08:58:00'
日時 timestamp 日付と時刻(タイムゾーンなし) '2026-09-04 08:58:00'
日時(TZ付き) timestamptz タイムゾーン付きの日付と時刻 '2026-09-04 08:58:00+09'
時間隔 interval 時間の長さや間隔 3 days, 1 month
リスト list (または 型[]) 同じ型の要素を順序づけて格納 [1, 2, 3]
構造体 struct 固定のキーと値のペア(値の型が違ってもOK) {'name': 'Taro', 'age': 30}
マップ map キーと値を組み合わせた辞書型のデータ map(['a', 'b'], [1, 2])
識別子 uuid 一意のID(識別子) '123e4567-e89b-12d3-a456-426614174000'
JSON json JSON形式のデータ '{"key": "value"}'

見慣れない型もありますが、おいおい見ていきたいと思います。

次回はテーブル操作

いかがでしょうか。DuckDBの基本的な使い方が、少し見えてきたのではないでしょうか。次回はテーブル操作です。お楽しみに!!

hirocom777.hatenadiary.org

DuckDB学習記事のまとめですはこちらから

DuckDBとは(DuckDB_01)

皆さんこんにちは。HiroCom777です。僕は過去にSQLite3について学びながらブログを書いていました。

hirocom777.hatenadiary.org

SQLite3は手軽に使えるデータベースシステムです。ブログを通してデータベースについて多くの学びを得ました。

ところで、最近気になるデータベースシステムを見かけました。「DuckDB」と称するものです。「分析版SQLite3」とのサブタイトルが付いていたりします。SQLite3とは何が違うのでしょうか。

DuckDBとは

DuckDBとは、SQLite3同様のローカル環境で使用できるデータベースシステムです。SQLite3とは何が違うのでしょうか。DuckDBの特徴は以下の通りです。

  • 列指向
    多くのデータベースシステムは行単位で処理を行いますが、DuckDBは列単位の処理が中心です。そのため、大量データの集計や統計・分析処理に最適化されています。半面、高頻度のトランザクション処理(複数のデータ操作をひとまとめの単位で行う処理)は苦手です。

  • 組み込み型データベース
    アプリケーションに組み込んで利用でき、データベースサーバーを別途起動する必要がありません。

  • 豊富なデータ形式に対応
    CSV、JSON、Parquetなど、多くのデータ形式に対応しています。データをDuckDB用に変換することなく、直接読み込んでクエリを実行できます。

オフラインで使用可能なデータベースシステムにはSQLite3やMicrosoftのAccessなどがあります。これらは行指向のデータベースで、データの登録・更新・検索などを手軽に行える一方、大量のデータを対象とした集計や分析処理に特化したデータベースではありません。

一方、データ分析を得意とするBigQueryなどのクラウド型データウェアハウスは、サーバーを自分で管理する必要がない反面、基本的にはクラウド上で利用します。

つまり、DuckDBはオフラインで動作するデータ分析向けのデータベースシステムに位置付けられます。DuckDBは列指向を採用しており、とくに大量のデータを対象とした集計や統計・分析処理を効率的に実行できるよう設計されています。

インストール

それでは早速使ってみましょう。以下のサイトでダウンロードできます。

duckdb.org

私の環境はWindows11です。「duckdb_cli-windows-amd64.zip」をダウンロードして解凍すると「duckdb.exe」が現れるので、任意のフォルダーに配置しましょう。フォルダーのパスを設定すれば使用可能です。アンインストールする際には、このファイルとフォルダーを削除してパス設定も削除してください。

PowerShellなどで以下のように入力して起動してみましょう。

PS > duckdb
DuckDB v1.5.5 (Variegata)
Enter ".help" for usage hints.
memory D

DuckDBのCLI(Command Line Interface)が起動しました。この時点では、バージョンは1.5.5が表示されています。 「D」はDuckDBのプロンプトを表す記号です。この表示の後にコマンドを入力して操作します。その前の「memory」はDuckDBがインメモリデータベースで起動していることを示します。

使用方法のヒントを表示するには「.help」と入力します。

memory D .help
.bail on|off                             Stop after hitting an error.  Default OFF
.binary on|off                           Turn binary output on or off.  Default OFF
                                  ・
                                  ・
                                  ・

出力が長くなるので冒頭部分のみ表示します。「.」で始まるコマンドの一覧が表示されました。これらは「ドットコマンド」と呼ばれるものでDuckDB CLIで使用できる特別なコマンドです。.helpもドットコマンドです。

表示の最終行には以下のように表示されます。

Run .help --all for extended information
Run .help shortcuts for keyboard shortcuts

「.help --all」と入力すると、詳しい情報が表示されます。「.help shortcuts」と入力すると、CLIのショートカット一覧が表示されます。

CLIを終了するにはドットコマンド「.exit」か「.quit」を入力します。「Ctrl + D」でも可能です。

次回から使ってみる

いかがでしょうか。今回はDuckDBの概要とCLIの基本操作を確認しました。次回からは実際にデータベースシステムとして使ってみたいと思います。お楽しみに!!

hirocom777.hatenadiary.org

DuckDB学習記事のまとめですはこちらから

結合_2(PowerShell_52)

この連載では、PowerShellについて学んでいます。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、結合について学びました。拡張モジュールJoinModuleを使用すると、JOINに相当するコマンドレット「Join-Object」を使用できるようになります。

今回も結合です。引き続きJoinModuleを深掘りしていこうと思います。

ラッパーコマンド

前回ご紹介したJoin-Objectの基本的な記述方法は以下の通りです。

Join-Object -LeftObject オブジェクト_1 -RightObject オブジェクト_2
    -On 結合に使うプロパティ -JoinType 結合方式

JoinModuleをインストールすると、このほかに比較的簡単に記述できるラッパーコマンドが使えるようになります。これらはJoin-Objectを結合方式ごとに使いやすくしたものです。

コマンド JoinType エイリアス 結合方法
InnerJoin Inner InnerJoin-Object,Join 内部結合
LeftJoin Left LeftJoin-Object 左外部結合
RightJoin Right RightJoin-Object 右外部結合
FullJoin Full FullJoin-Object 完全外部結合
CrossJoin Cross CrossJoin-Object 交差結合
OuterJoin Outer OuterJoin-Object 対称差結合

以下のように記述します。

ラッパーコマンド -LeftObject オブジェクト_1 -RightObject オブジェクト_2
    -On 結合に使うプロパティ

コマンド冒頭に結合方式が記述されているので、動作がわかりやすくなります。

その他のパラメーター

前回触れていなかったJoin-Objectのパラメーターをご紹介します。ここでは、\$Left → 左側の現在のオブジェクト、\$Right → 右側の現在のオブジェクトとします。

  • -Property
    結合結果として出力するプロパティを指定します。以下のように記述します。
  -Property @(プロパティ_1,プロパティ_2,プロパティ_3・・・)

また、式を使って出力項目を作ることもできます。以下のように記述します。

  -Property @{
    プロパティ_1 = {$Left.プロパティ}
    プロパティ_2 = {$Right.プロパティ}
  }
  • -Where
    さらに複雑な条件で結合したい場合に使用します。以下のように記述します。
  -Where {
      条件式
  }

条件式が成立した行のみ対象になります。-Whereを使用すると、キーの一致だけでは表現できない条件を指定して、結合するオブジェクトの組み合わせを決めることができます。

その他のラッパーコマンド

その他のラッパーコマンドについても説明します。

Update-Object

共通するキーを使用して、左側オブジェクトを更新したオブジェクトを返します。更新内容は右側オブジェクトで指定します。左側オブジェクト自体は更新されません。使用例を見てみましょう。

$employees = @(
    [PSCustomObject]@{ ID = 1; 名前 = '田中'; 部署 = '営業'; 給与 = 300000 }
    [PSCustomObject]@{ ID = 2; 名前 = '佐藤'; 部署 = '総務'; 給与 = 320000 }
    [PSCustomObject]@{ ID = 3; 名前 = '鈴木'; 部署 = '開発'; 給与 = 350000 }
)

$updates = @(
    [PSCustomObject]@{ ID = 1; 給与 = 310000 }
)

$employees | Update-Object $updates -On ID

結果は以下のようになりました。ID = 1 の給与が変更になっています。

ID 名前 部署   給与
-- ---- ----   ----
 1 田中 営業 310000
 2 佐藤 総務 320000
 3 鈴木 開発 350000

Merge-Object

共通するキーを使用して、左側オブジェクトを更新するとともに、データを追加します。更新、追加内容は右側オブジェクトで指定します。左側オブジェクト自体は更新されません。使用例を見てみましょう。

$employees = @(
    [PSCustomObject]@{ ID = 1; 名前 = '田中'; 部署 = '営業'; 給与 = 300000 }
    [PSCustomObject]@{ ID = 2; 名前 = '佐藤'; 部署 = '総務'; 給与 = 320000 }
    [PSCustomObject]@{ ID = 3; 名前 = '鈴木'; 部署 = '開発'; 給与 = 350000 }
)

$merges = @(
    [PSCustomObject]@{ ID = 1; 名前 = '田中'; 部署 = '営業'; 給与 = 310000 }
    [PSCustomObject]@{ ID = 4; 名前 = '山田'; 部署 = '営業'; 給与 = 400000 }
)

$employees | Merge-Object $merges -On ID

結果は以下のようになりました。ID = 1 の給与が変更になっています。また、ID = 4 の行が増えています。

ID 名前 部署   給与
-- ---- ----   ----
 1 田中 営業 310000
 2 佐藤 総務 320000
 3 鈴木 開発 350000
 4 山田 営業 400000

Update-ObjectとMerge-Objectの大きな違いは、右側にしか存在しないデータを追加するかどうかです。

ラッパーコマンドを使用すると、シンプルに結合処理を記述できます。

いったん終了します

いかがでしょうか。JoinModuleはラッパーコマンドを使ってシンプルに記述できるところがいいですね。PowerShellのブログ連載はいったん終了したいと思います。また、何かネタが見つかったら書いてみようと思います。ここまでありがとうございました。

PowerShell基礎の連載はコチラから

結合_1(PowerShell_51)

この連載では、PowerShellについて学んでいます。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、集計について学びました。Measure-Objectを使うと、数値データの合計や平均、最大値、最小値などを求めることができます。

今回は結合です。PowerShellには標準で結合を行うコマンドレットがありません。では、どのようにすればいいのでしょうか。

これまでのデータ処理

PowerShellでは、CSVなどのデータをオブジェクトとして扱い、PSCustomObjectなどのオブジェクトに対してさまざまな操作を行えます。以下はSQLとPowerShellの機能を厳密に対応させたものではなく、処理内容を理解しやすくするための概念的な対応です。

コマンドレット 機能 対応SQL
Select-Object 列の選択 SELECT句
Where-Object 行の選択 WHERE句
Sort-Object 行の並べ替え ORDER BY
Measure-Object 集計 集計関数
Group-Object グループ化 GROUP BY

こうしてみると、JOIN句(テーブルの結合)に相当するコマンドレットがないことに気づきます。

JoinModule

拡張モジュールJoinModuleを使用すると、JOINに相当するコマンドレット「Join-Object」を使用できるようになります。SQLのJOIN句のように、共通のキーを使って2つのオブジェクトの集合を結合するためのモジュールです。詳細は以下を参照してください。

https://www.powershellgallery.com/packages/JoinModule/3.8.5

以下でインストールできます。

PS > Install-Module -Name JoinModule 

インストール結果は以下で確認できます。

PS > Get-InstalledModule

Version              Name
-------              ----          ・・・・
3.8.5                JoinModule

Join-Object

JoinModuleをインストールすると、コマンドレット「Join-Object」を使用できます。基本的な記述方法は以下の通りです。

Join-Object -LeftObject オブジェクト_1 -RightObject オブジェクト_2
    -On 結合に使うプロパティ -JoinType 結合方式

それではJoin-Objectの使用例を見てみましょう。以下の2つのCSVファイルを結合してみましょう。

employees.csv(社員マスター)

社員ID,氏名,部署ID
E001,田中太郎,D001
E002,佐藤花子,D002
E003,鈴木一郎,D001
E004,高橋美咲,D003
E005,伊藤健太,D002
E006,山田直子,D004
E007,小林翔太,D005

departments.csv(部署マスター)

部署ID,部署名
D001,営業部
D002,総務部
D003,経理部
D004,開発部
D005,人事部
D006,広報部

ここで、以下のスクリプトを実行してみます。

# 1. 2つのCSVファイルを読み込む
$Users = Import-Csv employees.csv
$Depts = Import-Csv departments.csv

# 2. 部署IDをキーにして、左側のデータをベースに結合させる
$Result = Join-Object -LeftObject $Users -RightObject $Depts -On 部署ID -JoinType Left

# 3. 結合した結果を表示
$Result

結果は以下のようになりました。

社員ID 氏名     部署ID 部署名
------ ----     ------ ------
E001   田中太郎 D001   営業部
E002   佐藤花子 D002   総務部
E003   鈴木一郎 D001   営業部
E004   高橋美咲 D003   経理部
E005   伊藤健太 D002   総務部
E006   山田直子 D004   開発部
E007   小林翔太 D005   人事部

2つのCSVファイルが結合された結果が得られました。今回は-JoinType Leftを指定しているため、左側の$Usersに存在する社員を基準に結合します。そのため、部署マスターに存在するD006(広報部)は結果には含まれません。

この結果をパイプライン経由で送ればデータ構成の変更、ファイル出力などの処理ができます。

Join-Objectのパラメーター

Join-Objectのパラメーターのうち、上の例で使用したものをご紹介します。

  • -LeftObject
    結合対象のオブジェクト(左側)を指定します。このオブジェクトは、パイプラインから受け取ることもできます。

  • -RightObject
    結合対象のオブジェクト(右側)を指定します。

  • -On
    結合のキーとなるプロパティを指定します。また、パラメーター「-Equals」と併用すると左右で異なる名前のプロパティを対応できます。以下のように記述します。

  -On 左のプロパティ -Equals 右のプロパティ
  • -JoinType
    結合タイプを指定します。

    JoinType 結合方法 内容 SQLとの対応
    Inner 内部結合 両方に存在するキーだけ INNER JOIN
    Left 左外部結合 左側を基準に結合 LEFT JOIN
    Right 右外部結合 右側を基準に結合 RIGHT JOIN
    Full 完全外部結合 両方のデータを残す FULL OUTER JOIN
    Cross 交差結合 すべての組み合わせ CROSS JOIN
    Outer※ 対称差結合 片側にしか存在しないデータ SQLの一般的なOUTER JOINとは異なる

    ※Outerは、左右のデータのうち、結合キーが一致しないデータだけを残す結合です。排他的論理和に相当し、一般的なSQLのOUTER JOINとは異なります

次回も結合

いかがでしょうか。JoinModuleを使えば、PowerShellでもSQLのJOINに相当する結合処理を行えるようになります。次回も結合です。引き続きJoinModuleを深掘りしていこうと思います。 お楽しみに!!

hirocom777.hatenadiary.org

PowerShell基礎の連載はコチラから

組み込みオブジェクト_3(GASの学習_13)

この連載では僕が所属しているノンプロ研で受講している、GAS中級講座での気づきをまとめています。前回の記事はこちらです。

hirocom777.hatenadiary.org

前回はArrayオブジェクトの続きと、Stringオブジェクトについて見ていきました。

今回も第4回「組み込みオブジェクト」です。Dateオブジェクト、Mathオブジェクトについて見ていきましょう。

Dateオブジェクト

Dateオブジェクトは、日付・時刻を取り扱う組み込みオブジェクトです。生成するには以下の方法があります。

new Date() //現在の日時

new Date(年, 月, 日, 時, 分, 秒, ミリ秒)
//月は0~11の整数、時以降は省略可

new Date(日付を表す文字列)

new Date(Unixエポック + 経過ミリ秒数)

ここで注意しなければならないのは、年月日を指定して生成する場合です。月を指定する数値は、実際の月より1小さい値になります。1月は0、12月は11で表されます。

UNIXエポックとは、コンピュータシステムで日時を扱う際の基準となる起点時刻で、1970年1月1日午前0時0分0秒(協定世界時: UTC)のことです。ここを起点にして、経過したミリ秒で日時を表します。

function myFunction() {

  const start = new Date('2026/06/24 19:30:15');
  const end = start;

  end.setMinutes(start.getMinutes() + 120);
  console.log(start);
  console.log(end);

}

このスクリプトを実行すると、以下のように返ってきます。

Wed Jun 24 2026 21:30:15 GMT+0900 (Japan Standard Time)
Wed Jun 24 2026 21:30:15 GMT+0900 (Japan Standard Time)

変数startと変数endは同じ値になってしまいました。変数へのオブジェクトの代入は値ではなく「参照」なので、別の変数が同じオブジェクトを指すことがあるのです。Dateオブジェクトをコピーするには、以下のように記述します。

new Date(Dateオブジェクト) 

以下のスクリプトでは、変数startと変数endが異なる値になります。

function myFunction() {

  const start = new Date('2026/06/24 19:30:15');
  const end = new Date(start);

  end.setMinutes(start.getMinutes() + 120);
  console.log(start);
  console.log(end);

}

結果は以下の通りです。

Wed Jun 24 2026 19:30:15 GMT+0900 (Japan Standard Time)
Wed Jun 24 2026 21:30:15 GMT+0900 (Japan Standard Time)

変数startと変数endが異なる値になりました。

Mathオブジェクト

Mathオブジェクトは数学関連を取り扱う組み込みオブジェクトです。Mathオブジェクトのメソッドは、Mathオブジェクトからインスタンスを生成して使うのではなく、Math.メソッド()のように直接呼び出して使用します。これを静的メソッドと言います。

Mathオブジェクトの主なメンバーは、以下になります。

メンバー 説明
PI 円周率
abs(x) xの絶対値を返す
ceil(x) x以上の最小の整数値を返す
floor(x) x以下の最大の整数値を返す
round(x) xをもっとも近い整数に丸めた値を返す
min(x, y,...) x,y,...の値の中で最小の値を返す
max(x, y,...) x,y,...の中で最大の値を返す
random() 0以上1未満の乱数を返す
sqrt(x) xの平方根を返す
trunc(x) xの整数部のみを取り出して返す

以下は使用例です。

function myFunction() {
  
  // 5 ~ 10の範囲の整数の乱数を求める
  const min = 5;
  const max = 10;
  console.log(Math.floor(Math.random() * (max - min + 1) + min));
  
  // 配列要素の最大値、最小値を求める
  const numbers = [10, 30, 20, 40];
  console.log(Math.min(...numbers));
  console.log(Math.max(...numbers));
  
}

次回はUtility Services

いかがでしょうか。Dateオブジェクト、Mathオブジェクトをうまく使うとスクリプトの幅が広がります。次回はUtility Servicesについて見ていきます。Utility Servicesには、スクリプト作成に役立つさまざまな便利な機能が用意されています。お楽しみに!!

GAS関連記事まとめ - HiroCom777の学習記録

集計(PowerShell_50)

この連載では、PowerShellについて学んでいます。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、グループ化について学びました。Group-Objectを使うと、データを条件ごとにグループ化して、グループごとの件数を求めることができます。

今回は集計です。コマンドレット「Measure-Object」を使用すると、数値データの合計や平均、最大値、最小値などを求めることができます。

集計

それでは実行例を見てみましょう。今回も前回と同様に、次のCSVファイル「employees.csv」があるとします。

名前,性別,部署,収入
田中,男,営業,300000
鈴木,男,開発,400000
佐藤,女,営業,350000
高橋,男,開発,450000
伊藤,女,総務,320000

以下を実行してみます。この例ではパラメーター「-Sum」を指定して、収入の合計を求めています。

PS > $a = Import-Csv employees.csv |
>>     Measure-Object 収入 -Sum

結果は以下のようになりました。

PS > $a.GetType()           

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    GenericMeasureInfo                       Microsoft.PowerShell.Commands.MeasureInfo

PS > $a

Count             : 5
Average           : 
Sum               : 1820000
Maximum           : 
Minimum           : 
StandardDeviation : 
Property          : 収入

収入の合計値が求められました。Countには、集計対象となったオブジェクトの数が入ります。今回のCSVには5人分のデータがあるため、Countは5になります。

その他、以下の値を求めることができます。

パラメーター 機能
-Average 平均
-Sum 合計
-Maximum 最大
-Minimum 最小
-StandardDeviation 標準偏差

これらのパラメーターは、複数指定可能です。

PS > $a = Import-Csv employees.csv |         
>>     Measure-Object 収入 -Average -Maximum -Minimum

Count             : 5
Average           : 364000
Sum               : 
Maximum           : 450000
Minimum           : 300000
StandardDeviation : 
Property          : 収入

また、パラメーター「-AllStats」を指定すると、すべての統計値を取得できます。

PS > Import-Csv employees.csv |         
>>     Measure-Object 収入 -AllStats

Count             : 5
Average           : 364000
Sum               : 1820000
Maximum           : 450000
Minimum           : 300000
StandardDeviation : 61073.7259384099
Property          : 収入

グループ化との併用

前回ご紹介したGroup-Objectと組み合わせることで、分類ごとの集計が可能です。

PS > Import-Csv employees.csv |
>>     Group-Object 部署 |      
>>     ForEach-Object {
>> 
>>         [PSCustomObject]@{
>>             Department  = $_.Name
>>             Count       = $_.Count
>>             TotalSalary = (
>>                 $_.Group |
>>                 Measure-Object 収入 -Sum  
>>             ).Sum
>>         }
>> 
>>     }

Groupプロパティには、そのグループに属するオブジェクトが格納されています。そのため、さらにMeasure-Objectを実行することで、部署単位の集計ができます。

PS > $a.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    PSCustomObject                           System.Object

PS > $a

Department Count TotalSalary
---------- ----- -----------
営業           2   650000.00
開発           2   850000.00
総務           1   320000.00

集計結果をPSCustomObjectにまとめておくと、その後の加工やCSV・JSON形式での出力が容易になります。

次回はWebサービス

いかがでしょうか。前回のグループ化と併せて集計を使うと強力なデータ処理ができます。次回はWebサービスです。HTTP/HTTPS要求を送信したり、データを取得したりします。お楽しみに!!

hirocom777.hatenadiary.org

PowerShell基礎の連載はコチラから