web-dev-qa-db-ja.com

フィルター範囲でセル内ドロップダウンを作成

Googleスプレッドシートを使用しています。

問題を説明するために、A2:A8およびD2のデータ検証にE2の範囲を使用します。

enter image description here

しかし、セルD2では動物のみを選択することになっているので、B2:B8で範囲をフィルタリングしたいと思います。

私が試したのは、次のような独自の式を使用することです:

=FILTER(A2:A8;IS("B2:B8";"ANIMAL"))

しかし、これは機能せず、カスタム式を使用する場合は「ドロップダウン」オプションを選択できません。

範囲選択で数式を試しましたが、無効です。フィルターされたデータをドロップダウンするために使用する正しい式は何ですか?

何かご意見は?

18
rayfranco

現状では、Googleスプレッドシートでは、自然に(つまり、Google Appsスクリプトに頼らずに)ドロップダウンリストを作成する唯一の方法は、コンマ区切りリストを使用するか、範囲を参照することです。したがって、あなたの場合、フィルタリングされたリストを再現する必要がありますsomewhereスプレッドシート(​​非表示のシート上にある可能性があります):

=FILTER(A2:A8;B2:B8="ANIMAL")

次に、データ検証でその出力の範囲を参照します。

数式を使用してドロップダウンリストを直接生成する機能は強力な機能であり、多くの人から機能リクエストとして提出されています(同じことができます:ヘルプメニュー、問題の報告)。

19
AdamL

解決策があります Google Appsスクリプトの使用。

関連するすべてのメカニズムを説明するきちんとしたビデオ:

基本的に、ドロップダウンが依存するセル(たとえば、都市リストの国)を編集することにより、関連する "都市"セルに対して、検証データの範囲(可能な都市のリスト)が自動的に再計算されます。

使用できなくなった場合に備えて、ここにスクリプトをコピー/貼り付けます(使用されている例は、依存するドロップダウン用に車のメーカーとモデルを使用しています)。

function onEdit() {
  var tabLists = "lists";
  var tabValidation = "Main";
  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var datass = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(tabLists);

  var activeCell = ss.getActiveCell();

  if (activeCell.getColumn() == 1 && activeCell.getRow() > 1 && ss.getSheetName() == tabValidation){

    activeCell.offset(0, 1).clearContent().clearDataValidations();

    var makes = datass.getRange(1, 1, 1, datass.getLastColumn()).getValues();

    var makeIndex = makes[0].indexOf(activeCell.getValue()) + 1;

    if (makeIndex != 0){
        var validationRange = datass.getRange(3, makeIndex, datass.getLastRow());
        var validationRule = SpreadsheetApp.newDataValidation().requireValueInRange(validationRange).build();
        activeCell.offset(0, 1).setDataValidation(validationRule);
     }  
  }
}
1
Frosty Z

上記の回答に追加して、これを達成するためのいくつかの方法を提供します。

  • 範囲A:Bにピボットテーブルを作成し、ピボット行に「一部の値」を追加し(「合計の表示」オプションをオフにすることを忘れないでください)、フィルターに「動物」を追加し、フィルターを編集して動物のみを選択します。これにより、動物名のリストが作成されます。最後に、この列をデータ検証ルールの範囲として使用します。
  • 別のオプションは、クエリ式を使用して列を作成することです。例えば:

    = QUERY(A:B, "SELECT A WHERE B = 'ANIMAL'", 0)
    
=QUERY(A:B, "SELECT A WHERE B = 'ANIMAL'", 0)  

以前に与えられたクレジットよりも拡張性が高いことが証明される場合があります。

=QUERY(A:B, CONCATENATE("SELECT A WHERE B = '" , G3   "'", 0) )   

用途によっては十分に拡張可能であることが判明する場合があります。

0
Robin Hammond