メインコンテンツまでスキップ

findMany()

特定の条件に合致したすべての行を取り出したい場合に利用します。

使用できるキー

キー名内容省略備考
where取得条件の指定書かない場合は全ての行を取得します
select取得列の表示設定omit / include と同時に使用できません。リレーションフィールドにオプション指定可
omit取得列の除外設定select と同時に使用できません
includeリレーション先の取得詳細はこちら
orderByソート設定指定する列が 1 つの場合、配列の省略が可能です
take取得数の設定負数で末尾から取得
skipスキップ数の設定負数はエラー
distinct重複削除の設定指定する列が 1 つの場合、配列の省略が可能です
cursorカーソル位置カーソルベースページネーション

説明例用のシート

説明用シート

説明

上記例から以下の条件の行を取り出したいとします。

  • pref => Tokyo

この場合以下のコードとなります。

const gassma = new Gassma.GassmaClient();

// gassma.{{TARGET_SHEET_NAME}}.findMany
const result = gassma.sheet1.findMany({
where: {
pref: "Tokyo",
},
});

戻り値は以下の形式です。

[
{ name: "sato", age: 31, pref: "Tokyo", postNumber: "160-0023" },
{ name: "endo", age: 55, pref: "Tokyo", postNumber: "160-0023" },
];

複数の条件を指定したい場合は以下のコードとなります。

const gassma = new Gassma.GassmaClient();

// gassma.{{TARGET_SHEET_NAME}}.findMany
const result = gassma.sheet1.findMany({
where: {
pref: "Tokyo",
年齢: 31,
},
});

演算子・部分一致

以上・以下や部分一致等の条件付き検索も可能です。例えば以下の条件で行を取り出したいとします。

  • age => 20 以上
  • age => 30 以下

この場合以下のコードとなります。

const gassma = new Gassma.GassmaClient();

// gassma.{{TARGET_SHEET_NAME}}.findMany
const result = gassma.sheet1.findMany({
where: {
age: {
gte: 20,
lte: 30,
},
},
});

条件付き検索に関連するキーは以下の通りです。

キー名役割
equals同値かeauals: 20
not同値ではないかnot: 20
in指定したリストの中にあるかin: [20, 21, 22]
notIn指定したリストの中にないかnotIn: [23, 24. 25]
lt未満lt: 30
lte以下lte: 30
gt超過gt: 20
gte以上gte: 20
contains対象データの中に指定した文字列が含まれているかcontains: "AB"
startsWith対象データが指定した文字列から始まっているかstartsWith: "AB"
endsWith対象データが指定した文字列で終わっているかendsWith: "YZ"
mode大文字小文字の区別設定mode: "insensitive"

各演算子の値には固定値のほか、fields プロパティを使って同じ行の別の列の値を指定できます。詳しくは fields のリファレンスを参照してください。

mode: "insensitive"

equalsnotcontainsstartsWithendsWithmode: "insensitive" を指定すると、大文字小文字を区別せずに比較できます。

const gassma = new Gassma.GassmaClient();

// "alice"、"Alice"、"ALICE" すべてにマッチ
const result = gassma.sheet1.findMany({
where: {
name: {
equals: "alice",
mode: "insensitive",
},
},
});

containsstartsWithendsWith でも同様に使用できます。

// "Hello World"、"HELLO WORLD" などにマッチ
const result = gassma.sheet1.findMany({
where: {
title: {
contains: "hello",
mode: "insensitive",
},
},
});

mode を指定しない場合、またはデフォルトの mode: "default" の場合は大文字小文字が区別されます。

AND, OR, NOT

複数条件での検索も可能です。

AND

例えば以下の条件で行を取り出したいとします。

  • age => 22
  • pref => Ibaraki

AND を利用して検索する場合以下のようになります。

const gassma = new Gassma.GassmaClient();

// gassma.{{TARGET_SHEET_NAME}}.findMany
const result = gassma.sheet1.findMany({
where: {
AND: [
{
age: 22,
},
{
pref: "Ibaraki",
},
],
},
});

OR

例えば以下の条件で行を取り出したいとします。

  • age => 22 または 40

OR を利用して検索する場合以下のようになります。

const gassma = new Gassma.GassmaClient();

// gassma.{{TARGET_SHEET_NAME}}.findMany
const result = gassma.sheet1.findMany({
where: {
OR: [
{
age: 22,
},
{
age: 40,
},
],
},
});

NOT

例えば以下の条件で行を取り出したいとします。

  • age => 22 ではない
  • age => 40 ではない

NOT を利用して検索する場合以下のようになります。

const gassma = new Gassma.GassmaClient();

// gassma.{{TARGET_SHEET_NAME}}.findMany
const result = gassma.sheet1.findMany({
where: {
NOT: [
{
age: 22,
},
{
age: 40,
},
],
},
});

AND, OR, NOT の重ねがけ

例えば AND の下に OR や NOT を入れることができます。この入れ子構造は GAS のコールスタックが許す限り無限に可能です。

const gassma = new Gassma.GassmaClient();

// gassma.{{TARGET_SHEET_NAME}}.findMany
const result = gassma.sheet1.findMany({
where: {
NOT: {
AND: [
{
name: "akahoshi",
},
{
age: 22,
},
],
},
},
});

where でのリレーションフィルタ

リレーション定義がある場合、where 内でリレーション先の条件を使ってフィルタリングできます(someeverynoneisisNot)。

詳しくは where リレーションフィルタのリファレンスを参照してください。

select

戻り値に返るデータを制限することができます。

例えばageprefのみ取得したい場合は以下のようになります。

const gassma = new Gassma.GassmaClient();

// gassma.{{TARGET_SHEET_NAME}}.findMany
const result = gassma.sheet1.findMany({
where: {
age: {
gte: 20,
},
},
select: {
name: true,
pref: true,
},
});

戻り値は以下のようになります。

[
{ name: "akahoshi", pref: "Ibaraki" },
{ name: "sato", pref: "Tokyo" },
{ name: "suzuki", pref: "Osaka" },
{ name: "yamamoto", pref: "Aichi" },
{ name: "ono", pref: "Shiga" },
{ name: "kudo", pref: "Kyoto" },
{ name: "kondo", pref: "Tottori" },
{ name: "endo", pref: "Tokyo" },
{ name: "murakami", pref: "Fukuoka" },
];

select 内でのリレーションオプション指定

リレーション定義がある場合、select 内のリレーションフィールドに include と同様のオプションを指定できます。include を別途指定する代わりに、select 内でリレーション先のデータ取得を制御できます。

const gassma = new Gassma.GassmaClient({
relations: {
Users: {
posts: { type: "oneToMany", to: "Posts", field: "id", reference: "authorId" },
},
},
});

const result = gassma.Users.findMany({
select: {
id: true,
name: true,
posts: {
select: { id: true, title: true },
where: { published: true },
orderBy: { id: "desc" },
},
_count: true,
},
});

リレーションフィールドに指定できるオプションは include のオプションと同じです(selectwhereorderByincludeomittakeskip)。

深いネストも対応しています。

const result = gassma.Users.findMany({
select: {
id: true,
posts: {
select: {
id: true,
comments: {
select: { id: true, text: true },
},
},
},
},
});
注意

トップレベルの selectinclude は同時に使用できません。リレーション先のデータが必要な場合は select 内でリレーションオプションを指定するか、include を単独で使用してください。

orderBy

取得した行をソートすることができます。

例えばageで昇順でソートする場合は以下のようになります。

const gassma = new Gassma.GassmaClient();

// gassma.{{TARGET_SHEET_NAME}}.findMany
const result = gassma.sheet1.findMany({
where: {
age: {
gte: 20,
},
},
orderBy: {
age: "asc",
},
});

指定できるデータは以下の通りです。

キー名意味
asc昇順
desc降順

null 値の並び順制御

オブジェクト形式で nulls オプションを指定すると、null 値の並び位置を制御できます。

const gassma = new Gassma.GassmaClient();

// null 値を最後に配置
const result = gassma.sheet1.findMany({
orderBy: {
age: { sort: "asc", nulls: "last" },
},
});
// => [20, 22, 31, 40, 55, null, null]
nulls の値動作
"first"null 値を先頭に配置
"last"null 値を末尾に配置

nulls を指定しない場合、asc では null が先頭に、desc では null が末尾に配置されます。

また、複数ソートの条件を指定することもでき、例えば

  • ageで昇順でソート
  • ageの値が同じ行があればその部分はnameの昇順でソート

といったことを行いたい場合コードは以下のようになります。

const gassma = new Gassma.GassmaClient();

// gassma.{{TARGET_SHEET_NAME}}.findMany
const result = gassma.sheet1.findMany({
where: {
age: {
gte: 20,
},
},
orderBy: [{ age: "asc" }, { name: "asc" }],
});

※ソートの優先順位はインデックス番号の若い順となります。

リレーションフィールドでのソート

リレーション定義がある場合、manyToOne / oneToOne のリレーション先フィールドでソートできます。

const gassma = new Gassma.GassmaClient({
relations: {
Posts: {
author: {
type: "manyToOne",
to: "Users",
field: "authorId",
reference: "id",
},
},
},
});

// 投稿を著者名の昇順でソート
const result = gassma.Posts.findMany({
orderBy: { author: { name: "asc" } },
});

FK が null のレコードは asc で先頭、desc で末尾に配置されます。

注意

oneToMany / manyToMany のリレーションではフィールドソートはできません。RelationOrderByUnsupportedTypeError がスローされます。

_count でのソート

oneToMany / manyToMany のリレーション件数でソートできます。

// 投稿数の多い順にユーザーをソート
const result = gassma.Users.findMany({
orderBy: { posts: { _count: "desc" } },
});

スカラーソートと組み合わせることもできます。

// 投稿数の降順 → 同数なら名前の昇順
const result = gassma.Users.findMany({
orderBy: [
{ posts: { _count: "desc" } },
{ name: "asc" },
],
});
注意

manyToOne / oneToOne のリレーションでは _count ソートはできません。RelationOrderByCountUnsupportedTypeError がスローされます。

take

取得数を指定できます。取得数はシートの上の行から順となります。

例えば条件に合致した行の中から上から 2 行を取得したい場合以下のようになります。

const gassma = new Gassma.GassmaClient();

// gassma.{{TARGET_SHEET_NAME}}.findMany
const result = gassma.sheet1.findMany({
where: {
age: {
gte: 20,
},
},
take: 2,
});

take に負数を指定した場合

take に負数を指定すると、末尾から N 件を取得します。

// 条件に合致した行の末尾 2 件を取得
const result = gassma.sheet1.findMany({
where: {
age: { gte: 20 },
},
take: -2,
});

take が負数の場合、skip の方向も逆転します。skip は末尾から除外する件数になります。

// 末尾 1 件を除外した後、残りの末尾 2 件を取得
const result = gassma.sheet1.findMany({
take: -2,
skip: 1,
});

skip

取得した行の中から特定行をスキップできます。

例えば条件に合致した行の中から上 1 つ目を省きたい場合、コードは以下のようになります。

const gassma = new Gassma.GassmaClient();

// gassma.{{TARGET_SHEET_NAME}}.findMany
const result = gassma.sheet1.findMany({
where: {
age: {
gte: 20,
},
},
skip: 1,
});
注意

skip に負数を指定すると GassmaSkipNegativeError がスローされます。

cursor

カーソルベースのページネーションを行えます。cursor にレコードを一意に特定するオブジェクトを指定すると、そのレコードを起点として取得します。

const gassma = new Gassma.GassmaClient();

// id: 3 のレコードを起点に、そこから 5 件取得
const result = gassma.sheet1.findMany({
cursor: { id: 3 },
take: 5,
});

take が正数の場合、cursor の位置から末尾方向に取得します。take が負数の場合、先頭から cursor の位置までを取得します。

// id: 3 を起点に、先頭方向のデータを取得
const result = gassma.sheet1.findMany({
cursor: { id: 3 },
take: -5,
});

skip と組み合わせると、cursor 位置からさらにスキップできます。

// id: 3 を起点に、1 件スキップして 5 件取得
const result = gassma.sheet1.findMany({
cursor: { id: 3 },
skip: 1,
take: 5,
});
注記

cursor に指定したレコードが見つからない場合は空配列が返されます。

処理順序

cursor を含む場合の実行順序は以下の通りです。

  1. where - フィルター
  2. orderBy - ソート
  3. distinct - 重複削除
  4. cursor - カーソル位置で切り出し
  5. skip / take - ページネーション
  6. select / omit - フィールド整形

omit

戻り値から特定の列を除外することができます。select の逆の動作です。

例えばpostNumberを除外したい場合は以下のようになります。

const gassma = new Gassma.GassmaClient();

// gassma.{{TARGET_SHEET_NAME}}.findMany
const result = gassma.sheet1.findMany({
where: {
pref: "Tokyo",
},
omit: {
postNumber: true,
},
});

戻り値は以下のようになります。

[
{ name: "sato", age: 31, pref: "Tokyo" },
{ name: "endo", age: 55, pref: "Tokyo" },
];
注意

selectomit は同時に使用できません。両方指定すると GassmaFindSelectOmitConflictError がスローされます。

グローバル omit を設定している場合、クエリの omit{ field: false } を指定することでグローバル omit を上書きできます。詳しくはクエリ omit でグローバル omit を上書きを参照してください。

distinct

列名を指定し、もし値が被っている場合その行を省略できます。被っている場合は上の行のデータが優先されます。

例えばageの被りを省略する場合、コードは以下のようになります。

const gassma = new Gassma.GassmaClient();

// gassma.{{TARGET_SHEET_NAME}}.findMany
const result = gassma.sheet1.findMany({
where: {
age: {
gte: 20,
},
},
distinct: ["age"],
});

include

リレーション定義がある場合、リレーション先のデータを一緒に取得できます。

詳しくはinclude のリファレンスを参照してください。