2016-04-18 21 views
1

私はダイヤミックドロップダウンリストに関するいくつかのガイダンスのためにstackoverflowを見てきました。しかし、ほとんどの場合、カテゴリヘッダーを作成し、その下の各ヘッダーの値を作成することに基づいているようです。最初のドロップダウンリストの選択に基づいて2番目の列にフィルターをかけたいので、その方法を自分の問題に合わせて調整するのが難しい別のセットアップがあります。 私は3つのデータ列を持っています(この問題では2つだけ必要です) 市区町村名、Eメール第1選択(グーグルシート)に基づいてフィルタリングされたドロップダウン

私は、同じ都市の多くの代表者を持っています。 例:

Boston   John Smith 
Atlanta   Chris Jones 
New York City Alan Chan 
Boston   Phillip Cho 
Boston   Sarah Fieler 
Atlanta   Eric Parks 

私はGoogleスプレッドシート内の2つのドロップダウンリストを作成しようとしています。最初のドロップダウンリストは、列全体を選択するだけなので簡単です。しかし、私は2列目に最初の列に基づいて値をフィルタリングしたいので、ボストンならばJohn Smith、Phillip Cho、Sarah Fielerのみを表示します。

これは可能ですか?どんな指導も高く評価されます。

EDIT Sergeの回答に更新情報を追加したいと考えました。 私はさらに一歩それを取るしたいと列全体の検証をリフレッシュしたくなかった、それを私が街を選択するたびに私は今、私は街の列を変更するたびに

var r = tSheet.getActiveCell(); 
    var nextCell = r.offset(0, 1); 
    var rule =SpreadsheetApp.newDataValidation().setAllowInvalid(true).requireValueInList(names).build(); 
    nextCell.setDataValidation(rule); 

を追加することで、スクリプトを修正ルールその隣のセルにのみ影響します。 うまくいえば、他の誰かがこれを使用していることがわかりました。ありがとうSerge

+0

私は、あなたはまた、最初のドロップダウンで重複を削除したくないと思いますか?また、単一のセルまたは列全体で有効にする必要がありますか? –

+0

データとドロップダウンリストは同じシートにありますか? –

+0

列全体のデータ検証を探しています。したがって、第1列の都市を選択すると、第2列の都市がフィルタリングされますが、これはスケジュールの一部なので、約20行が表示されます。また、私はコンタクトシートとスケジュールシートを持っています。スケジュールシートはコンタクトシートに対して検証されています。 – User125

答えて

2

以下は、あなたのシートでその動作を得るための完全な設定です。 カラムやシート名などの要件に合わせて設定する必要があると思われるいくつかの設定を前提としていました。

TriggerSetup機能は、オープンで実行する必要があり、セットアップに一度だけonEditトリガー

getCities()を実行する必要がありますまたはあなたが決めるときに更新する最初の検証が必要です。

私は小さなユーティリティを追加して配列内の重複を削除しましたが、重複なしで検証リストを作成する必要がありました。

function setupTrigger(){ 
    ScriptApp.newTrigger('onEditGetNames') 
    .forSpreadsheet(SpreadsheetApp.getActive()) 
    .onEdit() 
    .create(); 
} 

function onEditGetNames(){ 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var tSheet = ss.getActiveSheet(); 
    var col = ss.getActiveRange().getColumn(); 
    if(tSheet.getName()!='schedule' || col!=1){ // assuming city validation is in column A 
    Logger.log('wrong sheet or wrong column'); 
    return; 
    } 
    var cityMatch = tSheet.getActiveCell().getValue(); 
    var data = ss.getSheetByName('contacts').getRange('A2:B').getValues();//assuming names are in column B 
    var names = []; 
    for(var n in data){ 
    if(data[n][0] == cityMatch && data[n][1] != ''){ 
     names.push(data[n][1]); 
    } 
    } 
    names.sort(); 
    var tSheet = SpreadsheetApp.getActive().getSheetByName('schedule'); 
    var targetRange = tSheet.getRange('B2:B'); 
    targetRange.clearDataValidations(); 
    var rule = SpreadsheetApp.newDataValidation().setAllowInvalid(true).requireValueInList(names).build(); 
    targetRange.setDataValidation(rule); 
} 

function getCities(){ 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var data = ss.getSheetByName('contacts').getRange('A2:A').getValues();//assuming cities are in column A 
    var city = []; 
    for(var n in data){ 
    if(data[n][0] !=''){ 
     city.push(data[n][0]); 
    } 
    } 
    city.sort(); 
    var tSheet = SpreadsheetApp.getActive().getSheetByName('schedule'); 
    var targetRange = tSheet.getRange('A2:A'); 
    targetRange.clearDataValidations(); 
    var rule = SpreadsheetApp.newDataValidation().setAllowInvalid(true).requireValueInList(city).build(); 
    targetRange.setDataValidation(rule); 
} 

function removeDups(array){ 
    var data = array.slice(); 
    var outArray = []; 
    data.sort(
    function(x,y){ 
     var xp = x.toLowerCase(); 
     var yp = y.toLowerCase(); 
    return xp > yp ? 1 : xp < yp ? -1 : 0; 
    }); 
    outArray.push(data[0]); 
    for(var n=0;n<data.length-1;n++){ 
    if(data[n+1]!=data[n]){outArray.push(data[n+1])} 
    } 
    return outArray; 
} 

画面キャプチャ:

enter image description here enter image description here

+0

それは本当にうまくいっていて、とても有益でした。しかし、1つのキャッチがあるようです。都市が最初の列で選択されるたびに、2番目の列の検証内容が変更され、すべての以前のレコードが無効になります。例えば、 です。スクリーンショットで、もし私がアトランタに戻って、エリックパークを選びたければ、私はボストンの人々だけを見るでしょう。これを回避する方法はありますか?また、ありがとうございました。 – User125

+0

都市に基づいて新しい検証ルールを作成したかったので、これは正常です。とにかく、視覚的な警告が出るだけです。 –

+0

前のエントリを変更するには、最初に都市を削除してからそれを再選択して、名前の正しい検証を取得する必要があります –

関連する問題