スポンサーリンク

【pleasanter/VBA】エクスポート④絞り込み条件で〇〇を含むを指定する

プリザンター
スポンサーリンク
※当サイトは広告を含みます

エクセルVBAでプリザンターから情報取得、シリーズ。第4回です。
2023.7.24.条件の指定の仕方に間違いがありましたので、修正しています。

エクスポートするときに絞り込み条件を指定する、前回・前々回でやってきましたが、タイトルや説明項目、または分類項目で「〇〇を含む」で条件を指定する、というのをやってみたいと思います。
基本的に直接入力の説明項目やタイトル、選択肢ではない分類項目についてはなにも指定しないと「〇〇を含む」になるようです。それをより細かく完全一致や前方一致などもできるっぽいのでやってみました。
ただし、今回はやってみたらできたっぽいけどこれが正解かは不明です。よりよいやり方があればコメント等で教えていただけると助かります。
なお、VBAでのエクスポートのやり方、フィルター条件のやりかたは割愛しますので、前回、前々回の記事を参照してください。

※おことわり
2023年7月時点の情報です。プリザンターのバージョンは 1.3.20.0 です。Google Chrome でやっています。
javascript,html,cssともに初心者です。調べながら、やってみながら、きっとこうすればいいんだ!という感じで書いていますので、間違っている場合、効率的な書き方ではない可能性が大いにあります。間違ってるよ!とか、こうしたほうがいいよ!ということがありましたら、コメント等で教えていただけると大変ありがたいです。

1.参考にした記事

こちらの記事を参考にしてやってみました。
開発者向け機能:JSONデータレイアウト:View

ColumnFilterSearchTypesの指定方法
検索方法を指定します。タイトル、内容、説明、分類項目、の各項目の検索に利用できます。ColumnFilterHashと共に用います。

検索文字列を1つ指定
ColumnFilterHashに文字列を1つ指定し、ColumnFilterSearchTypesに検索方法を指定します。 “PartialMatch”(部分一致)、”ExactMatch”(完全一致)、”ForwardMatch”(前方一致)のいずれかの検索方法を指定できます。

複数の検索文字列を指定
ColumnFilterHashに文字列を配列で指定し、ColumnFilterSearchTypesに検索方法を指定します。 “PartialMatchMultiple”(部分一致)、”ExactMatchMultiple”(完全一致)、”ForwardMatchMultiple”(前方一致)のいずれかの検索方法を指定できます。ColumnFilterHashに指定した複数の文字列のいずれかとマッチするor条件となります。

引用元:https://pleasanter.org/manual/api-view

2.使用するサイト

前回と同じです

3.やってみた(~で始まるの例)

どうやら ColumnFilterHash で検索したい文字列を指定し、ColumnFilterSearchTypes で部分一致(PartialMatch)、完全一致(ExactMatch)、前方一致(ForwardMatch)のいずれかを指定すればよさそうです。

 jsonRequest.Add "View", New Dictionary
 jsonRequest("View").Add "ColumnFilterHash", New Dictionary
 jsonRequest("View")("ColumnFilterHash").Add "ClassB", "マ"
 jsonRequest("View").Add "ColumnFilterSearchTypes", New Dictionary
 jsonRequest("View")("ColumnFilterSearchTypes").Add "ClassB", "ForwardMatch"

3行目で分類Bの絞り込み条件に「マ」を指定しています。

4行目でディクショナリの View のキーとして ColumnFilterSearchTypes を追加し、その値には空のディクショナリを追加しています。

4行目で追加した ColumnFilterSearchTypes のディクショナリに キー:ClassB、値:ForwardMatch を追加しています。これは前方一致になります。
要するに、分類Bが「マ」で始まるデータを抽出するという指定をしています。

これで生成されるイメージは以下の感じ(あくまでもイメージ)

2023.7.24.ご指摘を受けて修正しました。修正前は
jsonRequest(“View”)(“ColumnFilterHash”).Add “ClassB”, “[“”マ””]”
としていたため、
jsonRequest(“View”)(“ColumnFilterSearchTypes”).Add “ClassB”, “ForwardMatch”
ではうまくいかず、”ForwardMatchMultipl“とすることで、目的を達成していました。
条件指定の“[“”マ””]” の [ ] が不要で、単純に “マ” にすることで正しく条件指定をすることができました。
間違った時点での記事を参照いただいた方、申し訳ございませんでした。
ご指摘いただいたHAYATOさま、ありがとうございました。

4.完全一致の例

タイトルが「タイトル100」と一致

jsonRequest.Add "View", New Dictionary
jsonRequest("View").Add "ColumnFilterHash", New Dictionary
jsonRequest("View")("ColumnFilterHash").Add "Title", "タイトル100"   jsonRequest("View").Add "ColumnFilterSearchTypes", New Dictionary
jsonRequest("View")("ColumnFilterSearchTypes").Add "Title", "ExactMatch"

5.部分一致の例

説明Aに「クレーム」を含む

jsonRequest.Add "View", New Dictionary
jsonRequest("View").Add "ColumnFilterHash", New Dictionary
jsonRequest("View")("ColumnFilterHash").Add "DescriptionA", "クレーム"
jsonRequest("View").Add "ColumnFilterSearchTypes", New Dictionary
jsonRequest("View")("ColumnFilterSearchTypes").Add "DescriptionA", "PartialMatch"

6.複数指定の例

(1)分類Bが「チョコレート」または「ガム」と一致
※分類Bには選択肢は設定していません。

jsonRequest.Add "View", New Dictionary
jsonRequest("View").Add "ColumnFilterHash", New Dictionary
jsonRequest("View")("ColumnFilterHash").Add "ClassB", "[""チョコレート"",""ガム""]"
jsonRequest("View").Add "ColumnFilterSearchTypes", New Dictionary
jsonRequest("View")("ColumnFilterSearchTypes").Add "ClassB", "ExactMatchMultiple"

(2)分類Bが「おやつ」または「餌」を含む
※分類Bには選択肢は設定していません。

jsonRequest.Add "View", New Dictionary
jsonRequest("View").Add "ColumnFilterHash", New Dictionary
jsonRequest("View")("ColumnFilterHash").Add "ClassB", "[""おやつ"",""餌""]"
jsonRequest("View").Add "ColumnFilterSearchTypes", New Dictionary
jsonRequest("View")("ColumnFilterSearchTypes").Add "ClassB", "PartialMatchMultiple"

7.まとめ

ちなみに、このような指定方法はタイトル、説明項目、分類項目で有効です。

分類項目では選択肢を指定している場合、前回、前々回にやったように ColumnFilterSearchTypes なしでもできます。しかし、分類項目でも選択肢を指定していない場合は、説明項目、タイトルと同様の扱いとなり ColumnFilterSearchTypes の指定が必要です。

分類項目で選択肢を設定している場合でも、○○を含む等を指定したいときは ColumnFilterSearchTypes の指定は有効となります。
なお、分類項目で選択肢を設定している場合、[]で囲まないとダメみたいです。

以下、選択肢を指定している分類C(選択肢:単品,セット)で「単」を含むでエクスポート。

jsonRequest.Add "View", New Dictionary
jsonRequest("View").Add "ColumnFilterHash", New Dictionary
jsonRequest("View")("ColumnFilterHash").Add "ClassC", "[""単""]"
jsonRequest("View").Add "ColumnFilterSearchTypes", New Dictionary
jsonRequest("View")("ColumnFilterSearchTypes").Add "ClassC", "PartialMatch"

8.コード全文

使用例を前後も含めてコード全文で

タイトルに「1」を含む、かつ、分類Bが「チョコレート」と一致
※分類Bは選択肢の設定なしです

Sub pleasanter_export5()
    Const myApikey As String = "12345abcde"      'ApiKey(ここは例です)
       
    Dim jsonRequest     As Dictionary
    Dim parseResponse   As Dictionary
    Dim httpRequest     As Object
    
    Set jsonRequest = New Dictionary
    
    jsonRequest.Add "ApiVersion", "1.1"
    jsonRequest.Add "ApiKey", myApikey
    
    '******* ここからフィルターを設定 ************
    jsonRequest.Add "View", New Dictionary
    jsonRequest("View").Add "ColumnFilterHash", New Dictionary
    jsonRequest("View")("ColumnFilterHash").Add "Title", "1"
    jsonRequest("View")("ColumnFilterHash").Add "ClassB", "チョコレート"
    jsonRequest("View").Add "ColumnFilterSearchTypes", New Dictionary
    jsonRequest("View")("ColumnFilterSearchTypes").Add "Title", "PartialMatch"
    jsonRequest("View")("ColumnFilterSearchTypes").Add "ClassB", "ExactMatch"
    '**************** ここまで *******************
    
    Set httpRequest = CreateObject("msxml2.xmlhttp")
    '426はサイトID(例です)
    httpRequest.Open "POST", "http://localhost/api/items/426/get"
    httpRequest.setRequestHeader "Content-Type", "application/json;charset=utf-8"
    
    httpRequest.send JsonConverter.ConvertToJson(jsonRequest)
    
    Do While httpRequest.readyState < 4
        DoEvents
    Loop

    Set parseResponse = JsonConverter.ParseJson(httpRequest.responseText)
    
    If parseResponse("Response")("Data").Count <= 0 Then
        MsgBox "なし"
        Exit Sub
    End If
    
    Dim responseData As Variant
    Dim i As Long: i = 2
    For Each responseData In parseResponse("Response")("Data")
        With ActiveSheet
            .Cells(i, 1).Value = responseData("Title")
            .Cells(i, 2).Value = responseData("ClassHash")("ClassA")
            .Cells(i, 3).Value = responseData("ClassHash")("ClassB")
            .Cells(i, 4).Value = responseData("ClassHash")("ClassC")

        End With
        i = i + 1
    Next

    MsgBox "出力完了"
End Sub

今回は以上となります。お読みいただきありがとうございました

プリザンザンターVBAエクスポートシリーズ
【pleasanter/VBA】エクセルからプリザンターのデータを取得する
【pleasanter/VBA】エクセルからプリザンターのデータを取得する②絞り込み条件の指定
【pleasanter/VBA】エクセルからプリザンターのデータを取得する③変数で絞り込み条件を指定する
【pleasanter/VBA】エクスポート④絞り込み条件で〇〇を含むを指定する(今回)
【pleasanter/VBA】エクスポート⑤並べ替え
【pleasanter/VBA】エクスポート⑥表示名を出したい
【pleasanter/VBA】エクスポート⑦データがちょん切れる時の対応 Offset
【pleasanter/VBA】エクスポート⑧出力される日付を文字列ではなく日付時刻型で出したい
【pleasanter/VBA】エクスポート⑨汎用ツールを作ってみた
【pleasanter/VBA】エクスポート⑩汎用ツール増強版

VBAでインポート
【pleasanter/VBA】エクセルからプリザンターへデータを追加、更新する~import~

コメント

タイトルとURLをコピーしました