質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.33%
AppSheet

AppSheetは、ノーコードでアプリ開発ができるプラットフォーム。プログラミングの知識がなくても、マウス操作だけで簡単にアプリを開発できます。サードパーティサービスに標準で接続できる他、サンプルアプリケーションも豊富。料金がリーズナブルな点も特徴です。

Q&A

解決済

1回答

112閲覧

Appsheetで特定の期間に該当するデータがないデータのみ抽出したい

sloth824

総合スコア3

AppSheet

AppSheetは、ノーコードでアプリ開発ができるプラットフォーム。プログラミングの知識がなくても、マウス操作だけで簡単にアプリを開発できます。サードパーティサービスに標準で接続できる他、サンプルアプリケーションも豊富。料金がリーズナブルな点も特徴です。

0グッド

0クリップ

投稿2025/02/12 02:14

実現したいこと

二つのテーブルがあります。
「基本情報」というテーブルには、下記の列があります。
・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 であるものを「未提出」と認識してフィルタリングするスライスを作成します

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2025/02/13 07:52

> geminiやヘルプなどに確認して色々しているのですが、うまくいっていない状況です。 どこでどううまくいっていないのか具体的に示した方がよいですよ。現状の質問内容ではどこが分からなくて止まっているのか読んでいる閲覧者には分かりません。 また、具体的に値を示して、どういう値を入力をしたらどういう出力(表示)になるか、とか。 ※Google AppSheetをやっている方は少ないと思われるので、必ずしも回答を得られるとは限りませんが。
sloth824

2025/02/13 23:56

ありがとうございます。 Table slice '重説未提出者' uses an invalid filter condition '=NOT(IN([ID], SELECT(重説[利用者ID], AND([日付] >= [検索画面].[開始日], [日付] <= [検索画面].[終了日]))))'. Unable to find column '検索画面', did you mean 'ID'?など、が表示される状況です。
dodox86

2025/02/14 00:08

質問文中に示された「Gemini回答(2)」を採用して試した、と言うことでしょうか。本当の解決には至っていなくても代替策で一応解決して満足されたのであれば、ご自身で自己解決、ベストアンサーで質問を閉じることができます。ご自身で考えて代替策で解決させるのも、立派な解決です。
sloth824

2025/02/14 00:12 編集

ありがとうございます。 そうしましたら、そのようにさせていただきます。
guest

回答1

0

自己解決

本当の解決にはなっていませんが…

query関数で必要で該当するデータを抽出したシートをテーブルとして追加することで解決しました。

投稿2025/02/14 00:02

sloth824

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.33%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問