実現したいこと
二つのテーブルがあります。
「基本情報」というテーブルには、下記の列があります。
・ID (text)
・姓 (text)
・名 (text)
・入所日 (date)
・退所日(date)
「重説」というテーブルには、下記の列があります。
・利用者ID (基本情報[ID]とref)
・姓 (text)
・名前 (text)
・日付 (date)
があります。
特定の期間内(開始日や終了日を入力して、自由に幅を設けれるようにしたい)に日付がない人たちのみを表示させたいです。
発生している問題・分からないこと
もう一つのテーブルとして「検索画面」を作成しました。
「検索画面」というテーブルには、下記の列があります。
・E-mail(userEmail)
・「開始日」
・「終了日」
・利用者ID
でアップデートのみできるテーブルを作成しました。
geminiやヘルプなどに確認して色々しているのですが、うまくいっていない状況です。
該当のソースコード
特になし
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
Gemini回答(1)
方法1: スライスとフィルターを使用する
User Settings の作成:
「基本情報」テーブルの View に表示するメッセージボックスで、期間の開始日と終了日を入力できるように User Settings を作成します。
User Settings の型は Date で、それぞれ StartDate と EndDate のような名前を付けます。
スライスの作成:
「基本情報」テーブルに基づいてスライスを作成します。
スライスの Row Filter Condition に以下の式を設定します。
AND(
[入所日] <= [EndDate],
OR(
ISBLANK([退所日]),
[退所日] >= [StartDate]
)
)
この式は、「入所日」が終了日以前で、「退所日」が空白または開始日以降であるレコードを抽出します。つまり、指定された期間に在籍している人を抽出します。
フィルターの作成:
スライスに基づいて、さらにフィルターを作成します。
フィルターの Row Filter Condition に以下の式を設定します。
NOT(
COUNT(
SELECT(
"重説",
AND(
[利用者ID] = [_THISROW].[ID],
[日付] >= [StartDate],
[日付] <= [EndDate]
)
)
) > 0
)
この式は、「重説」テーブルに、現在の行の ID ([_THISROW].[ID]) を持つレコードで、日付が指定された期間内にあるものが1つもない場合、つまり、指定された期間に重説の記録がない人を抽出します。
方法2: 仮想カラムとフィルターを使用する
User Settings の作成:
方法1と同様に、期間の開始日と終了日を入力できるように User Settings を作成します。
仮想カラムの作成:
「基本情報」テーブルに、以下の式を持つ仮想カラムを作成します (例えば、"重説期間内フラグ" という名前)。
COUNT(
SELECT(
"重説",
AND(
[利用者ID] = [ID],
[日付] >= [StartDate],
[日付] <= [EndDate]
)
)
) > 0
この式は、「重説」テーブルに、現在の行の ID を持つレコードで、日付が指定された期間内にあるものが1つ以上ある場合、つまり、指定された期間に重説の記録がある場合に TRUE を返します。
フィルターの作成:
「基本情報」テーブルの View にフィルターを作成します。
フィルターの Row Filter Condition に以下の式を設定します。
NOT([重説期間内フラグ])
この式は、仮想カラム "重説期間内フラグ" が FALSE であるレコード、つまり、指定された期間に重説の記録がない人を抽出します。
どちらの方法を選ぶか
どちらの方法でも同じ結果を得られますが、パフォーマンスや管理のしやすさを考慮すると、方法2 (仮想カラムとフィルター) の方がおすすめです。仮想カラムを使用することで、計算処理を一度だけ行い、それをフィルターで再利用できるため、パフォーマンスが向上します。
補足
上記の式では、テーブル名や列名を実際のアプリに合わせて変更してください。
User Settings の値を参照する際には、[StartDate] や [EndDate] のように、ブラケットで囲む必要があります。
フィルターの Row Filter Condition に設定する式は、TRUE または FALSE を返す必要があります。
上記の方法を参考に、AppSheet アプリで特定の期間に該当する日付がなかった人を抽出する機能を実現してみてください。
Gemini回答(2)
検索画面で指定した期間に重説の「日付」該当しない基本情報のIDを抽出する方法
AppSheetで、検索画面で指定した期間に重説の「日付」が該当しない基本情報のIDを抽出するには、いくつかの方法があります。ここでは、スライスとフィルターを使った方法を説明します。
手順
検索画面テーブルの準備:
「検索画面」テーブルに、「開始日」「終了日」の列(Date型)があることを確認します。
必要に応じて、他の検索条件となる列を追加します。
基本情報テーブルのスライスを作成:
「基本情報」テーブルを基に、新しいスライスを作成します。
スライスのフィルター条件として、以下の数式を設定します。
NOT(IN([ID], SELECT(重説[利用者ID], AND([日付] >= [検索画面].[開始日], [日付] <= [検索画面].[終了日]))))
- この数式は、以下の処理を行います。
SELECT(重説[利用者ID], AND([日付] >= [検索画面].[開始日], [日付] <= [検索画面].[終了日]))
: 「重説」テーブルから、検索画面で指定した期間内の「利用者ID」をリストとして取得します。IN([ID], ...)
: 「基本情報」テーブルの「ID」が、上記のリストに含まれているかどうかを判定します。NOT(IN([ID], ...))
: 「基本情報」テーブルの「ID」が、上記のリストに含まれていない場合(つまり、「重説」テーブルに該当するデータがない場合)にTRUEを返します。
Table Viewを作成:
作成したスライスを基に、Table Viewを作成します。
このTable Viewには、検索画面で指定した期間内に「重説」テーブルに該当するデータがない「基本情報」テーブルのデータのみが表示されます。
検索画面での操作:
「検索画面」テーブルのフォームを開き、「開始日」と「終了日」を入力します。
Table Viewに、検索条件に合致するデータが表示されます。
補足
上記の手順では、「検索画面」テーブルで指定した期間を直接参照しています。より柔軟な検索を行う場合は、「検索画面」テーブルのデータを参照する別の方法(例: ユーザー設定)を検討してください。
複数の検索条件を組み合わせる場合は、AND()やOR()などの論理演算子を使用してください。
数式にエラーがある場合は、意図した結果が得られない可能性があります。数式エディタでエラーを確認し、修正してください。
注意点
テーブルのデータ量が多い場合、数式の処理に時間がかかる場合があります。
数式は、AppSheetのバージョンによって利用できる関数や構文が異なる場合があります。
上記の手順で、AppSheetで検索画面で指定した期間に重説の「日付」が該当しない基本情報のIDを抽出できるはずです。もし問題が解決しない場合は、AppSheetのサポートドキュメントやコミュニティフォーラムなどを参照してください。
helpへの問い合わせ
検索画面テーブルに「重説テーブルの[日付]カラムが検索画面テーブルの[開始日]以前のもの、[終了日]以降のもの」を判定させるカラムを 1 つ追加します
※この時点では基本情報テーブルは干渉しません
追加したカラムの Formura に以下を追加します
例:OR(IN([利用者ID], SELECT(重説[利用者ID], [日付] <= [開始日])),IN([利用者ID], SELECT(重説[利用者ID], [日付] >= [終了日])))
その後基本情報テーブルから検索画面テーブルを参照する構成にし、1 で検索画面テーブルに作成した「開始日以前/終了日以降」のYes/No判定をするバーチャルカラムを基本情報テーブルに作成します
更にその後、該当のバーチャルカラムが Yes であるものを「未提出」と認識してフィルタリングするスライスを作成します
補足
特になし

回答1件
あなたの回答
tips
プレビュー