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

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

ただいまの
回答率

87.37%

複数の検索条件に応じて一致した文章を抽出する検索シートを作りたいです

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,056

score 8

前提・実現したいこと

GASを使って、テンプレ文章の検索シートを作りたいです。
まずスプレッドシートには2ページがあって、一つは「テンプレート検索用_new」(テンプレを検索するためのシート)もう一つは「テンプレ庫」(テンプレを格納しているシート)となります。
「テンプレ庫」では、A列に大分類、B列に中分類、C列に小分類を記入しており、それを使って検索をかける仕組みにしたいです。
「テンプレート検索用_new」では、C列に大分類のデータの入力規則リストがあり、それに応じて、D列及びE列は自動的に入力規則リストを作成します。
トリガーを使用して、検索リストが編集されるたびに特定のセールに検索条件と一致した文章を記入したいです。
テンプレではヘッダーやフッター、本文などに分けられているので、複数の文章を抽出し、順次に記入できれば幸いです。

発生している問題

テンプレ庫の分類に応じて、GASを使ったチェックリストの作成まではできていますが、肝心の所、大分類、中分類、小分類を使って一致した文章を抽出する方法が分かりませんので、質問させていただきました。

該当のソースコード

var SS = SpreadsheetApp.getActiveSpreadsheet(),
    SSsheet = SS.getActiveSheet(),
    targetsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("テンプレート検索用_new"),
    targetsheetname = targetsheet.getSheetName(),
    CheckDataList = SS.getSheetByName('テンプレ庫'),
    myCell = SSsheet.getActiveCell();

function procedure() {
  if(myCell.getColumn()==3){
  SetChecklistAccordingByBigClass();

  }
  else if(myCell.getColumn()==4) {

  SetChecklistAccordingByMidClass();

  }

  }
function SetChecklistAccordingByBigClass(){

if(SSsheet.getSheetName() == targetsheetname) {

    var BigRowNum = myCell.getRow(),
        BigClass_selected = myCell.getValue(),
        BigClassValues = CheckDataList.getRange("A:A").getValues(),
        MidClassValues1 = CheckDataList.getRange("B:B").getValues();

    var MatchDataList1 = new Array();
    for (var i = 0; i<BigClassValues.length; i++){
      if(BigClassValues[i] == BigClass_selected){
        if(MidClassValues1[i]!="") {

          MatchDataList1.push(MidClassValues1[i]);
  }
        else{
          var MatchDataList1=0 
  }
}

}

if(MatchDataList1 != 0){
var MidClassCheckBoxList = SpreadsheetApp.newDataValidation().requireValueInList(MatchDataList1,true).build();   //プルダウン形式の選択肢をmatchListにした入力規則を構築
SSsheet.getRange(BigRowNum, 4).setDataValidation(MidClassCheckBoxList);
}
}

}

function SetChecklistAccordingByMidClass(){

if(SSsheet.getSheetName() == targetsheetname) {

    var MidRowNum = myCell.getRow(),
        MidClass_selected = myCell.getValue(),
        MidClassValues2 = CheckDataList.getRange("B:B").getValues(),
        SmallClassValues = CheckDataList.getRange("C:C").getValues();

    var MatchDataList2 = new Array();
    for (var i = 0; i<MidClassValues2.length; i++){
      if(MidClassValues2[i] == MidClass_selected){
        if(SmallClassValues[i]!="") {

          MatchDataList2.push(SmallClassValues[i]);
  }
        else{
          var MatchDataList2=0 
  }
}

}

if(MatchDataList2 != 0){
var SmallClassCheckBoxList = SpreadsheetApp.newDataValidation().requireValueInList(MatchDataList2,true).build();   //プルダウン形式の選択肢をmatchListにした入力規則を構築
SSsheet.getRange(MidRowNum, 5).setDataValidation(SmallClassCheckBoxList);
}
}

}

補足

関数procedureの方に、PickArticleの関数を最後に執行させ、「テンプレート検索用_new」に選択された内容を抽出して、「テンプレ庫」の方に比較し、一致した文章を配列として保存し、併せて記入したいです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

myCell.getColumn()==5のときに、
var BigClass_selected = SSsheet.getRange(myCell.getRow(),3).getValue();
var MidClass_selected = SSsheet.getRange(myCell.getRow(),4).getValue();
var SmallClass_selected = SSsheet.getRange(myCell.getRow(),5).getValue();
として
for (var i = 0; i<BigClassValues.length; i++){
if(BigClassValues[i] == BigClass_selected&&MidClassValues[i] == MidClass_selected&&SmallClassValues[i] == SmallClass_selected){
BigClassValues[i]とMidClassValues[i]とSmallClassValues[i]を配列に格納して指定場所にsetValues
}
で良いんじゃないでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/16 23:51

    ご回答、ありがとうございます。
    可能であれば、シートを編集時にfunction procedureを起動し、自動的に文章を更新する形を取りたいです。
    ご回答を参考とし、自分なりに研究してみます。

    キャンセル

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

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る